chronic constipation symptoms
Sponsored Links
Sponsored Links
Secleted [ 0 ] software to compare
Results 1 - 15 of about 15
Constipation Relief 1
Constipation relief on demand. Poopdoc is a natural home remedy for constipation; a treatment and cure for chronic constipation symptoms. Oxygenated c... more>> <<less
Download (41KB)
Added: 2009-04-11 License: Freeware Price: Free
197 downloads
Causes and Symptoms 2007-08-14
Causes and Symptoms program helps you deduce the causes causes of your medical symptoms. more>>
Causes and Symptoms program helps you deduce the causes causes of your medical symptoms that may be related to nutritional deficiencies.
<<less Download (0.20MB)
Added: 2007-08-21 License: Public Domain Price:
794 downloads
The Hunted Chronicle 2
The Hunted is a single player FPS game based off of the Darkplaces engine. more>>
The Hunted is a single player FPS game based off of the Darkplaces engine. It is completely standalone, meaning that you do not need any prior files to run it, and it comes in a series called chronicles.
These chronicles are used for having a continuously flowing story and a difference in weaponry and in other things found in-game.
Each chronicle tells the story of a lone survivor escaping the city that has been overcome by the infected.
The symptoms of the infected at the time of the survivors adventure are not clear but as the chronicles are released, the story unfolds to make it quite clear as to why, where, when, and how this survivor came to be in a horror show such as this.
Main features:
- Completely recreated zombie and zombie code. Much more "realistic" in attack, range, and response time.
- Added random skin generator so zombies will be wearing different attire no matter how many times you play a map
- Added "Use" key, used to pick up boxes and move them to get to previously unattainable areas
- Added "story driven comics" used to help further the story and gives hints on puzzles
- Added all new weapon models
- Added fully functionable "secondary attack" (zoom with Mercs Gun, large swing with meathook)
- Added zombie footsteps
- FIXED**bug where zombies faking dead on ground would still block a players way
- FIXED**HUD/glock-pistol ammo malfunctions
- Added place_model attributes to have spatialization options and other effects to create global audio ambience and better effects using DarkPlaces extensions
- Added muzzleflash
- Added flashlight
- Added multiple new enemies
<<lessThese chronicles are used for having a continuously flowing story and a difference in weaponry and in other things found in-game.
Each chronicle tells the story of a lone survivor escaping the city that has been overcome by the infected.
The symptoms of the infected at the time of the survivors adventure are not clear but as the chronicles are released, the story unfolds to make it quite clear as to why, where, when, and how this survivor came to be in a horror show such as this.
Main features:
- Completely recreated zombie and zombie code. Much more "realistic" in attack, range, and response time.
- Added random skin generator so zombies will be wearing different attire no matter how many times you play a map
- Added "Use" key, used to pick up boxes and move them to get to previously unattainable areas
- Added "story driven comics" used to help further the story and gives hints on puzzles
- Added all new weapon models
- Added fully functionable "secondary attack" (zoom with Mercs Gun, large swing with meathook)
- Added zombie footsteps
- FIXED**bug where zombies faking dead on ground would still block a players way
- FIXED**HUD/glock-pistol ammo malfunctions
- Added place_model attributes to have spatialization options and other effects to create global audio ambience and better effects using DarkPlaces extensions
- Added muzzleflash
- Added flashlight
- Added multiple new enemies
Download (MB)
Added: 2005-09-19 License: Freeware Price:
1527 downloads
Hackystat 7.6.1223
Hackystat is a framework for the automated collection and analysis of software. more>>
Hackystat is a framework for the automated collection and analysis of software engineering product and process data.
Hackystat uses sensors to unobtrusively collect data from development environment tools; there is no chronic overhead on developers to collect product and process data. Hackystat does not tie you to a particular tool, environment, process, or application.
Hackystat project is intended to provide in-process project management support.
Hackystat is in its sixth major architectural release family. The first architectural release family, called the "Spike Solution", was used to explore the feasibility of the approach and to evaluate various component technologies (including JATO, XSL, Ant, JUnit/HttpUnit, Tomcat, Cocoon, and SOAP). Work on this Spike Solution architecture lasted eight months, from May to December, 2001.
In December 2001, we began a major re-implementation of the system in order to provide architectural support for design discoveries made with the Spike Solution. This second architectural release family is called the "Framework Architecture", because it implements package and class-level patterns that facilitate extension of the system via inheritance and composition of existing classes. Unfortunately, the Framework architecture required modification of the hackystat source code to implement new sensors and analysis, and only a single configuration of analyses and sensors can be supported in this architecture.
In November, 2002, we began work on the "SDK" (or "kernelized") architecture release family. This third architectural family decomposes the system into two layers. The first layer is a kernel system which implements the core facilities for data definition, storage, transmission and user interface.
Developers build an actual Hackystat installation by combining the framework with a second layer: a set of plug-in extension modules that define the specific sensor data types, tool sensors, and analyses required to support their development procedures. In the SDK architecture, developers can implement new sensors and analyses without modifying the underlying kernel code, and multiple Hackystat installations can be built with different configurations of analyses and sensors.
In June, 2003, we performed a package restructuring that facilitates the development of third layer, or "application" layer systems. This is the fourth architectural release family, called the "Three Layer" architecture.
After only a month of application layer development, we realized that the build process we developed for the second release family would be woefully inadequate to support the three layer architecture, in which multiple components would be combined into a configuration for release.
So, in August, 2003, we released the fifth architectural release family, called the "Component Architecture", along with extensive new build support including the hackydev web site with daily integration builds.
In July, 2004, we released the sixth architectural family, which provides services to support a "telemetry" based approach to software project monitoring and control. This includes various caching mechanisms, as well as the hackyTelemetry package that includes a telemetry specification language and associated APIs. In this architecture, telemetry support becomes a "low level" feature of the system.
Enhancements:
- A new sensor for IntelliJ Idea, enhancements to the Visual Studio sensor, improved support for test driven development inference, and many bugfixes.
<<lessHackystat uses sensors to unobtrusively collect data from development environment tools; there is no chronic overhead on developers to collect product and process data. Hackystat does not tie you to a particular tool, environment, process, or application.
Hackystat project is intended to provide in-process project management support.
Hackystat is in its sixth major architectural release family. The first architectural release family, called the "Spike Solution", was used to explore the feasibility of the approach and to evaluate various component technologies (including JATO, XSL, Ant, JUnit/HttpUnit, Tomcat, Cocoon, and SOAP). Work on this Spike Solution architecture lasted eight months, from May to December, 2001.
In December 2001, we began a major re-implementation of the system in order to provide architectural support for design discoveries made with the Spike Solution. This second architectural release family is called the "Framework Architecture", because it implements package and class-level patterns that facilitate extension of the system via inheritance and composition of existing classes. Unfortunately, the Framework architecture required modification of the hackystat source code to implement new sensors and analysis, and only a single configuration of analyses and sensors can be supported in this architecture.
In November, 2002, we began work on the "SDK" (or "kernelized") architecture release family. This third architectural family decomposes the system into two layers. The first layer is a kernel system which implements the core facilities for data definition, storage, transmission and user interface.
Developers build an actual Hackystat installation by combining the framework with a second layer: a set of plug-in extension modules that define the specific sensor data types, tool sensors, and analyses required to support their development procedures. In the SDK architecture, developers can implement new sensors and analyses without modifying the underlying kernel code, and multiple Hackystat installations can be built with different configurations of analyses and sensors.
In June, 2003, we performed a package restructuring that facilitates the development of third layer, or "application" layer systems. This is the fourth architectural release family, called the "Three Layer" architecture.
After only a month of application layer development, we realized that the build process we developed for the second release family would be woefully inadequate to support the three layer architecture, in which multiple components would be combined into a configuration for release.
So, in August, 2003, we released the fifth architectural release family, called the "Component Architecture", along with extensive new build support including the hackydev web site with daily integration builds.
In July, 2004, we released the sixth architectural family, which provides services to support a "telemetry" based approach to software project monitoring and control. This includes various caching mechanisms, as well as the hackyTelemetry package that includes a telemetry specification language and associated APIs. In this architecture, telemetry support becomes a "low level" feature of the system.
Enhancements:
- A new sensor for IntelliJ Idea, enhancements to the Visual Studio sensor, improved support for test driven development inference, and many bugfixes.
Download (40MB)
Added: 2006-12-24 License: GPL (GNU General Public License) Price:
1034 downloads
Jitterbit 1.2.3
Jitterbit is an open source integration tool that delivers a quick and easy way to design, configure, test integration solutions more>>
Jitterbit is an open source integration tool that delivers a quick and easy way to configure, design, deploy, and test integration solutions. It supports most standards-based protocols, including Web Services (SOAP), XML, and connectivity to popular databases.
Jitterbit is designed with ease-of-use in mind. You can download the suite for Linux or Windows in minutes. Once installed, you can quickly build and run complex integration processes without development efforts and take advantage of support from the Jitterbit open source community.
Jitterbit tools let you point-and-click to configure all aspects of an Integration:
- Define integration operations including source and target systems
- Create document definitions, from simple flat file structures (e.g. comma delimited) to complex hierarchic files structures.
- Use a drag-and-drop mapping tool to transform data between your various system interfaces.
- Set schedules, create success and failure events and track the results for your integration operations.
Enhancements:
- Fixed bug 1757864: insert/update fails if target key value contains () or (). (2007-07-20)
- Fixed the bug that the xml node to be created should not containing the order marker (@1, @2...) in the name. (2007-07-19)
- Add data type "float4" as t_float to the data type map. (2007-07-19)
- Fixed the problem of "< null >" string in the internal file for flat database. Symptom was that "< null >" would show up in the target, and that IsNull() would return false even when the source was null. (2007-07-16)
- Fixed the problem in the swapping of db columns for single table db to hierarchical transformation. (2007-07-14)
<<lessJitterbit is designed with ease-of-use in mind. You can download the suite for Linux or Windows in minutes. Once installed, you can quickly build and run complex integration processes without development efforts and take advantage of support from the Jitterbit open source community.
Jitterbit tools let you point-and-click to configure all aspects of an Integration:
- Define integration operations including source and target systems
- Create document definitions, from simple flat file structures (e.g. comma delimited) to complex hierarchic files structures.
- Use a drag-and-drop mapping tool to transform data between your various system interfaces.
- Set schedules, create success and failure events and track the results for your integration operations.
Enhancements:
- Fixed bug 1757864: insert/update fails if target key value contains () or (). (2007-07-20)
- Fixed the bug that the xml node to be created should not containing the order marker (@1, @2...) in the name. (2007-07-19)
- Add data type "float4" as t_float to the data type map. (2007-07-19)
- Fixed the problem of "< null >" string in the internal file for flat database. Symptom was that "< null >" would show up in the target, and that IsNull() would return false even when the source was null. (2007-07-16)
- Fixed the problem in the swapping of db columns for single table db to hierarchical transformation. (2007-07-14)
Download (11.5MB)
Added: 2007-07-28 License: MPL (Mozilla Public License) Price:
821 downloads
AxKit2::Transformer::XSP 1.1
AxKit2::Transformer::XSP Perl module contains eXtensible Server Pages. more>>
AxKit2::Transformer::XSP Perl module contains eXtensible Server Pages.
SYNOPSIS
< xsp:page
xmlns:xsp="http://apache.org/xsp/core/v1" >
< xsp:structure >
< xsp:import >Time::Piece< /xsp:import >
< /xsp:structure >
< page >
< title >XSP Test< /title >
< para >
Hello World!
< /para >
< para >
Good
< xsp:logic >
if (localtime->hour >= 12) {
< xsp:content >Afternoon< /xsp:content >
}
else {
< xsp:content >Morning< /xsp:content >
}
< /xsp:logic >
< /para >
< /page >
< /xsp:page >
XSP implements a tag-based dynamic language that allows you to develop your own tags, examples include sendmail and sql taglibs. It is AxKits way of providing an environment for dynamic pages. XSP is originally part of the Apache Cocoon project, and so you will see some Apache namespaces used in XSP.
Also, use only one XSP processor in a pipeline. XSP is powerful enough that you should only need one stage, and this implementation allows only one stage. If you have two XSP processors, perhaps in a pipeline that looks like:
... => XSP => XSLT => XSLT => XSP => ...
it is pretty likely that the functionality of the intermediate XSLT stages can be factored in to either upstream or downstream XSLT:
... => XSLT => XSP => XSLT => ...
This design is likely to lead to a clearer and more maintainable implementation, if only because generating code, especially embedded Perl code, in one XSP processor and consuming it in another is often confusing and even more often a symptom of misdesign.
Likewise, you may want to lean towards using Perl taglib modules instead of upstream XSLT "LogicSheets". Upstream XSLT LogicSheets work fine, mind you, but using Perl taglib modules results in a simpler pipeline, simpler configuration (just load the taglib modules in httpd.conf, no need to have the correct LogicSheet XSLT page included whereever you need that taglib), a more flexible coding environment, the ability to pretest your taglibs before installing them on a server, and better isolation of interface (the taglib API) and implementation (the Perl module behind it). LogicSheets work, and can be useful, but are often the long way home. That said, people used to the Cocoon environment may prefer them.
Result Code
You can specify the result code of the request in two ways. Both actions go inside a < xsp:logic > tag.
If you want to completely abort the current request, throw an exception:
throw Apache::AxKit::Exception::Retval(return_code => FORBIDDEN);
If you want to send your page but have a custom result code, return it:
return FORBIDDEN;
In that case, only the part of the document that was processed so far gets sent/processed further.
Debugging
If you have PerlTidy installed (get it from http://perltidy.sourceforge.net), the compiled XSP scripts can be formatted nicely to spot errors easier. Enable AxDebugTidy for this, but be warned that reformatting is quite slow, it can take 20 seconds or more on each XSP run for large scripts.
If you enable AxTraceIntermediate, your script will be dumped alongside the other intermediate files, with an extension of ".XSP". These are unnumbered, thus only get one dump per request. If you have more than one XSP run in a single request, the last one will overwrite the dumps of earlier runs.
<<lessSYNOPSIS
< xsp:page
xmlns:xsp="http://apache.org/xsp/core/v1" >
< xsp:structure >
< xsp:import >Time::Piece< /xsp:import >
< /xsp:structure >
< page >
< title >XSP Test< /title >
< para >
Hello World!
< /para >
< para >
Good
< xsp:logic >
if (localtime->hour >= 12) {
< xsp:content >Afternoon< /xsp:content >
}
else {
< xsp:content >Morning< /xsp:content >
}
< /xsp:logic >
< /para >
< /page >
< /xsp:page >
XSP implements a tag-based dynamic language that allows you to develop your own tags, examples include sendmail and sql taglibs. It is AxKits way of providing an environment for dynamic pages. XSP is originally part of the Apache Cocoon project, and so you will see some Apache namespaces used in XSP.
Also, use only one XSP processor in a pipeline. XSP is powerful enough that you should only need one stage, and this implementation allows only one stage. If you have two XSP processors, perhaps in a pipeline that looks like:
... => XSP => XSLT => XSLT => XSP => ...
it is pretty likely that the functionality of the intermediate XSLT stages can be factored in to either upstream or downstream XSLT:
... => XSLT => XSP => XSLT => ...
This design is likely to lead to a clearer and more maintainable implementation, if only because generating code, especially embedded Perl code, in one XSP processor and consuming it in another is often confusing and even more often a symptom of misdesign.
Likewise, you may want to lean towards using Perl taglib modules instead of upstream XSLT "LogicSheets". Upstream XSLT LogicSheets work fine, mind you, but using Perl taglib modules results in a simpler pipeline, simpler configuration (just load the taglib modules in httpd.conf, no need to have the correct LogicSheet XSLT page included whereever you need that taglib), a more flexible coding environment, the ability to pretest your taglibs before installing them on a server, and better isolation of interface (the taglib API) and implementation (the Perl module behind it). LogicSheets work, and can be useful, but are often the long way home. That said, people used to the Cocoon environment may prefer them.
Result Code
You can specify the result code of the request in two ways. Both actions go inside a < xsp:logic > tag.
If you want to completely abort the current request, throw an exception:
throw Apache::AxKit::Exception::Retval(return_code => FORBIDDEN);
If you want to send your page but have a custom result code, return it:
return FORBIDDEN;
In that case, only the part of the document that was processed so far gets sent/processed further.
Debugging
If you have PerlTidy installed (get it from http://perltidy.sourceforge.net), the compiled XSP scripts can be formatted nicely to spot errors easier. Enable AxDebugTidy for this, but be warned that reformatting is quite slow, it can take 20 seconds or more on each XSP run for large scripts.
If you enable AxTraceIntermediate, your script will be dumped alongside the other intermediate files, with an extension of ".XSP". These are unnumbered, thus only get one dump per request. If you have more than one XSP run in a single request, the last one will overwrite the dumps of earlier runs.
Download (0.63MB)
Added: 2007-07-30 License: Perl Artistic License Price:
816 downloads
monq.jfa 1.1.1
monq.jfa is a class library for fast and flexible text filtering with regular expressions. more>>
monq.jfa is the core Java class library used to implement Whatizit. The project allows for fast and flexible text filtering with regular expressions.
In contrast to java.util.regex, monq.jfa allows to bind a regular expression to an action that is automatically called whenever a match is spotted in an input stream.
In addition it is possible to combine several tenthousand regex/action pairs into one machinery (called DFA).
The DFA filters input to output by looking for matches of all regular expressions in parallel, calling their actions to reformat the text or to incrementally built up a data structure.
The filtering speed is 1.5MB/s on P4 2.6GHz and is mostly unrelated to the number of regex/action pairs.
Enhancements:
- This is a bugfix release to correct improper unsynchronized reuse of an object within monq.jfa.actions.Printf.
- The user visible symptom would be garbled output.
<<lessIn contrast to java.util.regex, monq.jfa allows to bind a regular expression to an action that is automatically called whenever a match is spotted in an input stream.
In addition it is possible to combine several tenthousand regex/action pairs into one machinery (called DFA).
The DFA filters input to output by looking for matches of all regular expressions in parallel, calling their actions to reformat the text or to incrementally built up a data structure.
The filtering speed is 1.5MB/s on P4 2.6GHz and is mostly unrelated to the number of regex/action pairs.
Enhancements:
- This is a bugfix release to correct improper unsynchronized reuse of an object within monq.jfa.actions.Printf.
- The user visible symptom would be garbled output.
Download (0.21MB)
Added: 2007-06-24 License: GPL (GNU General Public License) Price:
853 downloads
Fenris 0.07-m2 build 3245
Fenris is a multipurpose tracer, debugger, and code analysis tool. more>>
Fenris is a suite of tools suitable for code analysis, debugging, protocol analysis, reverse engineering, forensics, diagnostics, security audits, vulnerability research and many other purposes.
The main logical components are:
- Fenris: high-level tracer, a tool that detects the logic used in C programs to find and classify functions, logic program structure, calls, buffers, interaction with system and libraries, I/O and many other structures. Fenris is mostly a "whats inside" tracer, as opposed to ltrace or strace, tracers intended to inspect external "symptoms" of the internal program structure. Fenris does not depend on libbfd for accessing ELF structures, and thus is much more robust when dealing with "anti-debugging" code.
- libfnprints and dress: fingerprinting code that can be used to detect library functions embedded inside a static application, even without symbols, to make code analysis simplier; this functionality is both embedded in other components and available as a standalone tool that adds symtab to ELF binaries and can be used with any debugger or disassembler.
- Aegir: an interactive gdb-alike debugger with modular capabilities, instruction by instruction and breakpoint to breakpoint execution, and real-time access to all the goods offered by Fenris, such as high-level information about memory objects or logical code structure.
- nc-aegir: a SoftICE-alike GUI for Aegir, with automatic register, memory and code views, integrated Fenris output, and automatic Fenris control (now under development).
- Ragnarok: a visualisation tool for Fenris that delivers browsable information about many different aspects of program execution - code flow, function calls, memory object life, I/O, etc (to be redesigned using OpenDX or a similar data exploration interface).
- ...and some other companion utilities.
Code analysis is not limited to debugging, quality assurance or security audits. Understanding and handling file formats or communication protocols used by proprietary solutions, a problem that many corporations face when they decide to change their base software platform from one, obsolete or insufficient solution to another, perhaps more suitable, is a task that can consume long months and millions of dollars, especially when any misjudgment or misinterpretation is made.
Because of that, accurate and complete information about existing solutions has to be obtained and evaluated in a timely manner. This project is an attempt to fill the gap between currently used tools by providing a freely available program analysis utility, suitable for black-box code audits, algorithm analysis,
rapid reconnaissance in open-source projects, tracking down bugs, evaluating security subsystems, performing computer forensics, etc.
This program does not automate the process of auditing, and does not favor any particular use. Instead of that, it is intended to be a flexible and universal application that will be a valuable solution for many advanced users. While functional, it is probably not tested sufficiently, there are many issues to fix, several known bugs, some portability problems.
It is being released primarily to get user feedback, comments, and, most important, to request development support, as my resources are very limited, both in terms of available time and development platforms. This project is and will be distributed as a free software, regardless of projected use, accompanied by complete sources, under the terms and
conditions of GPL. Why do you might need this code? Well, there are few reasons...
Human beings are, so far, the best code analysts. Unlike computer programs, they have imagination, ability to build synthetic abstract models, and yet to observe and analyze smallest details at the same time. Functionality is often being described as "doing what the program is supposed to do", security as "doing what the program is supposed to do and
nothing more". While it might sound funny, that is the most general and complete definition we have. In most real-life scenarios only humans really know what are their expectations. Building strict formal models of our expectations does not necessarily mean that models themselves are flawless, and is very time-consuming. Then, even with such models,
validating the code is not always possible, due to its computational complexity. That is why real, live programs (not including some critical developments) do not have such models, do not follow any particular coding guidelines, and cannot be formally examined without human judgment.
Unfortunately, humans are also highly inaccurate and very expensive. They work slowly, and better results can be achieved by hiring better specialists and performing more careful audit. And after all, even the best expert can overlook something in complex, hard to read code. It is almost impossible for human to perform an accurate audit of a large, complex, heterogeneous project written e.g. in C - like Sendmail, BIND, Apache - and provide results in reasonable time.
Things get even worse when humans try to understand algorithms and protocols used by complex closed-source black box solutions. They are simply too slow, and not always able to make accurate guesses about dozens of complicated, conditional parameter passes and function calls before final action is taken.
While it might sound surprising, human-driven code audit is very similar to playing chess - it is a general analysis of possible states, way too many to be implicitly projected by our conscience, a result of experience, knowledge, some unparalleled capabilities of human brain, and luck. It is also a subject to false moves and misjudgment. And there are maybe just a few hundred excellent players.
As for today, freely and commercially available audit tools both use two opposite approaches. First approach tends to minimize human role by automating the review of source code. Source code analysis methods are good in spotting known, repeatable static errors in the code - such as format string vulnerabilities. On the other hand, static tools are not able to trace and analyze all possible execution paths of complex application by
simply looking at its source.
The reason for inability to follow all execution paths lies deeply in the foundations of modern computation theory, and one of its aspects is known as "the halting problem". Speaking in more general terms, in many cases (such as complex software, or even underlying operating system), the amount of medium needed to store all possible states of a complex program exceeds significantly the number of particles in the
universe; and the amount of time needed to generate and process them sequentially is greater than the lifetime of our universe, even having a machine that works with the speed of light.
This might be changed by the development of new computation models, such as quantum computing, or by creating mathematical models that allow us to make such problems non-polynomial - but for now, we are far from this point, and static analysis is restrained in many very serious ways, even though many software suppliers tend to market their products as the ultimate, 100% solutions. Subtle, complex, conditional dynamic errors, such as privilege dropping problems, input-dependent table overflows in C and many other issues usually cannot be detected without generating a completely unacceptable number of false positives.
This kind of software is highly dependent on coding style, and specific notation or development practices might render them less efficient - for example, automated audit utilities can usually detect problems like insecure call to strcpy() function, but will very likely not notice insecure manual copy in do-while
loop. The truth is, for programs that do not have previously built formal models, static auditing utilities look for known, common problems in known, common types of code in a very limited scope.
Another issue is the applicability of this approach to algorithm analysis tasks. In the domain of automated audit tools, this problem is "reduced" to building a formal model of program behavior, or, more appropriately, generating certain predictive statements about the code. While there are very interesting developments in this direction, such as the work of professor Patrick Cousot, it is very difficult to make any detailed, accurate and abstract enough run-time predictions for complex source code that has any immediate value in the analysis of unknown algorithm.
Last but not least, static analysis of sources can be deployed only when the source code is available, which does not have to be the case. This approach is a subject to many shortcomings, tricky assertions, and is a technique of strictly limited capabilities. This is, of course, not to dismiss this method - but to demonstrate that this much favored approach is not flawless and how much it needs to be accompanied with auxiliary methods.
The second approach to be discussed here is based on a dynamic run-time program analysis. This method is usually used to provide the user with information about actual program execution path, letting him make decisions on which path to follow and giving him free will to draw any conclusions and perform all the synthetic reasoning.
This method is
applied to a live binary executed in real-time and is based on monitoring syscalls (strace), libcalls (ltrace) or functions (xtrace); in certain cases, breakpoint debuggers, such as gdb, can be used, however it is usually not feasible to use them to perform anything more than in-depth analysis of a very small portion of program functionality. Usually, such analysis provides a very useful information on what is happening, and this information is provided in uniform, reduced-output form.
A careful auditor can analyze program behavior and find interesting or potentially dangerous run-time conditions. By monitoring how a given application interacts with external world, he (or she) can determine whether some other
conditions can be triggered and eventually explore them by examining sources or re-running the program. Advantages are enormous, as such software enables the auditor to spot very subtle errors in code that "looked good", to observe actual execution, not to try to figure it out, and to find or trace down not obvious or non-schematic vulnerabilities. Run-time trace tools are primarily used for fast reconnaissance tasks and for tracing down notorious errors that are not clearly visible in the source, significantly reducing the time of such operations.
There are, however, serious drawbacks related to this method. First of all, known tracing tools do not provide the complete information. They will detect strcpy() call, but wont report if exactly the same functionality has been implemented from scratch by the author of given program. And, in some cases, the amount of produced data
can be enormous, and because of its completely unstructured character, it makes the observation of overall execution vector almost impossible. Two most important problems are: correlating trace data with actual code, and determining what occurred in the "dark matter" between two lines of trace output.
There are some attempts to combine both approaches - run-time evaluation and source code analysis - such as Purify or many other commercial development support products. Unfortunately, they all feature a limited set of capabilities that need development-side or compilation-time support and are not really suitable for comprehending black box solutions or performing a general analysis. Most of them are targeted for dynamic memory debugging and code / memory profiling.
While not mentioned above, there is also another approach to black-box code - high-level decompiler. However, the complexity of modern compilers makes it very difficult to develop an effective C decompiler or similar utility, and there are only a few (two?) projects available to accomplish it, all of them not able to deal with too complex or optimized code. Finally, there is no guarantee that generated output code will be any help in comprehending the program. For now, this approach remains almost purely theoretical,
and I am not aware of any auditors using it extensively. Why? Well, heres an example of decompiled, mildly optimized code *with* some symbolic information: http://www.backerstreet.com/rec/ex386/hdgO.rec . One may argue it is less readable than cross-referenced disassembly.
This project, Fenris, is named after the monstrous wolf, son of the Norse god Loki. It is not the ultimate answer to all questions, not a solution for all problems, and under no circumstances is intended to replace other tools and techniques. On the other hand, it makes one step forward compared to other tools, trying to support the auditor and to make his work much more effective. This is accomplished by combining a number of techniques, including partial run-time decompiler, stateful analysis, code fingerprinting, I/O analysis, high-level visualization layer, traditional interactive debugger features and run-time code modification capabilities. The goal is to provide a very detailed trace information, and, at the same time, to provide data suitable to build a model of program behavior more quickly and in more convenient way.
Fenris is not supposed to find vulnerabilities or bugs, or to guess algorithms or describe protocols. It is supposed to report and analyze the execution path - detect and describe functional blocks, monitor data flow in the program, marking its lifetime, source, migration and destination, analyze how functions work and what conditions are evaluated.
At the end, it can deliver you an execution model of traced program (or arbitrarily chosen portion of it, if complete trace results in too much noise or irrelevant information), and hint you how this model can change in different conditions. Fenris does not need source codes of analyzed application, but obviously does not keep the auditor from using them.
For many users, Fenris might be a new tool or tools, for others - just a command-line replacement or addition to strace, ltrace, gdb or similar applications (theres a brief list of other nice tools in doc/other.txt). And thats the idea - to build a tool that is simple, reusable, but also precise and smart. It is supposed to have advantages over other tools, but not to be an ultimate replacement or the final solution. Some users can just use very specific features, such as automated function fingerprinting, and use companion tools instead of the main program.
<<lessThe main logical components are:
- Fenris: high-level tracer, a tool that detects the logic used in C programs to find and classify functions, logic program structure, calls, buffers, interaction with system and libraries, I/O and many other structures. Fenris is mostly a "whats inside" tracer, as opposed to ltrace or strace, tracers intended to inspect external "symptoms" of the internal program structure. Fenris does not depend on libbfd for accessing ELF structures, and thus is much more robust when dealing with "anti-debugging" code.
- libfnprints and dress: fingerprinting code that can be used to detect library functions embedded inside a static application, even without symbols, to make code analysis simplier; this functionality is both embedded in other components and available as a standalone tool that adds symtab to ELF binaries and can be used with any debugger or disassembler.
- Aegir: an interactive gdb-alike debugger with modular capabilities, instruction by instruction and breakpoint to breakpoint execution, and real-time access to all the goods offered by Fenris, such as high-level information about memory objects or logical code structure.
- nc-aegir: a SoftICE-alike GUI for Aegir, with automatic register, memory and code views, integrated Fenris output, and automatic Fenris control (now under development).
- Ragnarok: a visualisation tool for Fenris that delivers browsable information about many different aspects of program execution - code flow, function calls, memory object life, I/O, etc (to be redesigned using OpenDX or a similar data exploration interface).
- ...and some other companion utilities.
Code analysis is not limited to debugging, quality assurance or security audits. Understanding and handling file formats or communication protocols used by proprietary solutions, a problem that many corporations face when they decide to change their base software platform from one, obsolete or insufficient solution to another, perhaps more suitable, is a task that can consume long months and millions of dollars, especially when any misjudgment or misinterpretation is made.
Because of that, accurate and complete information about existing solutions has to be obtained and evaluated in a timely manner. This project is an attempt to fill the gap between currently used tools by providing a freely available program analysis utility, suitable for black-box code audits, algorithm analysis,
rapid reconnaissance in open-source projects, tracking down bugs, evaluating security subsystems, performing computer forensics, etc.
This program does not automate the process of auditing, and does not favor any particular use. Instead of that, it is intended to be a flexible and universal application that will be a valuable solution for many advanced users. While functional, it is probably not tested sufficiently, there are many issues to fix, several known bugs, some portability problems.
It is being released primarily to get user feedback, comments, and, most important, to request development support, as my resources are very limited, both in terms of available time and development platforms. This project is and will be distributed as a free software, regardless of projected use, accompanied by complete sources, under the terms and
conditions of GPL. Why do you might need this code? Well, there are few reasons...
Human beings are, so far, the best code analysts. Unlike computer programs, they have imagination, ability to build synthetic abstract models, and yet to observe and analyze smallest details at the same time. Functionality is often being described as "doing what the program is supposed to do", security as "doing what the program is supposed to do and
nothing more". While it might sound funny, that is the most general and complete definition we have. In most real-life scenarios only humans really know what are their expectations. Building strict formal models of our expectations does not necessarily mean that models themselves are flawless, and is very time-consuming. Then, even with such models,
validating the code is not always possible, due to its computational complexity. That is why real, live programs (not including some critical developments) do not have such models, do not follow any particular coding guidelines, and cannot be formally examined without human judgment.
Unfortunately, humans are also highly inaccurate and very expensive. They work slowly, and better results can be achieved by hiring better specialists and performing more careful audit. And after all, even the best expert can overlook something in complex, hard to read code. It is almost impossible for human to perform an accurate audit of a large, complex, heterogeneous project written e.g. in C - like Sendmail, BIND, Apache - and provide results in reasonable time.
Things get even worse when humans try to understand algorithms and protocols used by complex closed-source black box solutions. They are simply too slow, and not always able to make accurate guesses about dozens of complicated, conditional parameter passes and function calls before final action is taken.
While it might sound surprising, human-driven code audit is very similar to playing chess - it is a general analysis of possible states, way too many to be implicitly projected by our conscience, a result of experience, knowledge, some unparalleled capabilities of human brain, and luck. It is also a subject to false moves and misjudgment. And there are maybe just a few hundred excellent players.
As for today, freely and commercially available audit tools both use two opposite approaches. First approach tends to minimize human role by automating the review of source code. Source code analysis methods are good in spotting known, repeatable static errors in the code - such as format string vulnerabilities. On the other hand, static tools are not able to trace and analyze all possible execution paths of complex application by
simply looking at its source.
The reason for inability to follow all execution paths lies deeply in the foundations of modern computation theory, and one of its aspects is known as "the halting problem". Speaking in more general terms, in many cases (such as complex software, or even underlying operating system), the amount of medium needed to store all possible states of a complex program exceeds significantly the number of particles in the
universe; and the amount of time needed to generate and process them sequentially is greater than the lifetime of our universe, even having a machine that works with the speed of light.
This might be changed by the development of new computation models, such as quantum computing, or by creating mathematical models that allow us to make such problems non-polynomial - but for now, we are far from this point, and static analysis is restrained in many very serious ways, even though many software suppliers tend to market their products as the ultimate, 100% solutions. Subtle, complex, conditional dynamic errors, such as privilege dropping problems, input-dependent table overflows in C and many other issues usually cannot be detected without generating a completely unacceptable number of false positives.
This kind of software is highly dependent on coding style, and specific notation or development practices might render them less efficient - for example, automated audit utilities can usually detect problems like insecure call to strcpy() function, but will very likely not notice insecure manual copy in do-while
loop. The truth is, for programs that do not have previously built formal models, static auditing utilities look for known, common problems in known, common types of code in a very limited scope.
Another issue is the applicability of this approach to algorithm analysis tasks. In the domain of automated audit tools, this problem is "reduced" to building a formal model of program behavior, or, more appropriately, generating certain predictive statements about the code. While there are very interesting developments in this direction, such as the work of professor Patrick Cousot, it is very difficult to make any detailed, accurate and abstract enough run-time predictions for complex source code that has any immediate value in the analysis of unknown algorithm.
Last but not least, static analysis of sources can be deployed only when the source code is available, which does not have to be the case. This approach is a subject to many shortcomings, tricky assertions, and is a technique of strictly limited capabilities. This is, of course, not to dismiss this method - but to demonstrate that this much favored approach is not flawless and how much it needs to be accompanied with auxiliary methods.
The second approach to be discussed here is based on a dynamic run-time program analysis. This method is usually used to provide the user with information about actual program execution path, letting him make decisions on which path to follow and giving him free will to draw any conclusions and perform all the synthetic reasoning.
This method is
applied to a live binary executed in real-time and is based on monitoring syscalls (strace), libcalls (ltrace) or functions (xtrace); in certain cases, breakpoint debuggers, such as gdb, can be used, however it is usually not feasible to use them to perform anything more than in-depth analysis of a very small portion of program functionality. Usually, such analysis provides a very useful information on what is happening, and this information is provided in uniform, reduced-output form.
A careful auditor can analyze program behavior and find interesting or potentially dangerous run-time conditions. By monitoring how a given application interacts with external world, he (or she) can determine whether some other
conditions can be triggered and eventually explore them by examining sources or re-running the program. Advantages are enormous, as such software enables the auditor to spot very subtle errors in code that "looked good", to observe actual execution, not to try to figure it out, and to find or trace down not obvious or non-schematic vulnerabilities. Run-time trace tools are primarily used for fast reconnaissance tasks and for tracing down notorious errors that are not clearly visible in the source, significantly reducing the time of such operations.
There are, however, serious drawbacks related to this method. First of all, known tracing tools do not provide the complete information. They will detect strcpy() call, but wont report if exactly the same functionality has been implemented from scratch by the author of given program. And, in some cases, the amount of produced data
can be enormous, and because of its completely unstructured character, it makes the observation of overall execution vector almost impossible. Two most important problems are: correlating trace data with actual code, and determining what occurred in the "dark matter" between two lines of trace output.
There are some attempts to combine both approaches - run-time evaluation and source code analysis - such as Purify or many other commercial development support products. Unfortunately, they all feature a limited set of capabilities that need development-side or compilation-time support and are not really suitable for comprehending black box solutions or performing a general analysis. Most of them are targeted for dynamic memory debugging and code / memory profiling.
While not mentioned above, there is also another approach to black-box code - high-level decompiler. However, the complexity of modern compilers makes it very difficult to develop an effective C decompiler or similar utility, and there are only a few (two?) projects available to accomplish it, all of them not able to deal with too complex or optimized code. Finally, there is no guarantee that generated output code will be any help in comprehending the program. For now, this approach remains almost purely theoretical,
and I am not aware of any auditors using it extensively. Why? Well, heres an example of decompiled, mildly optimized code *with* some symbolic information: http://www.backerstreet.com/rec/ex386/hdgO.rec . One may argue it is less readable than cross-referenced disassembly.
This project, Fenris, is named after the monstrous wolf, son of the Norse god Loki. It is not the ultimate answer to all questions, not a solution for all problems, and under no circumstances is intended to replace other tools and techniques. On the other hand, it makes one step forward compared to other tools, trying to support the auditor and to make his work much more effective. This is accomplished by combining a number of techniques, including partial run-time decompiler, stateful analysis, code fingerprinting, I/O analysis, high-level visualization layer, traditional interactive debugger features and run-time code modification capabilities. The goal is to provide a very detailed trace information, and, at the same time, to provide data suitable to build a model of program behavior more quickly and in more convenient way.
Fenris is not supposed to find vulnerabilities or bugs, or to guess algorithms or describe protocols. It is supposed to report and analyze the execution path - detect and describe functional blocks, monitor data flow in the program, marking its lifetime, source, migration and destination, analyze how functions work and what conditions are evaluated.
At the end, it can deliver you an execution model of traced program (or arbitrarily chosen portion of it, if complete trace results in too much noise or irrelevant information), and hint you how this model can change in different conditions. Fenris does not need source codes of analyzed application, but obviously does not keep the auditor from using them.
For many users, Fenris might be a new tool or tools, for others - just a command-line replacement or addition to strace, ltrace, gdb or similar applications (theres a brief list of other nice tools in doc/other.txt). And thats the idea - to build a tool that is simple, reusable, but also precise and smart. It is supposed to have advantages over other tools, but not to be an ultimate replacement or the final solution. Some users can just use very specific features, such as automated function fingerprinting, and use companion tools instead of the main program.
Download (1.1MB)
Added: 2005-04-18 License: GPL (GNU General Public License) Price:
1657 downloads
Diagnotep 2007.1
Diagnotep is an affliction search engine to help diagnose medical problems. more>>
Diagnotep is an affliction search engine to help diagnose medical problems. Diagnotep project works in the mozilla browser, it might not work properly in other browsers. This is version 2007.1. To run the entire engine on your machine for a faster search, unzip the health archive into a folder and then open the file "health_diagnotep.html" with a browser.
The program is under the GPL license which basically welcomes you to copy or modify this and allows anyone else to copy or modify your version if you make it public. The text is under the GNU Free Documentation License which allows you to copy or modify this and allows anyone else to copy or modify your version if you make it public.
The program searches among the symptoms of a medical database, so the results will only be medical afflictions. There are about 1,800 afflictions in the database, so no matter how deep the search depth and how many symptoms are entered, there will be at most about 1,800 results. The links from the results page point to affliction pages which are either public domain government pages or GNU Free Documentation License pages.
The greatest advantage of the diagnotep search engine is that it searches only medical affliction pages, so the results are not cluttered with pages which are not about health. Another advantage is that the program searches only the symptom part of the affliction pages, so the results are not cluttered with unrelated medical pages. The greatest disadvantage of diagnotep is that it searches a medical database which is large, but incomplete; it does not include all the medical pages on the internet. Another disadvantage is that diagnotep has a size of about 200 kilobytes and so takes about 30 seconds to load on a 56k dialup modem.
Diagnotep development is ongoing and in the future it is hoped that there will be expanded treatment sections for common afflictions, that more afflictions will be added to the medical database and that the 200 kB size of the diagnotep script will be reduced for faster loading.
<<lessThe program is under the GPL license which basically welcomes you to copy or modify this and allows anyone else to copy or modify your version if you make it public. The text is under the GNU Free Documentation License which allows you to copy or modify this and allows anyone else to copy or modify your version if you make it public.
The program searches among the symptoms of a medical database, so the results will only be medical afflictions. There are about 1,800 afflictions in the database, so no matter how deep the search depth and how many symptoms are entered, there will be at most about 1,800 results. The links from the results page point to affliction pages which are either public domain government pages or GNU Free Documentation License pages.
The greatest advantage of the diagnotep search engine is that it searches only medical affliction pages, so the results are not cluttered with pages which are not about health. Another advantage is that the program searches only the symptom part of the affliction pages, so the results are not cluttered with unrelated medical pages. The greatest disadvantage of diagnotep is that it searches a medical database which is large, but incomplete; it does not include all the medical pages on the internet. Another disadvantage is that diagnotep has a size of about 200 kilobytes and so takes about 30 seconds to load on a 56k dialup modem.
Diagnotep development is ongoing and in the future it is hoped that there will be expanded treatment sections for common afflictions, that more afflictions will be added to the medical database and that the 200 kB size of the diagnotep script will be reduced for faster loading.
Download (0.44MB)
Added: 2007-01-09 License: GPL (GNU General Public License) Price:
1018 downloads
Pie 0.5
Pie is a lightweight content management system for Web-sharing documents, files, and arbitrary pieces of information. more>>
Pie is a lightweight content management system for Web-sharing documents, files, and arbitrary pieces of information.
Pie is just another web-based content composition and management environment using the idea of collaborate editing and sharing, an idea that has been taken to great extends lately by a crusade called Wiki.
Although so-called content management systems existed long before, employing both, proprietary as well as standardized means, the Wiki mythos pushed this effort even farther.
As with XML, another internet hype, and one that is still based many illusions upon (careless marketing strategists and clueless mortals have conventionalized XML to be one of those black magic three-letter acronyms that, if inhaled properly, is able to cook coffee, change your kids nappies and, all things considered, makes you a better human being once youve accepted it and freely offer it your untainted soul), Wikis more and more come to the publics attention and you clearly classify yourself as an outsider if you do not embrace the new technologys blessing.
A projects or ideas popularity shares its symptoms with economic growth: once it is unleashed upon the populace, grapping and holding their and all bystanders attention, it can not be stopped anymore until, of course, the climax is reached and everyone turns away, bored to death.
Nevertheless, Pie is another attempt to bore people willing to pay attention, offering its services freely and obendiently to those who are willing to accept them.
Pie has been designed to be tasty and can be served with a variety of ingredients. Basically, it serves you by gladly feeding upon your mental output, this being mostly text, but also graphics, music, programs and other intellectual property.
Before you build up your illusions right away, at the very start, it should be mentioned that Pie is unable to cook coffee. This fact cannot be stressed and overemphasized enough. Being a content management system, Pie does lots of things for you, but it certainly cant cook coffee.
If this was one of your basic requirements, you may cut off here, right now, and go for a secretary instead. (Hopefully, you didnt take this barking of your shin too seriously. Yet, it might have saved you a lot of time, if properly prepared coffee really was what you were looking for.)
Imagine, just for a moment, that youd like to collect your thoughts, on any conceivable matter. You could handle this the conventional way by writing them down in your diary. Still, you are a modern person, always having preferred to employ technology whereever you can.
Consequently, you foreclosed, of course, to make use or your PCs text processing features, thus being able to edit, cut and paste, and move around and modify your text in whatever manner and as often as you like.
Let us take this scenario one step farther: you not only want to be able to manage your thoughts at home or at work, but virtually everywhere and anytime. Sure, you can use a laptop for this purpose. However, being a social being, you want others to participate and take in (or even contribute to) your ideas - again, anytime and everywhere, as long as the participants have access to moderate 20s century technology.
You may send your data and files back and forth, using e-mail, or you could even rely on more sophisicated technology, like CVS, or you could make use of your proprietary publishing softwares distributed auto-update feature to spread your latest thoughts to remote clients, the participants, anywhere in the Net. Alternatively, you might rely on one of the Nets most accepted means: the Web.
Doing so, not only enables you to refrain from ugly, expensive, proprietary software, but also connects you, and those with whom you intend to share your intellectual propery, using a simple, standardized means.
Main features:
- Quick page processing and short run-time latency
- Low system requirements (both, in regard of the running servers performance as well as the complexity of the installed software base)
- Independent of ODBC, SQL and other database systems, both, session-based and file-based
- Multi-user support
- Page locking
- Browsable and revertable page versioning
- Local link/referer verification
- Optional (semi-)automatic page expiration
- Customizable PCRE-patterns for pages and files
- A rather extensive user manual
- Localized user interface
- Optional directory hashing to handle large amounts of files
- Small and simple code library
- Easily adaptable and extendable to personal needs
- Weighs less than 200 blocks (i. e. 100 KB), including online documentation
- Supports many common HTML directives, including tables
- XHTML 1.0 clean output
- Peachy
Enhancements:
- The code library has been completely rewritten, focusing on extendability and abstraction.
- All low-level functions have been implemented as OO classes.
- Both pages and files support an arbitrary number of versions, limited only by the capacity of the underlying file system.
- Usability has been improved.
- Most operations are selectable from drop-down menus via mouse clicks or Editing Mode.
- Editing has been fine-tuned.
- Text can be marked and, by clicking a button, applied various markup properties.
<<lessPie is just another web-based content composition and management environment using the idea of collaborate editing and sharing, an idea that has been taken to great extends lately by a crusade called Wiki.
Although so-called content management systems existed long before, employing both, proprietary as well as standardized means, the Wiki mythos pushed this effort even farther.
As with XML, another internet hype, and one that is still based many illusions upon (careless marketing strategists and clueless mortals have conventionalized XML to be one of those black magic three-letter acronyms that, if inhaled properly, is able to cook coffee, change your kids nappies and, all things considered, makes you a better human being once youve accepted it and freely offer it your untainted soul), Wikis more and more come to the publics attention and you clearly classify yourself as an outsider if you do not embrace the new technologys blessing.
A projects or ideas popularity shares its symptoms with economic growth: once it is unleashed upon the populace, grapping and holding their and all bystanders attention, it can not be stopped anymore until, of course, the climax is reached and everyone turns away, bored to death.
Nevertheless, Pie is another attempt to bore people willing to pay attention, offering its services freely and obendiently to those who are willing to accept them.
Pie has been designed to be tasty and can be served with a variety of ingredients. Basically, it serves you by gladly feeding upon your mental output, this being mostly text, but also graphics, music, programs and other intellectual property.
Before you build up your illusions right away, at the very start, it should be mentioned that Pie is unable to cook coffee. This fact cannot be stressed and overemphasized enough. Being a content management system, Pie does lots of things for you, but it certainly cant cook coffee.
If this was one of your basic requirements, you may cut off here, right now, and go for a secretary instead. (Hopefully, you didnt take this barking of your shin too seriously. Yet, it might have saved you a lot of time, if properly prepared coffee really was what you were looking for.)
Imagine, just for a moment, that youd like to collect your thoughts, on any conceivable matter. You could handle this the conventional way by writing them down in your diary. Still, you are a modern person, always having preferred to employ technology whereever you can.
Consequently, you foreclosed, of course, to make use or your PCs text processing features, thus being able to edit, cut and paste, and move around and modify your text in whatever manner and as often as you like.
Let us take this scenario one step farther: you not only want to be able to manage your thoughts at home or at work, but virtually everywhere and anytime. Sure, you can use a laptop for this purpose. However, being a social being, you want others to participate and take in (or even contribute to) your ideas - again, anytime and everywhere, as long as the participants have access to moderate 20s century technology.
You may send your data and files back and forth, using e-mail, or you could even rely on more sophisicated technology, like CVS, or you could make use of your proprietary publishing softwares distributed auto-update feature to spread your latest thoughts to remote clients, the participants, anywhere in the Net. Alternatively, you might rely on one of the Nets most accepted means: the Web.
Doing so, not only enables you to refrain from ugly, expensive, proprietary software, but also connects you, and those with whom you intend to share your intellectual propery, using a simple, standardized means.
Main features:
- Quick page processing and short run-time latency
- Low system requirements (both, in regard of the running servers performance as well as the complexity of the installed software base)
- Independent of ODBC, SQL and other database systems, both, session-based and file-based
- Multi-user support
- Page locking
- Browsable and revertable page versioning
- Local link/referer verification
- Optional (semi-)automatic page expiration
- Customizable PCRE-patterns for pages and files
- A rather extensive user manual
- Localized user interface
- Optional directory hashing to handle large amounts of files
- Small and simple code library
- Easily adaptable and extendable to personal needs
- Weighs less than 200 blocks (i. e. 100 KB), including online documentation
- Supports many common HTML directives, including tables
- XHTML 1.0 clean output
- Peachy
Enhancements:
- The code library has been completely rewritten, focusing on extendability and abstraction.
- All low-level functions have been implemented as OO classes.
- Both pages and files support an arbitrary number of versions, limited only by the capacity of the underlying file system.
- Usability has been improved.
- Most operations are selectable from drop-down menus via mouse clicks or Editing Mode.
- Editing has been fine-tuned.
- Text can be marked and, by clicking a button, applied various markup properties.
Download (0.073MB)
Added: 2006-10-23 License: GPL (GNU General Public License) Price:
1096 downloads
Tie::CharArray 1.00
Tie::CharArray module can access Perl scalars as arrays of characters. more>>
Tie::CharArray module can access Perl scalars as arrays of characters.
SYNOPSIS
use Tie::CharArray;
my $foobar = a string;
tie my @foo, Tie::CharArray, $foobar;
$foo[0] = A; # $foobar = A string
push @foo, !; # $foobar = A string!
print "@foon"; # prints: A s t r i n g !
tie my @bar, Tie::CharArray::Ord, $foobar;
$bar[0]--; # $foobar = @ string!
pop @bar; # $foobar = @ string
print "@barn"; # prints: 64 32 115 116 114 105 110 103
Alternative interface functions
use Tie::CharArray qw( chars codes );
my $foobar = another string;
my $chars = chars $foobar; # arrayref in scalar context
push @$chars, ?; # $foobar = another string?
$_ += 2 for codes $foobar; # tied array in list context
# $foobar = cpqvjgt"uvtkpiA
my @array = chars $foobar; # WARNING: @array isnt tied!
In low-level programming languages such as C, and to some extent Java, strings are not primitive data types but arrays of characters, which in turn are treated as integers. This closely matches the internal representation of strings in the memory.
Perl, on the other hand, abstracts such internal details away behind the concept of scalars, which can be treated as either strings or numbers, and appear as primitive types to the programmer. This often better matches the way people think about the data, which facilitates programming by making common high-level manipulation tasks trivial.
Sometimes, though, the low-level view is better suited for the task at hand. Perl does offer functions such as ord()/chr(), pack()/unpack() and substr() that can be used to solve such tasks with reasonable efficiency. For someone used to the direct access to the internal representation offered by other languages, however, these functions may feel awkward. While this is often only a symptom of thinking in un-Perlish terms, sometimes being able to manipulate strings as character arrays really does simplify the code, making the intent more obvious by eliminating syntactic clutter.
This module provides a way to manipulate Perl strings through tied arrays. The operations are implemented in terms of the aforementioned string manipulation functions, but the programmer normally need not be aware of this. As Perl has no primitive character type, two alternative representations are provided:
<<lessSYNOPSIS
use Tie::CharArray;
my $foobar = a string;
tie my @foo, Tie::CharArray, $foobar;
$foo[0] = A; # $foobar = A string
push @foo, !; # $foobar = A string!
print "@foon"; # prints: A s t r i n g !
tie my @bar, Tie::CharArray::Ord, $foobar;
$bar[0]--; # $foobar = @ string!
pop @bar; # $foobar = @ string
print "@barn"; # prints: 64 32 115 116 114 105 110 103
Alternative interface functions
use Tie::CharArray qw( chars codes );
my $foobar = another string;
my $chars = chars $foobar; # arrayref in scalar context
push @$chars, ?; # $foobar = another string?
$_ += 2 for codes $foobar; # tied array in list context
# $foobar = cpqvjgt"uvtkpiA
my @array = chars $foobar; # WARNING: @array isnt tied!
In low-level programming languages such as C, and to some extent Java, strings are not primitive data types but arrays of characters, which in turn are treated as integers. This closely matches the internal representation of strings in the memory.
Perl, on the other hand, abstracts such internal details away behind the concept of scalars, which can be treated as either strings or numbers, and appear as primitive types to the programmer. This often better matches the way people think about the data, which facilitates programming by making common high-level manipulation tasks trivial.
Sometimes, though, the low-level view is better suited for the task at hand. Perl does offer functions such as ord()/chr(), pack()/unpack() and substr() that can be used to solve such tasks with reasonable efficiency. For someone used to the direct access to the internal representation offered by other languages, however, these functions may feel awkward. While this is often only a symptom of thinking in un-Perlish terms, sometimes being able to manipulate strings as character arrays really does simplify the code, making the intent more obvious by eliminating syntactic clutter.
This module provides a way to manipulate Perl strings through tied arrays. The operations are implemented in terms of the aforementioned string manipulation functions, but the programmer normally need not be aware of this. As Perl has no primitive character type, two alternative representations are provided:
Download (0.005MB)
Added: 2007-06-14 License: Perl Artistic License Price:
863 downloads
Apache::AxKit::Language::XSP 1.6.2
Apache::AxKit::Language::XSP is a Perl module with eXtensible Server Pages. more>>
Apache::AxKit::Language::XSP is a Perl module with eXtensible Server Pages.
SYNOPSIS
< xsp:page
xmlns:xsp="http://apache.org/xsp/core/v1" >
< xsp:structure >
< xsp:import >Time::Object< /xsp:import >
< /xsp:structure >
< page >
< title >XSP Test< /title >
< para >
Hello World!
< /para >
< para >
Good
< xsp:logic >
if (localtime->hour >= 12) {
< xsp:content >Afternoon< /xsp:content >
}
else {
< xsp:content >Morning< /xsp:content >
}
< /xsp:logic >
< /para >
< /page >
< /xsp:page >
XSP implements a tag-based dynamic language that allows you to develop your own tags, examples include sendmail and sql taglibs. It is AxKits way of providing an environment for dynamic pages. XSP is originally part of the Apache Cocoon project, and so you will see some Apache namespaces used in XSP.
Also, use only one XSP processor in a pipeline. XSP is powerful enough that you should only need one stage, and this implementation allows only one stage. If you have two XSP processors, perhaps in a pipeline that looks like:
... => XSP => XSLT => XSLT => XSP => ...
it is pretty likely that the functionality of the intermediate XSLT stages can be factored in to either upstream or downstream XSLT:
... => XSLT => XSP => XSLT => ...
This design is likely to lead to a clearer and more maintainable implementation, if only because generating code, especially embedded Perl code, in one XSP processor and consuming it in another is often confusing and even more often a symptom of misdesign.
Likewise, you may want to lean towards using Perl taglib modules instead of upstream XSLT "LogicSheets". Upstream XSLT LogicSheets work fine, mind you, but using Perl taglib modules results in a simpler pipeline, simpler configuration (just load the taglib modules in httpd.conf, no need to have the correct LogicSheet XSLT page included whereever you need that taglib), a more flexible coding environment, the ability to pretest your taglibs before installing them on a server, and better isolation of interface (the taglib API) and implementation (the Perl module behind it). LogicSheets work, and can be useful, but are often the long way home. That said, people used to the Cocoon environment may prefer them.
<<lessSYNOPSIS
< xsp:page
xmlns:xsp="http://apache.org/xsp/core/v1" >
< xsp:structure >
< xsp:import >Time::Object< /xsp:import >
< /xsp:structure >
< page >
< title >XSP Test< /title >
< para >
Hello World!
< /para >
< para >
Good
< xsp:logic >
if (localtime->hour >= 12) {
< xsp:content >Afternoon< /xsp:content >
}
else {
< xsp:content >Morning< /xsp:content >
}
< /xsp:logic >
< /para >
< /page >
< /xsp:page >
XSP implements a tag-based dynamic language that allows you to develop your own tags, examples include sendmail and sql taglibs. It is AxKits way of providing an environment for dynamic pages. XSP is originally part of the Apache Cocoon project, and so you will see some Apache namespaces used in XSP.
Also, use only one XSP processor in a pipeline. XSP is powerful enough that you should only need one stage, and this implementation allows only one stage. If you have two XSP processors, perhaps in a pipeline that looks like:
... => XSP => XSLT => XSLT => XSP => ...
it is pretty likely that the functionality of the intermediate XSLT stages can be factored in to either upstream or downstream XSLT:
... => XSLT => XSP => XSLT => ...
This design is likely to lead to a clearer and more maintainable implementation, if only because generating code, especially embedded Perl code, in one XSP processor and consuming it in another is often confusing and even more often a symptom of misdesign.
Likewise, you may want to lean towards using Perl taglib modules instead of upstream XSLT "LogicSheets". Upstream XSLT LogicSheets work fine, mind you, but using Perl taglib modules results in a simpler pipeline, simpler configuration (just load the taglib modules in httpd.conf, no need to have the correct LogicSheet XSLT page included whereever you need that taglib), a more flexible coding environment, the ability to pretest your taglibs before installing them on a server, and better isolation of interface (the taglib API) and implementation (the Perl module behind it). LogicSheets work, and can be useful, but are often the long way home. That said, people used to the Cocoon environment may prefer them.
Download (0.30MB)
Added: 2007-08-02 License: Perl Artistic License Price:
813 downloads
Nasal 1.0
Nasal is a simple, small, yet full-featured embeddable scripting language. more>>
Nasal is a language that I wrote for use in a personal project. Ostensibly it was because I was frustrated with the dearth of small-but-complete embeddable scripting languages, but of course I really wrote it because it was fun.
It is still young and incomplete in a few places, but is under active development and has been integrated as the extension language for the FlightGear simulator.
Documentation is still sparse. There is a design document available, which talks at length about the "whys" behind the design of Nasal and includes documentation for the built-in library functions.
More useful to the experienced programmer is the tutorial-style sample code, which explains and demonstrates all the syntax features of the language.
Like perl, python and javascript, nasal uses vectors (expandable arrays) and hash tables as its native data format. This is a well-understood idiom, and it works very well. I felt no need to rock the boat here.
Like perl, and unlike everything else, nasal combines numbers and strings into a single "scalar" datatype. No conversion needs to happen in user code, which simplifies common string handling tasks.
Like perl, but unlike python, hash keys must by scalars in nasal. Python supports a "tuple" constant type that can be used as well, but there is no equivalent in nasal (you cant use vectors as keys because they might change after the insertion).
Like perl and python, nasal uses a # character to indicate and end-of-line comment. There is no multiline begin/end comment syntax as in Javascript.
Like perl, nasal functions do not have named parameters. They get their arguments in a vector named "arg", and can extract them however they like. Unlike perl, Nasal takes advantage of this feature to do away with function "declaration" entirly; see below.
Like python, there is no hidden local object scope in a function call. The object on which a method was called is available to a function as a local variable named "me" (python calls this "self" by convention, but because nasal has no declared function arguments, there is no opportunity to change it).
Like perl, "objects" in nasal are simply hash tables. Looking an item up by name in a hash table and extracting a symbol for an object are just different syntax for the same operation (but read on for an important exception):
a["b"] = 1 means the same thing as: a.b = 1
The above paragraph is a minor lie. The "dot" syntax is also the clue to the interpreter to "save" the left hand side as the "me" reference if the expression is used as a function/method call. That is, these expressions are not equivalent (one is a plain function call, the other a method invocation on the object "a"):
a["b"](arg1, arg2) isnt the same as: a.b(arg1, arg2)
Like javascript, nasal lacks a specific "class" syntax for OOP programming. Instead, classes are simply objects. Each object supports a "parents" member array; symbol lookup on the object at runtime bounces to the parents (and the parents parents) if the symbol is not found in the hash. The parents field is just like any other object field, you can set it however you like and even change it at runtime if you are feeling especially perverse.
Like lisp, javascript and perl, nasal supports lexical closures. This means that the local symbol namespace available to your function when it is assigned remain constant over time. If you dont know what this means, you dont need to care. It is this feature that allows functions to use variables declared in the outer scope when it is defined (e.g. seeing "module" variables).
Like all other scripting languages, functions are just symbols in a namespace, but unlike all other scripting languages, there is no function "declaration" syntax. A function is always an anonymous object (a "lambda," in the parlance), which you assign to a variable in order to use. Like so:
myfunction = func { arg[0] + 1 }
myfunction(1); # returns 2
One annoyance of this feature is that Nasal functions dont have unique internal "names". So a debugging or exception stack trace can only give you a source line number, and not a function name as reference.
Nasal has a straightforward, readable syntax which is closest to javascript among other scripting languages. Like later versions of javascript, it includes has a hash lookup syntax as well as an object field accessor syntax (that is, you can do both a.b and a["b"]).
Unlike python, nasal has a grammar which is not whitespace-sensitive. This doesnt make python hard to write, and it arguably makes it easier to read. But it is different from the way the rest of the world works, and makes python distinctly unsuitable for "inline" environments (consider PHP, Javascript, ASP or in-configuration-file scripts) where it needs to live as a plain old string inside of another programs code or data file.
Nasal garbage collects runtime storage, so the programmer need not worry about manual allocation, or even circular references. The current implementation is a simple mark/sweep collector, which should be acceptable for most applications. Future enhancements will include a "return early" capability for latency-critical applications. The collector can be instructred to return after a certain maximum delay, and be restarted later. Fancy items like generational collectors fail the "small and simple" criteria and are not likely to be included.
Like python, nasal supports exception handling as a first-class language feature, with built-in runtime-inspectable stack trace. Rather like perl, however, there is no special "try" syntax for exception handling, nor inheritance-based catching semantics. Instead, you call a "try" function on another function, and inspect the return value on your own. Code simply calls die with an argument list, which is returned from the closest enclosing try() invocation. Elaborate exception handling isnt really appropriate for embedded scripting languages. [NOTE: this isnt finished yet]
Nasal tries to be stricter than perl. Operations like converting a non-numeric string value to a number, reading or writing past the end of an array or operating on a nil reference, which are generally legal in perl, throw exceptions in nasal. Perl sometimes bends over backwards to do something "reasonable" with your instructions (e.g. whats the boolean truth value of a hash reference?); nasal doesnt try ("error: non-scalar used in boolean context at line 92")
Nasal is very small, very simple, written in ANSI C, and generally an excellent choice for embedded applications. It uses a simple and transparent syntax interpretable by a simple "bracket matching and operator precedence" parser. It does not depend on any third party libraries other than the standard C library. It does not depend on third party tools like (f)lex and yacc/bison. It builds simply and easily, supports a reasonably simple extension API and cohabitates well with other code.
Nasal makes no use of the processor stack when running recursive code. This is important for embedded languages as it provides the ability to "exit early" from a Nasal context. An outside application may have realtime constraints, and Nasal can be instructed to run for only a certain number of "cycles" before returning. Later calls will automatically pick up the interpreter state where it left off.
Nasal provides "minimal threadsafety". Multithreaded operations on Nasal objects are safe in the sense that they cannot crash or corrupt the interpreter. They are not guaranteed to be atomic. In particular, poorly synchronized insertions into containers can "drop" objects into oblivion (which is OK from an interpreter stability standpoint, since the GC will clean them up normally). Race conditions have to be the programmers problem anyway, this is just another symptom. Garbage collection will block all threads before running. [NOTE: this part is still unimplemented.]
Enhancements:
- This release contains the updates that have been available in SimGear for some time now.
- Important new functionality includes bugfixes, many performance enhancements, a declared function argument syntax, a ternary (?:) operator, indexable and mutable string objects, interpreter thread safety features, and much work to the "standard" library (including stdio, bitfields, Unix system calls, and PCRE regular expressions).
<<lessIt is still young and incomplete in a few places, but is under active development and has been integrated as the extension language for the FlightGear simulator.
Documentation is still sparse. There is a design document available, which talks at length about the "whys" behind the design of Nasal and includes documentation for the built-in library functions.
More useful to the experienced programmer is the tutorial-style sample code, which explains and demonstrates all the syntax features of the language.
Like perl, python and javascript, nasal uses vectors (expandable arrays) and hash tables as its native data format. This is a well-understood idiom, and it works very well. I felt no need to rock the boat here.
Like perl, and unlike everything else, nasal combines numbers and strings into a single "scalar" datatype. No conversion needs to happen in user code, which simplifies common string handling tasks.
Like perl, but unlike python, hash keys must by scalars in nasal. Python supports a "tuple" constant type that can be used as well, but there is no equivalent in nasal (you cant use vectors as keys because they might change after the insertion).
Like perl and python, nasal uses a # character to indicate and end-of-line comment. There is no multiline begin/end comment syntax as in Javascript.
Like perl, nasal functions do not have named parameters. They get their arguments in a vector named "arg", and can extract them however they like. Unlike perl, Nasal takes advantage of this feature to do away with function "declaration" entirly; see below.
Like python, there is no hidden local object scope in a function call. The object on which a method was called is available to a function as a local variable named "me" (python calls this "self" by convention, but because nasal has no declared function arguments, there is no opportunity to change it).
Like perl, "objects" in nasal are simply hash tables. Looking an item up by name in a hash table and extracting a symbol for an object are just different syntax for the same operation (but read on for an important exception):
a["b"] = 1 means the same thing as: a.b = 1
The above paragraph is a minor lie. The "dot" syntax is also the clue to the interpreter to "save" the left hand side as the "me" reference if the expression is used as a function/method call. That is, these expressions are not equivalent (one is a plain function call, the other a method invocation on the object "a"):
a["b"](arg1, arg2) isnt the same as: a.b(arg1, arg2)
Like javascript, nasal lacks a specific "class" syntax for OOP programming. Instead, classes are simply objects. Each object supports a "parents" member array; symbol lookup on the object at runtime bounces to the parents (and the parents parents) if the symbol is not found in the hash. The parents field is just like any other object field, you can set it however you like and even change it at runtime if you are feeling especially perverse.
Like lisp, javascript and perl, nasal supports lexical closures. This means that the local symbol namespace available to your function when it is assigned remain constant over time. If you dont know what this means, you dont need to care. It is this feature that allows functions to use variables declared in the outer scope when it is defined (e.g. seeing "module" variables).
Like all other scripting languages, functions are just symbols in a namespace, but unlike all other scripting languages, there is no function "declaration" syntax. A function is always an anonymous object (a "lambda," in the parlance), which you assign to a variable in order to use. Like so:
myfunction = func { arg[0] + 1 }
myfunction(1); # returns 2
One annoyance of this feature is that Nasal functions dont have unique internal "names". So a debugging or exception stack trace can only give you a source line number, and not a function name as reference.
Nasal has a straightforward, readable syntax which is closest to javascript among other scripting languages. Like later versions of javascript, it includes has a hash lookup syntax as well as an object field accessor syntax (that is, you can do both a.b and a["b"]).
Unlike python, nasal has a grammar which is not whitespace-sensitive. This doesnt make python hard to write, and it arguably makes it easier to read. But it is different from the way the rest of the world works, and makes python distinctly unsuitable for "inline" environments (consider PHP, Javascript, ASP or in-configuration-file scripts) where it needs to live as a plain old string inside of another programs code or data file.
Nasal garbage collects runtime storage, so the programmer need not worry about manual allocation, or even circular references. The current implementation is a simple mark/sweep collector, which should be acceptable for most applications. Future enhancements will include a "return early" capability for latency-critical applications. The collector can be instructred to return after a certain maximum delay, and be restarted later. Fancy items like generational collectors fail the "small and simple" criteria and are not likely to be included.
Like python, nasal supports exception handling as a first-class language feature, with built-in runtime-inspectable stack trace. Rather like perl, however, there is no special "try" syntax for exception handling, nor inheritance-based catching semantics. Instead, you call a "try" function on another function, and inspect the return value on your own. Code simply calls die with an argument list, which is returned from the closest enclosing try() invocation. Elaborate exception handling isnt really appropriate for embedded scripting languages. [NOTE: this isnt finished yet]
Nasal tries to be stricter than perl. Operations like converting a non-numeric string value to a number, reading or writing past the end of an array or operating on a nil reference, which are generally legal in perl, throw exceptions in nasal. Perl sometimes bends over backwards to do something "reasonable" with your instructions (e.g. whats the boolean truth value of a hash reference?); nasal doesnt try ("error: non-scalar used in boolean context at line 92")
Nasal is very small, very simple, written in ANSI C, and generally an excellent choice for embedded applications. It uses a simple and transparent syntax interpretable by a simple "bracket matching and operator precedence" parser. It does not depend on any third party libraries other than the standard C library. It does not depend on third party tools like (f)lex and yacc/bison. It builds simply and easily, supports a reasonably simple extension API and cohabitates well with other code.
Nasal makes no use of the processor stack when running recursive code. This is important for embedded languages as it provides the ability to "exit early" from a Nasal context. An outside application may have realtime constraints, and Nasal can be instructed to run for only a certain number of "cycles" before returning. Later calls will automatically pick up the interpreter state where it left off.
Nasal provides "minimal threadsafety". Multithreaded operations on Nasal objects are safe in the sense that they cannot crash or corrupt the interpreter. They are not guaranteed to be atomic. In particular, poorly synchronized insertions into containers can "drop" objects into oblivion (which is OK from an interpreter stability standpoint, since the GC will clean them up normally). Race conditions have to be the programmers problem anyway, this is just another symptom. Garbage collection will block all threads before running. [NOTE: this part is still unimplemented.]
Enhancements:
- This release contains the updates that have been available in SimGear for some time now.
- Important new functionality includes bugfixes, many performance enhancements, a declared function argument syntax, a ternary (?:) operator, indexable and mutable string objects, interpreter thread safety features, and much work to the "standard" library (including stdio, bitfields, Unix system calls, and PCRE regular expressions).
Download (0.10MB)
Added: 2006-07-04 License: LGPL (GNU Lesser General Public License) Price:
1209 downloads
UMLMON 1.0.3
UMLMON is a complete run time environment for User Mode Linux. more>>
UMLMON is a complete run time environment for User Mode Linux. There is a separate monitor daemon for every VM.
UMLMON project creates the run time environment and starts the VM by executing the UML kernel. The daemon also determines the arguments that are passed to the UML kernel, and includes special support to set up arguments for memory size, virtual disks, virtual network interfaces, and console channels in a convenient way.
UMLMON also includes routines to do certain administration tasks like the creation of disks.
The team UMLMON + UML can be applied in the following areas:
- Server consolidation: Improve the utilization of server hardware, and ease the operation of servers.
- Virtual security zones: Instead of building demilitarized zones (DMZ) with real hardware, it is a cost-effective alternative to set up purely virtual DMZs on a single host.
- Virtual hosting: A cheap version of server hosting is virtual hosting; instead of leasing real computers to customers, virtual machines are used.
- Laboratory nets: By using virtual machines it is possible to build cheap laboratory nets, e.g. to test software in real network environments.
- Training environments: One can use virtual machines for Linux trainings where participants can get true administrators priviledges without any risks.
Enhancements:
- This release no longer call the problematic glibc function getgrouplist, which is often broken (symptom: segmentation fault immediately after starting umlmon).
<<lessUMLMON project creates the run time environment and starts the VM by executing the UML kernel. The daemon also determines the arguments that are passed to the UML kernel, and includes special support to set up arguments for memory size, virtual disks, virtual network interfaces, and console channels in a convenient way.
UMLMON also includes routines to do certain administration tasks like the creation of disks.
The team UMLMON + UML can be applied in the following areas:
- Server consolidation: Improve the utilization of server hardware, and ease the operation of servers.
- Virtual security zones: Instead of building demilitarized zones (DMZ) with real hardware, it is a cost-effective alternative to set up purely virtual DMZs on a single host.
- Virtual hosting: A cheap version of server hosting is virtual hosting; instead of leasing real computers to customers, virtual machines are used.
- Laboratory nets: By using virtual machines it is possible to build cheap laboratory nets, e.g. to test software in real network environments.
- Training environments: One can use virtual machines for Linux trainings where participants can get true administrators priviledges without any risks.
Enhancements:
- This release no longer call the problematic glibc function getgrouplist, which is often broken (symptom: segmentation fault immediately after starting umlmon).
Download (3.2MB)
Added: 2006-01-08 License: GPL (GNU General Public License) Price:
1384 downloads
Bomberman for Java 2.4
Bomberman for Java is an original 2D 5 player on one computer (2 keyboard, 1 mouse, and 2 joystick players) Bomberman game. more>>
Bomberman for Java is an original 2D "5 player on one computer" (2 keyboard, 1 mouse, and 2 joystick players) Bomberman game.
Features include a level editor, dynamic key configuration, bomb kicker, bomb stopper, remote bombs, bomb stripper, revenge bombs, portals, rolling floor, flame mirrors, farting items, 10 diseases, adjustable items and disease probabilities, player names, an advanced scoring scheme, adjustable lifetime durations, etc.
Main features:
- fast: your player runs incredible fast
- slow: your player walks very slow
- reverse controls: you go right when you press left, ...
- invisibility: you are invisible, though not invinsible
- auto bomb putting: you put your bombs automatically
- immediate bomb explosion: your bombs explode within a second
- fart: like the item
- autoblock putting: you leave a trail of rocks behind yourself
- invisible bombs: your bombs are invisible, can be very handy
- bomb constipation: you cant lay bombs
- level editor, random level chooser, specific level chooser
- small and medium levels
- adjustable
- screen size, sound on or off, player names
- bonus lifetime, bomb explode time, amount of bonusses, remote lifetime
- fire lifetime, nr of blocks, block reappearance speed
- adjustable bonus and disease probabilities
- full dynamic control setup
- joystick support for two players
- mouse support for one player
- two players on one keyboard: four is possible, but your keyboard will not be able to handle all the pressed buttons.
- keeping track of the wins of every player, resetable via the options menu
- when a player dies, some items are created around his position.
- different background colors
- removed background music and sound effects, added other sound effects
- bomb stop item
- portals
- bomb stripper
- mirrors: reflects fire
<<lessFeatures include a level editor, dynamic key configuration, bomb kicker, bomb stopper, remote bombs, bomb stripper, revenge bombs, portals, rolling floor, flame mirrors, farting items, 10 diseases, adjustable items and disease probabilities, player names, an advanced scoring scheme, adjustable lifetime durations, etc.
Main features:
- fast: your player runs incredible fast
- slow: your player walks very slow
- reverse controls: you go right when you press left, ...
- invisibility: you are invisible, though not invinsible
- auto bomb putting: you put your bombs automatically
- immediate bomb explosion: your bombs explode within a second
- fart: like the item
- autoblock putting: you leave a trail of rocks behind yourself
- invisible bombs: your bombs are invisible, can be very handy
- bomb constipation: you cant lay bombs
- level editor, random level chooser, specific level chooser
- small and medium levels
- adjustable
- screen size, sound on or off, player names
- bonus lifetime, bomb explode time, amount of bonusses, remote lifetime
- fire lifetime, nr of blocks, block reappearance speed
- adjustable bonus and disease probabilities
- full dynamic control setup
- joystick support for two players
- mouse support for one player
- two players on one keyboard: four is possible, but your keyboard will not be able to handle all the pressed buttons.
- keeping track of the wins of every player, resetable via the options menu
- when a player dies, some items are created around his position.
- different background colors
- removed background music and sound effects, added other sound effects
- bomb stop item
- portals
- bomb stripper
- mirrors: reflects fire
Download (1.8MB)
Added: 2006-11-24 License: Other/Proprietary License with Source Price:
1097 downloads
Secleted [ 0 ] software to compare
- Page: 1 of 1
- 1
Copyright Notice:
Software piracy is theft, Using crack, password, serial numbers, registration codes, key generators is illegal and prevent future software development. The above chronic constipation symptoms search only lists software in full, demo and trial versions for free download. Download links are directly from our mirror sites or publisher sites, torrent files or links from rapidshare.com, yousendit.com or megaupload.com are not allowed