From a19172f03dfc861081c784d8b5f452c42b01eccd Mon Sep 17 00:00:00 2001 From: Jarek Lipski Date: Thu, 24 Sep 2015 21:39:55 +0200 Subject: [PATCH] Initial commit --- .gitignore | 120 ++ build.gradle | 32 + build.number | 3 + build.properties | 5 + build.xml | 140 ++ doc/.svn/all-wcprops | 29 + doc/.svn/entries | 167 ++ doc/.svn/text-base/authors.html.svn-base | 10 + doc/.svn/text-base/copying.html.svn-base | 13 + doc/.svn/text-base/history.html.svn-base | 71 + doc/.svn/text-base/readme.html.svn-base | 282 +++ doc/authors.html | 10 + doc/copying.html | 13 + doc/history.html | 71 + doc/readme.html | 282 +++ doc/tech/.svn/all-wcprops | 29 + doc/tech/.svn/entries | 142 ++ doc/tech/.svn/prop-base/moore.txt.svn-base | 5 + doc/tech/.svn/prop-base/moore2.txt.svn-base | 5 + doc/tech/.svn/text-base/ideas.txt.svn-base | 19 + doc/tech/.svn/text-base/moore.txt.svn-base | 26 + doc/tech/.svn/text-base/moore2.txt.svn-base | 93 + doc/tech/.svn/text-base/todo.txt.svn-base | 30 + doc/tech/ideas.txt | 19 + doc/tech/moore.txt | 26 + doc/tech/moore2.txt | 93 + doc/tech/todo.txt | 30 + examples/.svn/all-wcprops | 5 + examples/.svn/entries | 40 + examples/align/.svn/all-wcprops | 5 + examples/align/.svn/entries | 34 + examples/align/human/.svn/all-wcprops | 29 + examples/align/human/.svn/entries | 98 + .../human/.svn/text-base/gpl.al.svn-base | 1810 ++++++++++++++++ .../.svn/text-base/poznan-oracle.al.svn-base | 29 + .../human/.svn/text-base/poznan.al.svn-base | 309 +++ .../.svn/text-base/stallman-ch1.al.svn-base | 1423 +++++++++++++ examples/align/human/gpl.al | 1810 ++++++++++++++++ examples/align/human/poznan-oracle.al | 29 + examples/align/human/poznan.al | 309 +++ examples/align/human/stallman-ch1.al | 1423 +++++++++++++ examples/align/moore/.svn/all-wcprops | 23 + examples/align/moore/.svn/entries | 86 + .../moore/.svn/text-base/gpl.al.svn-base | 1755 ++++++++++++++++ .../moore/.svn/text-base/poznan.al.svn-base | 291 +++ .../.svn/text-base/stallman-ch1.al.svn-base | 1067 ++++++++++ examples/align/moore/gpl.al | 1755 ++++++++++++++++ examples/align/moore/poznan.al | 291 +++ examples/align/moore/stallman-ch1.al | 1067 ++++++++++ examples/script/.svn/all-wcprops | 41 + examples/script/.svn/entries | 232 +++ .../script/.svn/prop-base/example1.svn-base | 5 + .../script/.svn/prop-base/example2.svn-base | 5 + .../script/.svn/prop-base/example3.svn-base | 5 + .../.svn/text-base/example1.bat.svn-base | 8 + .../script/.svn/text-base/example1.svn-base | 7 + .../.svn/text-base/example2.bat.svn-base | 12 + .../script/.svn/text-base/example2.svn-base | 10 + .../.svn/text-base/example3.bat.svn-base | 8 + .../script/.svn/text-base/example3.svn-base | 6 + examples/script/example1 | 7 + examples/script/example1.bat | 8 + examples/script/example2 | 10 + examples/script/example2.bat | 12 + examples/script/example3 | 6 + examples/script/example3.bat | 8 + examples/split/.svn/all-wcprops | 23 + examples/split/.svn/entries | 64 + examples/split/.svn/text-base/gpl.al.svn-base | 466 +++++ .../split/.svn/text-base/poznan.al.svn-base | 87 + .../.svn/text-base/stallman-ch1.al.svn-base | 385 ++++ examples/split/gpl.al | 466 +++++ examples/split/poznan.al | 87 + examples/split/stallman-ch1.al | 385 ++++ examples/txt/.svn/all-wcprops | 77 + examples/txt/.svn/entries | 172 ++ .../txt/.svn/text-base/gpl-en.txt.svn-base | 226 ++ .../txt/.svn/text-base/gpl-pl.txt.svn-base | 254 +++ .../txt/.svn/text-base/help-en.txt.svn-base | 1156 +++++++++++ .../txt/.svn/text-base/help-pl.txt.svn-base | 1227 +++++++++++ .../txt/.svn/text-base/poznan-de.txt.svn-base | 12 + .../txt/.svn/text-base/poznan-pl.txt.svn-base | 11 + .../text-base/poznan-small-de.txt.svn-base | 3 + .../text-base/poznan-small-pl.txt.svn-base | 3 + .../text-base/stallman-ch1-en.txt.svn-base | 99 + .../text-base/stallman-ch1-pl.txt.svn-base | 97 + .../.svn/text-base/stallman-en.txt.svn-base | 1838 ++++++++++++++++ .../.svn/text-base/stallman-pl.txt.svn-base | 1847 +++++++++++++++++ examples/txt/gpl-en.txt | 226 ++ examples/txt/gpl-pl.txt | 254 +++ examples/txt/help-en.txt | 1156 +++++++++++ examples/txt/help-pl.txt | 1227 +++++++++++ examples/txt/poznan-de.txt | 12 + examples/txt/poznan-pl.txt | 11 + examples/txt/poznan-small-de.txt | 3 + examples/txt/poznan-small-pl.txt | 3 + examples/txt/stallman-ch1-en.txt | 99 + examples/txt/stallman-ch1-pl.txt | 97 + examples/txt/stallman-en.txt | 1838 ++++++++++++++++ examples/txt/stallman-pl.txt | 1847 +++++++++++++++++ res/.svn/all-wcprops | 5 + res/.svn/entries | 31 + res/net/.svn/all-wcprops | 5 + res/net/.svn/entries | 38 + res/net/sourceforge/.svn/all-wcprops | 5 + res/net/sourceforge/.svn/entries | 38 + res/net/sourceforge/align/.svn/all-wcprops | 5 + res/net/sourceforge/align/.svn/entries | 38 + .../sourceforge/align/res/.svn/all-wcprops | 5 + res/net/sourceforge/align/res/.svn/entries | 41 + .../align/res/test/.svn/all-wcprops | 11 + .../sourceforge/align/res/test/.svn/entries | 103 + .../.svn/text-base/simpletext.al.svn-base | 25 + .../.svn/text-base/simpletext.tmx.svn-base | 28 + .../sourceforge/align/res/test/simpletext.al | 25 + .../sourceforge/align/res/test/simpletext.tmx | 28 + .../align/res/xml/.svn/all-wcprops | 5 + .../sourceforge/align/res/xml/.svn/entries | 137 ++ .../res/xml/.svn/text-base/al.xsd.svn-base | 35 + .../res/xml/.svn/text-base/tmx.xsd.svn-base | 268 +++ .../res/xml/.svn/text-base/xml.xsd.svn-base | 146 ++ res/net/sourceforge/align/res/xml/al.xsd | 35 + res/net/sourceforge/align/res/xml/tmx.xsd | 268 +++ res/net/sourceforge/align/res/xml/xml.xsd | 146 ++ result/.svn/all-wcprops | 5 + result/.svn/entries | 34 + result/content/.svn/all-wcprops | 5 + result/content/.svn/entries | 37 + .../normal-translation/.svn/all-wcprops | 11 + .../content/normal-translation/.svn/entries | 40 + .../.svn/text-base/stallman-ch1.al.svn-base | 1376 ++++++++++++ .../normal-translation/stallman-ch1.al | 1376 ++++++++++++ .../poisson-translation/.svn/all-wcprops | 23 + .../content/poisson-translation/.svn/entries | 64 + .../.svn/text-base/gpl.al.svn-base | 1813 ++++++++++++++++ .../.svn/text-base/poznan.al.svn-base | 314 +++ .../.svn/text-base/stallman-ch1.al.svn-base | 1451 +++++++++++++ result/content/poisson-translation/gpl.al | 1813 ++++++++++++++++ result/content/poisson-translation/poznan.al | 314 +++ .../poisson-translation/stallman-ch1.al | 1451 +++++++++++++ result/content/translation/.svn/all-wcprops | 17 + result/content/translation/.svn/entries | 52 + .../.svn/text-base/gpl.al.svn-base | 1810 ++++++++++++++++ .../.svn/text-base/stallman-ch1.al.svn-base | 0 result/content/translation/gpl.al | 1810 ++++++++++++++++ result/content/translation/stallman-ch1.al | 0 result/length/.svn/all-wcprops | 5 + result/length/.svn/entries | 34 + result/length/normal/.svn/all-wcprops | 17 + result/length/normal/.svn/entries | 52 + .../normal/.svn/text-base/gpl.al.svn-base | 1810 ++++++++++++++++ .../.svn/text-base/stallman-ch1.al.svn-base | 1423 +++++++++++++ result/length/normal/gpl.al | 1810 ++++++++++++++++ result/length/normal/stallman-ch1.al | 1423 +++++++++++++ result/length/poisson/.svn/all-wcprops | 23 + result/length/poisson/.svn/entries | 64 + .../poisson/.svn/text-base/gpl.al.svn-base | 1815 ++++++++++++++++ .../poisson/.svn/text-base/poznan.al.svn-base | 309 +++ .../.svn/text-base/stallman-ch1.al.svn-base | 1428 +++++++++++++ result/length/poisson/gpl.al | 1815 ++++++++++++++++ result/length/poisson/poznan.al | 309 +++ result/length/poisson/stallman-ch1.al | 1428 +++++++++++++ src/.svn/all-wcprops | 5 + src/.svn/entries | 31 + src/net/.svn/all-wcprops | 5 + src/net/.svn/entries | 31 + src/net/sourceforge/.svn/all-wcprops | 5 + src/net/sourceforge/.svn/entries | 31 + src/net/sourceforge/align/.svn/all-wcprops | 11 + src/net/sourceforge/align/.svn/entries | 104 + .../text-base/AlignTestSuite.java.svn-base | 28 + src/net/sourceforge/align/AlignTestSuite.java | 28 + .../align/calculator/.svn/all-wcprops | 23 + .../sourceforge/align/calculator/.svn/entries | 139 ++ .../.svn/text-base/Calculator.java.svn-base | 28 + .../text-base/CalculatorMock.java.svn-base | 24 + .../CalculatorTestSuite.java.svn-base | 20 + .../align/calculator/Calculator.java | 28 + .../align/calculator/CalculatorMock.java | 24 + .../align/calculator/CalculatorTestSuite.java | 20 + .../align/calculator/content/.svn/all-wcprops | 17 + .../align/calculator/content/.svn/entries | 96 + .../TranslationCalculator.java.svn-base | 5 + .../text-base/OracleCalculator.java.svn-base | 84 + .../TranslationCalculator.java.svn-base | 264 +++ .../calculator/content/OracleCalculator.java | 84 + .../content/TranslationCalculator.java | 264 +++ .../align/calculator/length/.svn/all-wcprops | 29 + .../align/calculator/length/.svn/entries | 167 ++ .../prop-base/LengthCalculator.java.svn-base | 5 + .../text-base/LengthCalculator.java.svn-base | 84 + ...NormalDistributionCalculator.java.svn-base | 89 + ...oissonDistributionCalculator.java.svn-base | 153 ++ ...onDistributionCalculatorTest.java.svn-base | 42 + .../calculator/length/LengthCalculator.java | 84 + .../length/NormalDistributionCalculator.java | 89 + .../length/PoissonDistributionCalculator.java | 153 ++ .../PoissonDistributionCalculatorTest.java | 42 + .../length/counter/.svn/all-wcprops | 23 + .../calculator/length/counter/.svn/entries | 130 ++ .../.svn/text-base/CharCounter.java.svn-base | 16 + .../.svn/text-base/Counter.java.svn-base | 19 + .../.svn/text-base/SplitCounter.java.svn-base | 40 + .../length/counter/CharCounter.java | 16 + .../calculator/length/counter/Counter.java | 19 + .../length/counter/SplitCounter.java | 40 + .../align/calculator/meta/.svn/all-wcprops | 23 + .../align/calculator/meta/.svn/entries | 130 ++ .../CompositeCalculator.java.svn-base | 35 + .../CompositeCalculatorTest.java.svn-base | 31 + .../text-base/MinimumCalculator.java.svn-base | 62 + .../calculator/meta/CompositeCalculator.java | 35 + .../meta/CompositeCalculatorTest.java | 31 + .../calculator/meta/MinimumCalculator.java | 62 + .../align/comparator/.svn/all-wcprops | 29 + .../sourceforge/align/comparator/.svn/entries | 142 ++ .../.svn/text-base/Comparator.java.svn-base | 325 +++ .../text-base/ComparatorTest.java.svn-base | 125 ++ .../ComparatorTestSuite.java.svn-base | 11 + .../.svn/text-base/Diff.java.svn-base | 88 + .../align/comparator/Comparator.java | 325 +++ .../align/comparator/ComparatorTest.java | 125 ++ .../align/comparator/ComparatorTestSuite.java | 11 + .../sourceforge/align/comparator/Diff.java | 88 + .../align/coretypes/.svn/all-wcprops | 29 + .../sourceforge/align/coretypes/.svn/entries | 171 ++ .../.svn/text-base/Alignment.java.svn-base | 182 ++ .../text-base/AlignmentTest.java.svn-base | 62 + .../.svn/text-base/Category.java.svn-base | 41 + .../text-base/CategoryDefaults.java.svn-base | 45 + .../align/coretypes/Alignment.java | 182 ++ .../align/coretypes/AlignmentTest.java | 62 + .../sourceforge/align/coretypes/Category.java | 41 + .../align/coretypes/CategoryDefaults.java | 45 + .../sourceforge/align/filter/.svn/all-wcprops | 17 + src/net/sourceforge/align/filter/.svn/entries | 111 + .../.svn/text-base/Filter.java.svn-base | 30 + .../text-base/FilterTestSuite.java.svn-base | 23 + src/net/sourceforge/align/filter/Filter.java | 30 + .../align/filter/FilterTestSuite.java | 23 + .../align/filter/aligner/.svn/all-wcprops | 41 + .../align/filter/aligner/.svn/entries | 235 +++ .../.svn/text-base/Aligner.java.svn-base | 44 + .../.svn/text-base/AlignerTest.java.svn-base | 58 + .../text-base/AlignerTestSuite.java.svn-base | 18 + ...AlignmentImpossibleException.java.svn-base | 30 + .../.svn/text-base/UnifyAligner.java.svn-base | 95 + .../text-base/UnifyAlignerTest.java.svn-base | 71 + .../align/filter/aligner/Aligner.java | 44 + .../align/filter/aligner/AlignerTest.java | 58 + .../filter/aligner/AlignerTestSuite.java | 18 + .../aligner/AlignmentImpossibleException.java | 30 + .../align/filter/aligner/UnifyAligner.java | 95 + .../filter/aligner/UnifyAlignerTest.java | 71 + .../filter/aligner/align/.svn/all-wcprops | 29 + .../align/filter/aligner/align/.svn/entries | 170 ++ .../text-base/AlignAlgorithm.java.svn-base | 36 + .../AlignAlgorithmMock.java.svn-base | 64 + .../AlignAlgorithmMockTest.java.svn-base | 72 + .../AlignAlgorithmTestSuite.java.svn-base | 22 + .../filter/aligner/align/AlignAlgorithm.java | 36 + .../aligner/align/AlignAlgorithmMock.java | 64 + .../aligner/align/AlignAlgorithmMockTest.java | 72 + .../align/AlignAlgorithmTestSuite.java | 22 + .../filter/aligner/align/hmm/.svn/all-wcprops | 23 + .../filter/aligner/align/hmm/.svn/entries | 139 ++ .../HmmAlignAlgorithmFactory.java.svn-base | 29 + .../HmmAlignAlgorithmTest.java.svn-base | 125 ++ .../hmm/.svn/text-base/Util.java.svn-base | 26 + .../align/hmm/HmmAlignAlgorithmFactory.java | 29 + .../align/hmm/HmmAlignAlgorithmTest.java | 125 ++ .../align/filter/aligner/align/hmm/Util.java | 26 + .../align/hmm/adaptive/.svn/all-wcprops | 11 + .../aligner/align/hmm/adaptive/.svn/entries | 62 + .../AdaptiveBandAlgorithm.java.svn-base | 176 ++ .../HmmAlignAlgorithmFactory.java.svn-base | 18 + .../hmm/adaptive/AdaptiveBandAlgorithm.java | 176 ++ .../aligner/align/hmm/fb/.svn/all-wcprops | 23 + .../filter/aligner/align/hmm/fb/.svn/entries | 130 ++ .../ForwardBackwardAlgorithm.java.svn-base | 274 +++ ...wardBackwardAlgorithmFactory.java.svn-base | 23 + ...ForwardBackwardAlgorithmTest.java.svn-base | 41 + .../hmm/fb/ForwardBackwardAlgorithm.java | 274 +++ .../fb/ForwardBackwardAlgorithmFactory.java | 23 + .../hmm/fb/ForwardBackwardAlgorithmTest.java | 41 + .../align/hmm/viterbi/.svn/all-wcprops | 29 + .../aligner/align/hmm/viterbi/.svn/entries | 164 ++ .../text-base/ViterbiAlgorithm.java.svn-base | 216 ++ .../ViterbiAlgorithmFactory.java.svn-base | 22 + .../ViterbiAlgorithmTest.java.svn-base | 40 + .../.svn/text-base/ViterbiData.java.svn-base | 57 + .../align/hmm/viterbi/ViterbiAlgorithm.java | 216 ++ .../hmm/viterbi/ViterbiAlgorithmFactory.java | 22 + .../hmm/viterbi/ViterbiAlgorithmTest.java | 40 + .../align/hmm/viterbi/ViterbiData.java | 57 + .../aligner/align/onetoone/.svn/all-wcprops | 17 + .../aligner/align/onetoone/.svn/entries | 96 + .../text-base/OneToOneAlgorithm.java.svn-base | 94 + .../OneToOneAlgorithmTest.java.svn-base | 111 + .../align/onetoone/OneToOneAlgorithm.java | 94 + .../align/onetoone/OneToOneAlgorithmTest.java | 111 + .../align/filter/macro/.svn/all-wcprops | 53 + .../align/filter/macro/.svn/entries | 300 +++ .../GaleAndChurchMacro.java.svn-base | 45 + .../macro/.svn/text-base/Macro.java.svn-base | 14 + .../text-base/MacroTestSuite.java.svn-base | 16 + .../.svn/text-base/MooreMacro.java.svn-base | 211 ++ .../text-base/MooreMacroTest.java.svn-base | 45 + .../.svn/text-base/PoissonMacro.java.svn-base | 46 + .../PoissonTranslationMacro.java.svn-base | 119 ++ .../text-base/TranslationMacro.java.svn-base | 109 + .../filter/macro/GaleAndChurchMacro.java | 45 + .../sourceforge/align/filter/macro/Macro.java | 14 + .../align/filter/macro/MacroTestSuite.java | 16 + .../align/filter/macro/MooreMacro.java | 211 ++ .../align/filter/macro/MooreMacroTest.java | 45 + .../align/filter/macro/PoissonMacro.java | 46 + .../filter/macro/PoissonTranslationMacro.java | 119 ++ .../align/filter/macro/TranslationMacro.java | 109 + .../align/filter/meta/.svn/all-wcprops | 41 + .../align/filter/meta/.svn/entries | 239 +++ .../prop-base/MetaTestSuite.java.svn-base | 5 + .../text-base/CompositeFilter.java.svn-base | 43 + .../CompositeFilterTest.java.svn-base | 71 + .../text-base/FilterDecorators.java.svn-base | 23 + ...ityAlignmentsFilterDecorator.java.svn-base | 57 + ...lignmentsFilterDecoratorTest.java.svn-base | 71 + .../text-base/MetaTestSuite.java.svn-base | 17 + .../align/filter/meta/CompositeFilter.java | 43 + .../filter/meta/CompositeFilterTest.java | 71 + .../align/filter/meta/FilterDecorators.java | 23 + ...eProbabilityAlignmentsFilterDecorator.java | 57 + ...babilityAlignmentsFilterDecoratorTest.java | 71 + .../align/filter/meta/MetaTestSuite.java | 17 + .../align/filter/modifier/.svn/all-wcprops | 17 + .../align/filter/modifier/.svn/entries | 99 + .../.svn/text-base/Modifier.java.svn-base | 59 + .../text-base/ModifierTestSuite.java.svn-base | 18 + .../align/filter/modifier/Modifier.java | 59 + .../filter/modifier/ModifierTestSuite.java | 18 + .../filter/modifier/modify/.svn/all-wcprops | 23 + .../align/filter/modifier/modify/.svn/entries | 139 ++ .../text-base/ModifyAlgorithm.java.svn-base | 24 + .../text-base/ModifyTestSuite.java.svn-base | 20 + .../NullModifyAlgorithm.java.svn-base | 22 + .../modifier/modify/ModifyAlgorithm.java | 24 + .../modifier/modify/ModifyTestSuite.java | 20 + .../modifier/modify/NullModifyAlgorithm.java | 22 + .../modifier/modify/clean/.svn/all-wcprops | 35 + .../filter/modifier/modify/clean/.svn/entries | 198 ++ .../text-base/CleanAlgorithm.java.svn-base | 43 + ...FilterNonWordsCleanAlgorithm.java.svn-base | 20 + .../LowercaseCleanAlgorithm.java.svn-base | 15 + .../TrimCleanAlgorithm.java.svn-base | 21 + ...UnifyRareWordsCleanAlgorithm.java.svn-base | 75 + .../modifier/modify/clean/CleanAlgorithm.java | 43 + .../clean/FilterNonWordsCleanAlgorithm.java | 20 + .../modify/clean/LowercaseCleanAlgorithm.java | 15 + .../modify/clean/TrimCleanAlgorithm.java | 21 + .../clean/UnifyRareWordsCleanAlgorithm.java | 75 + .../modifier/modify/merge/.svn/all-wcprops | 29 + .../filter/modifier/modify/merge/.svn/entries | 164 ++ .../text-base/MergeAlgorithm.java.svn-base | 31 + .../text-base/MergeTestSuite.java.svn-base | 16 + .../SeparatorMergeAlgorithm.java.svn-base | 55 + .../SeparatorMergeAlgorithmTest.java.svn-base | 70 + .../modifier/modify/merge/MergeAlgorithm.java | 31 + .../modifier/modify/merge/MergeTestSuite.java | 16 + .../modify/merge/SeparatorMergeAlgorithm.java | 55 + .../merge/SeparatorMergeAlgorithmTest.java | 70 + .../modifier/modify/split/.svn/all-wcprops | 77 + .../filter/modifier/modify/split/.svn/entries | 436 ++++ ...WordsSplitAlgorithmDecorator.java.svn-base | 42 + .../ParagraphSplitAlgorithm.java.svn-base | 32 + .../SentenceSplitAlgorithm.java.svn-base | 52 + .../SentenceSplitAlgorithmTest.java.svn-base | 43 + .../text-base/SimpleSplitter.java.svn-base | 180 ++ .../text-base/SplitAlgorithm.java.svn-base | 38 + .../SplitAlgorithmMock.java.svn-base | 46 + .../SplitAlgorithmMockTest.java.svn-base | 32 + .../text-base/SplitTestSuite.java.svn-base | 20 + .../text-base/SrxSplitAlgorithm.java.svn-base | 52 + .../WordSplitAlgorithm.java.svn-base | 42 + .../WordSplitAlgorithmTest.java.svn-base | 51 + ...FilterNonWordsSplitAlgorithmDecorator.java | 42 + .../modify/split/ParagraphSplitAlgorithm.java | 32 + .../modify/split/SentenceSplitAlgorithm.java | 52 + .../split/SentenceSplitAlgorithmTest.java | 43 + .../modifier/modify/split/SimpleSplitter.java | 180 ++ .../modifier/modify/split/SplitAlgorithm.java | 38 + .../modify/split/SplitAlgorithmMock.java | 46 + .../modify/split/SplitAlgorithmMockTest.java | 32 + .../modifier/modify/split/SplitTestSuite.java | 20 + .../modify/split/SrxSplitAlgorithm.java | 52 + .../modify/split/WordSplitAlgorithm.java | 42 + .../modify/split/WordSplitAlgorithmTest.java | 51 + .../align/filter/selector/.svn/all-wcprops | 65 + .../align/filter/selector/.svn/entries | 368 ++++ .../DifferenceSelector.java.svn-base | 40 + .../DifferenceSelectorTest.java.svn-base | 39 + .../text-base/FractionSelector.java.svn-base | 73 + .../FractionSelectorTest.java.svn-base | 92 + .../IntersectionSelector.java.svn-base | 41 + .../IntersectionSelectorTest.java.svn-base | 40 + .../text-base/OneToOneSelector.java.svn-base | 34 + .../OneToOneSelectorTest.java.svn-base | 57 + .../ProbabilitySelector.java.svn-base | 46 + .../text-base/SelectorTestSuite.java.svn-base | 16 + .../filter/selector/DifferenceSelector.java | 40 + .../selector/DifferenceSelectorTest.java | 39 + .../filter/selector/FractionSelector.java | 73 + .../filter/selector/FractionSelectorTest.java | 92 + .../filter/selector/IntersectionSelector.java | 41 + .../selector/IntersectionSelectorTest.java | 40 + .../filter/selector/OneToOneSelector.java | 34 + .../filter/selector/OneToOneSelectorTest.java | 57 + .../filter/selector/ProbabilitySelector.java | 46 + .../filter/selector/SelectorTestSuite.java | 16 + .../align/formatter/.svn/all-wcprops | 71 + .../sourceforge/align/formatter/.svn/entries | 402 ++++ .../prop-base/HtmlFormatter.java.svn-base | 5 + .../.svn/text-base/AlFormatter.java.svn-base | 56 + .../text-base/AlFormatterTest.java.svn-base | 53 + .../.svn/text-base/Formatter.java.svn-base | 25 + .../FormatterTestSuite.java.svn-base | 17 + .../text-base/HtmlFormatter.java.svn-base | 62 + .../text-base/InfoFormatter.java.svn-base | 124 ++ .../PlaintextFormatter.java.svn-base | 61 + .../PresentationFormatter.java.svn-base | 156 ++ .../PresentationFormatterTest.java.svn-base | 60 + .../.svn/text-base/TmxFormatter.java.svn-base | 100 + .../text-base/TmxFormatterTest.java.svn-base | 58 + .../align/formatter/AlFormatter.java | 56 + .../align/formatter/AlFormatterTest.java | 53 + .../align/formatter/Formatter.java | 25 + .../align/formatter/FormatterTestSuite.java | 17 + .../align/formatter/HtmlFormatter.java | 62 + .../align/formatter/InfoFormatter.java | 124 ++ .../align/formatter/PlaintextFormatter.java | 61 + .../formatter/PresentationFormatter.java | 156 ++ .../formatter/PresentationFormatterTest.java | 60 + .../align/formatter/TmxFormatter.java | 100 + .../align/formatter/TmxFormatterTest.java | 58 + .../sourceforge/align/matrix/.svn/all-wcprops | 65 + src/net/sourceforge/align/matrix/.svn/entries | 368 ++++ .../.svn/text-base/BandMatrix.java.svn-base | 122 ++ .../text-base/BandMatrixFactory.java.svn-base | 37 + .../BandMatrixIterator.java.svn-base | 86 + .../.svn/text-base/FullMatrix.java.svn-base | 57 + .../text-base/FullMatrixFactory.java.svn-base | 15 + .../FullMatrixIterator.java.svn-base | 70 + .../.svn/text-base/Matrix.java.svn-base | 52 + .../text-base/MatrixFactory.java.svn-base | 14 + .../text-base/MatrixIterator.java.svn-base | 71 + ...PositionOutsideBandException.java.svn-base | 20 + .../sourceforge/align/matrix/BandMatrix.java | 122 ++ .../align/matrix/BandMatrixFactory.java | 37 + .../align/matrix/BandMatrixIterator.java | 86 + .../sourceforge/align/matrix/FullMatrix.java | 57 + .../align/matrix/FullMatrixFactory.java | 15 + .../align/matrix/FullMatrixIterator.java | 70 + src/net/sourceforge/align/matrix/Matrix.java | 52 + .../align/matrix/MatrixFactory.java | 14 + .../align/matrix/MatrixIterator.java | 71 + .../matrix/PositionOutsideBandException.java | 20 + .../sourceforge/align/model/.svn/all-wcprops | 23 + src/net/sourceforge/align/model/.svn/entries | 142 ++ .../ModelParseException.java.svn-base | 20 + .../text-base/ModelTestSuite.java.svn-base | 22 + .../model/.svn/text-base/Util.java.svn-base | 28 + .../align/model/ModelParseException.java | 20 + .../align/model/ModelTestSuite.java | 22 + src/net/sourceforge/align/model/Util.java | 28 + .../align/model/language/.svn/all-wcprops | 41 + .../align/model/language/.svn/entries | 232 +++ .../text-base/LanguageModel.java.svn-base | 40 + .../text-base/LanguageModelUtil.java.svn-base | 65 + .../LanguageModelUtilTest.java.svn-base | 52 + .../text-base/LanguageTestSuite.java.svn-base | 16 + .../MutableLanguageModel.java.svn-base | 106 + .../MutableLanguageModelTest.java.svn-base | 30 + .../align/model/language/LanguageModel.java | 40 + .../model/language/LanguageModelUtil.java | 65 + .../model/language/LanguageModelUtilTest.java | 52 + .../model/language/LanguageTestSuite.java | 16 + .../model/language/MutableLanguageModel.java | 106 + .../language/MutableLanguageModelTest.java | 30 + .../align/model/length/.svn/all-wcprops | 41 + .../align/model/length/.svn/entries | 232 +++ .../.svn/text-base/LengthModel.java.svn-base | 33 + .../text-base/LengthModelUtil.java.svn-base | 28 + .../LengthModelUtilTest.java.svn-base | 32 + .../text-base/LengthTestSuite.java.svn-base | 16 + .../MutableLengthModel.java.svn-base | 94 + .../MutableLengthModelTest.java.svn-base | 31 + .../align/model/length/LengthModel.java | 33 + .../align/model/length/LengthModelUtil.java | 28 + .../model/length/LengthModelUtilTest.java | 32 + .../align/model/length/LengthTestSuite.java | 16 + .../model/length/MutableLengthModel.java | 94 + .../model/length/MutableLengthModelTest.java | 31 + .../align/model/translation/.svn/all-wcprops | 95 + .../align/model/translation/.svn/entries | 538 +++++ .../text-base/EmptySourceData.java.svn-base | 33 + .../text-base/InitialSourceData.java.svn-base | 33 + .../InitialTranslationModel.java.svn-base | 48 + .../text-base/MutableSourceData.java.svn-base | 111 + .../MutableSourceDataTest.java.svn-base | 45 + .../MutableTranslationModel.java.svn-base | 103 + .../MutableTranslationModelTest.java.svn-base | 37 + .../.svn/text-base/SourceData.java.svn-base | 28 + .../.svn/text-base/TargetData.java.svn-base | 39 + ...getDataProbabilityComparator.java.svn-base | 27 + ...ataProbabilityComparatorTest.java.svn-base | 30 + .../text-base/TranslationModel.java.svn-base | 37 + .../TranslationModelUtil.java.svn-base | 180 ++ .../TranslationModelUtilTest.java.svn-base | 150 ++ .../TranslationTestSuite.java.svn-base | 17 + .../model/translation/EmptySourceData.java | 33 + .../model/translation/InitialSourceData.java | 33 + .../translation/InitialTranslationModel.java | 48 + .../model/translation/MutableSourceData.java | 111 + .../translation/MutableSourceDataTest.java | 45 + .../translation/MutableTranslationModel.java | 103 + .../MutableTranslationModelTest.java | 37 + .../align/model/translation/SourceData.java | 28 + .../align/model/translation/TargetData.java | 39 + .../TargetDataProbabilityComparator.java | 27 + .../TargetDataProbabilityComparatorTest.java | 30 + .../model/translation/TranslationModel.java | 37 + .../translation/TranslationModelUtil.java | 180 ++ .../translation/TranslationModelUtilTest.java | 150 ++ .../translation/TranslationTestSuite.java | 17 + .../align/model/vocabulary/.svn/all-wcprops | 35 + .../align/model/vocabulary/.svn/entries | 198 ++ .../.svn/text-base/Vocabulary.java.svn-base | 160 ++ .../text-base/VocabularyTest.java.svn-base | 37 + .../VocabularyTestSuite.java.svn-base | 16 + .../text-base/VocabularyUtil.java.svn-base | 228 ++ .../VocabularyUtilTest.java.svn-base | 140 ++ .../align/model/vocabulary/Vocabulary.java | 160 ++ .../model/vocabulary/VocabularyTest.java | 37 + .../model/vocabulary/VocabularyTestSuite.java | 16 + .../model/vocabulary/VocabularyUtil.java | 228 ++ .../model/vocabulary/VocabularyUtilTest.java | 140 ++ .../sourceforge/align/parser/.svn/all-wcprops | 59 + src/net/sourceforge/align/parser/.svn/entries | 334 +++ .../.svn/text-base/AlParser.java.svn-base | 59 + .../.svn/text-base/AlParserTest.java.svn-base | 51 + .../.svn/text-base/Parser.java.svn-base | 23 + .../text-base/ParserTestSuite.java.svn-base | 17 + .../text-base/PlaintextParser.java.svn-base | 72 + .../PlaintextParserTest.java.svn-base | 49 + .../text-base/TmxParseException.java.svn-base | 20 + .../.svn/text-base/TmxParser.java.svn-base | 139 ++ .../text-base/TmxParserTest.java.svn-base | 72 + .../sourceforge/align/parser/AlParser.java | 59 + .../align/parser/AlParserTest.java | 51 + src/net/sourceforge/align/parser/Parser.java | 23 + .../align/parser/ParserTestSuite.java | 17 + .../align/parser/PlaintextParser.java | 72 + .../align/parser/PlaintextParserTest.java | 49 + .../align/parser/TmxParseException.java | 20 + .../sourceforge/align/parser/TmxParser.java | 139 ++ .../align/parser/TmxParserTest.java | 72 + .../align/progress/.svn/all-wcprops | 29 + .../sourceforge/align/progress/.svn/entries | 188 ++ .../text-base/ProgressManager.java.svn-base | 115 + .../text-base/ProgressMeter.java.svn-base | 133 ++ .../text-base/ProgressObserver.java.svn-base | 33 + .../WriterProgressObserver.java.svn-base | 102 + .../align/progress/ProgressManager.java | 115 + .../align/progress/ProgressMeter.java | 133 ++ .../align/progress/ProgressObserver.java | 33 + .../progress/WriterProgressObserver.java | 102 + src/net/sourceforge/align/ui/.svn/all-wcprops | 5 + src/net/sourceforge/align/ui/.svn/entries | 31 + .../align/ui/console/.svn/all-wcprops | 11 + .../sourceforge/align/ui/console/.svn/entries | 65 + .../.svn/text-base/Maligna.java.svn-base | 80 + .../sourceforge/align/ui/console/Maligna.java | 80 + .../align/ui/console/command/.svn/all-wcprops | 77 + .../align/ui/console/command/.svn/entries | 395 ++++ .../text-base/AbstractCommand.java.svn-base | 202 ++ .../.svn/text-base/AlignCommand.java.svn-base | 352 ++++ .../.svn/text-base/Command.java.svn-base | 10 + .../text-base/CommandFactory.java.svn-base | 61 + .../text-base/CompareCommand.java.svn-base | 97 + .../text-base/FormatCommand.java.svn-base | 95 + .../.svn/text-base/MacroCommand.java.svn-base | 59 + .../.svn/text-base/ModelCommand.java.svn-base | 79 + .../text-base/ModifyCommand.java.svn-base | 177 ++ .../.svn/text-base/ParseCommand.java.svn-base | 105 + .../text-base/SelectCommand.java.svn-base | 85 + .../.svn/text-base/TestCommand.java.svn-base | 33 + .../ui/console/command/AbstractCommand.java | 202 ++ .../ui/console/command/AlignCommand.java | 352 ++++ .../align/ui/console/command/Command.java | 10 + .../ui/console/command/CommandFactory.java | 61 + .../ui/console/command/CompareCommand.java | 97 + .../ui/console/command/FormatCommand.java | 95 + .../ui/console/command/MacroCommand.java | 59 + .../ui/console/command/ModelCommand.java | 79 + .../ui/console/command/ModifyCommand.java | 177 ++ .../ui/console/command/ParseCommand.java | 105 + .../ui/console/command/SelectCommand.java | 85 + .../align/ui/console/command/TestCommand.java | 33 + .../command/exception/.svn/all-wcprops | 41 + .../ui/console/command/exception/.svn/entries | 100 + .../text-base/CommandException.java.svn-base | 19 + .../MissingParameterException.java.svn-base | 11 + .../ParameterFormatException.java.svn-base | 11 + .../ParametersParseException.java.svn-base | 11 + .../UnknownParameterException.java.svn-base | 11 + .../WrongArgumentCountException.java.svn-base | 11 + .../command/exception/CommandException.java | 19 + .../exception/MissingParameterException.java | 11 + .../exception/ParameterFormatException.java | 11 + .../exception/ParametersParseException.java | 11 + .../exception/UnknownParameterException.java | 11 + .../WrongArgumentCountException.java | 11 + .../sourceforge/align/util/.svn/all-wcprops | 53 + src/net/sourceforge/align/util/.svn/entries | 306 +++ .../IORuntimeException.java.svn-base | 17 + .../ImpossibleException.java.svn-base | 28 + .../util/.svn/text-base/Pair.java.svn-base | 47 + .../ResourceNotFoundException.java.svn-base | 21 + .../util/.svn/text-base/Util.java.svn-base | 374 ++++ .../.svn/text-base/UtilTest.java.svn-base | 106 + .../text-base/UtilTestSuite.java.svn-base | 16 + .../util/.svn/text-base/Version.java.svn-base | 89 + .../align/util/IORuntimeException.java | 17 + .../align/util/ImpossibleException.java | 28 + src/net/sourceforge/align/util/Pair.java | 47 + .../align/util/ResourceNotFoundException.java | 21 + src/net/sourceforge/align/util/Util.java | 374 ++++ src/net/sourceforge/align/util/UtilTest.java | 106 + .../sourceforge/align/util/UtilTestSuite.java | 16 + src/net/sourceforge/align/util/Version.java | 89 + .../align/util/bind/.svn/all-wcprops | 35 + .../sourceforge/align/util/bind/.svn/entries | 204 ++ .../AlMarshallerUnmarshaller.java.svn-base | 51 + .../text-base/BindException.java.svn-base | 24 + .../MarshallerUnmarshaller.java.svn-base | 86 + .../QuietValidationEventHandler.java.svn-base | 33 + .../TmxMarshallerUnmarshaller.java.svn-base | 57 + .../util/bind/AlMarshallerUnmarshaller.java | 51 + .../align/util/bind/BindException.java | 24 + .../util/bind/MarshallerUnmarshaller.java | 86 + .../bind/QuietValidationEventHandler.java | 33 + .../util/bind/TmxMarshallerUnmarshaller.java | 57 + .../align/util/bind/al/.svn/all-wcprops | 29 + .../align/util/bind/al/.svn/entries | 76 + .../al/.svn/text-base/Alignment.java.svn-base | 126 ++ .../text-base/Alignmentlist.java.svn-base | 77 + .../text-base/ObjectFactory.java.svn-base | 96 + .../.svn/text-base/Segmentlist.java.svn-base | 75 + .../align/util/bind/al/Alignment.java | 126 ++ .../align/util/bind/al/Alignmentlist.java | 77 + .../align/util/bind/al/ObjectFactory.java | 96 + .../align/util/bind/al/Segmentlist.java | 75 + .../align/util/bind/tmx/.svn/all-wcprops | 113 + .../align/util/bind/tmx/.svn/entries | 244 +++ .../tmx/.svn/text-base/Body.java.svn-base | 77 + .../bind/tmx/.svn/text-base/Bpt.java.svn-base | 164 ++ .../bind/tmx/.svn/text-base/Ept.java.svn-base | 110 + .../tmx/.svn/text-base/Header.java.svn-base | 425 ++++ .../bind/tmx/.svn/text-base/Hi.java.svn-base | 155 ++ .../bind/tmx/.svn/text-base/It.java.svn-base | 174 ++ .../bind/tmx/.svn/text-base/Map.java.svn-base | 148 ++ .../tmx/.svn/text-base/Note.java.svn-base | 133 ++ .../text-base/ObjectFactory.java.svn-base | 175 ++ .../bind/tmx/.svn/text-base/Ph.java.svn-base | 164 ++ .../tmx/.svn/text-base/Prop.java.svn-base | 160 ++ .../bind/tmx/.svn/text-base/Seg.java.svn-base | 100 + .../bind/tmx/.svn/text-base/Sub.java.svn-base | 155 ++ .../bind/tmx/.svn/text-base/Tmx.java.svn-base | 127 ++ .../bind/tmx/.svn/text-base/Tu.java.svn-base | 511 +++++ .../bind/tmx/.svn/text-base/Tuv.java.svn-base | 440 ++++ .../bind/tmx/.svn/text-base/Ude.java.svn-base | 134 ++ .../bind/tmx/.svn/text-base/Ut.java.svn-base | 110 + .../sourceforge/align/util/bind/tmx/Body.java | 77 + .../sourceforge/align/util/bind/tmx/Bpt.java | 164 ++ .../sourceforge/align/util/bind/tmx/Ept.java | 110 + .../align/util/bind/tmx/Header.java | 425 ++++ .../sourceforge/align/util/bind/tmx/Hi.java | 155 ++ .../sourceforge/align/util/bind/tmx/It.java | 174 ++ .../sourceforge/align/util/bind/tmx/Map.java | 148 ++ .../sourceforge/align/util/bind/tmx/Note.java | 133 ++ .../align/util/bind/tmx/ObjectFactory.java | 175 ++ .../sourceforge/align/util/bind/tmx/Ph.java | 164 ++ .../sourceforge/align/util/bind/tmx/Prop.java | 160 ++ .../sourceforge/align/util/bind/tmx/Seg.java | 100 + .../sourceforge/align/util/bind/tmx/Sub.java | 155 ++ .../sourceforge/align/util/bind/tmx/Tmx.java | 127 ++ .../sourceforge/align/util/bind/tmx/Tu.java | 511 +++++ .../sourceforge/align/util/bind/tmx/Tuv.java | 440 ++++ .../sourceforge/align/util/bind/tmx/Ude.java | 134 ++ .../sourceforge/align/util/bind/tmx/Ut.java | 110 + .../align/util/date/.svn/all-wcprops | 17 + .../sourceforge/align/util/date/.svn/entries | 96 + .../.svn/text-base/DateParser.java.svn-base | 309 +++ .../InvalidDateException.java.svn-base | 17 + .../align/util/date/DateParser.java | 309 +++ .../align/util/date/InvalidDateException.java | 17 + trash/.svn/all-wcprops | 287 +++ trash/.svn/entries | 976 +++++++++ trash/.svn/prop-base/align.tar.gz.svn-base | 5 + .../loomchild-util-1.3.9.jar.svn-base | 9 + .../text-base/AbstractAligner.java.svn-base | 56 + trash/.svn/text-base/AlignJob.java.svn-base | 29 + .../text-base/AlignmentTest.java.svn-base | 63 + .../.svn/text-base/ChildRegion.java.svn-base | 33 + .../CommonAlgorithmTest.java.svn-base | 89 + .../.svn/text-base/DOMXmlParser.java.svn-base | 106 + trash/.svn/text-base/Entry.java.svn-base | 37 + .../FormatterException.java.svn-base | 30 + .../IgnoreDTDEntityResolver.java.svn-base | 20 + .../.svn/text-base/LanguageRule.java.svn-base | 77 + .../LengthBasedAlgorithmTest.java.svn-base | 40 + .../text-base/LexiconAligner.java.svn-base | 51 + trash/.svn/text-base/Main.java.svn-base | 25 + .../text-base/MooreCategoryList.java.svn-base | 28 + .../.svn/text-base/ParentRegion.java.svn-base | 68 + trash/.svn/text-base/Parser.java.svn-base | 11 + .../text-base/ParserException.java.svn-base | 15 + .../text-base/PlaintextParser.java.svn-base | 69 + .../PlaintextParserOld.java.svn-base | 66 + .../PlaintextParserOldTest.java.svn-base | 31 + .../PlaintextParserTest.java.svn-base | 62 + trash/.svn/text-base/Region.java.svn-base | 66 + trash/.svn/text-base/RegionInt.java.svn-base | 32 + trash/.svn/text-base/RegionOld.java.svn-base | 43 + .../.svn/text-base/Segamentator.java.svn-base | 20 + .../SentenceSegmentator.java.svn-base | 25 + .../SeparatorSegmentator.java.svn-base | 25 + .../text-base/SimpleTaskTest.java.svn-base | 103 + .../text-base/SrxSplitAlgorithm.java.svn-base | 44 + .../SrxSplitAlgorithmImpl.java.svn-base | 44 + .../SrxSplitAlgorithmMock.java.svn-base | 17 + trash/.svn/text-base/Trainer.java.svn-base | 35 + .../.svn/text-base/Translation.java.svn-base | 23 + .../WordNotFoundException.java.svn-base | 13 + .../text-base/XmlErrorHandler.java.svn-base | 34 + trash/.svn/text-base/XmlHandler.java.svn-base | 82 + trash/.svn/text-base/XmlParser.java.svn-base | 49 + .../text-base/XmlParserTest.java.svn-base | 40 + trash/.svn/text-base/align.bat.svn-base | 3 + trash/.svn/text-base/align.tar.gz.svn-base | Bin 0 -> 198660 bytes trash/.svn/text-base/documentx.xml.svn-base | 9 + .../loomchild-util-1.3.9.jar.svn-base | Bin 0 -> 75616 bytes trash/.svn/text-base/moore.txt.svn-base | 26 + trash/.svn/text-base/moore2.txt.svn-base | 93 + .../.svn/text-base/readme_jimmy.htm.svn-base | 126 ++ trash/.svn/text-base/simpleinput.txt.svn-base | 4 + trash/.svn/text-base/trash.txt.svn-base | 35 + trash/AbstractAligner.java | 56 + trash/AlignJob.java | 29 + trash/AlignmentTest.java | 63 + trash/ChildRegion.java | 33 + trash/CommonAlgorithmTest.java | 89 + trash/DOMXmlParser.java | 106 + trash/Entry.java | 37 + trash/FormatterException.java | 30 + trash/IgnoreDTDEntityResolver.java | 20 + trash/LanguageRule.java | 77 + trash/LengthBasedAlgorithmTest.java | 40 + trash/LexiconAligner.java | 51 + trash/Main.java | 25 + trash/MooreCategoryList.java | 28 + trash/ParentRegion.java | 68 + trash/Parser.java | 11 + trash/ParserException.java | 15 + trash/PlaintextParser.java | 69 + trash/PlaintextParserOld.java | 66 + trash/PlaintextParserOldTest.java | 31 + trash/PlaintextParserTest.java | 62 + trash/Region.java | 66 + trash/RegionInt.java | 32 + trash/RegionOld.java | 43 + trash/Segamentator.java | 20 + trash/SentenceSegmentator.java | 25 + trash/SeparatorSegmentator.java | 25 + trash/SimpleTaskTest.java | 103 + trash/SrxSplitAlgorithm.java | 44 + trash/SrxSplitAlgorithmImpl.java | 44 + trash/SrxSplitAlgorithmMock.java | 17 + trash/Trainer.java | 35 + trash/Translation.java | 23 + trash/WordNotFoundException.java | 13 + trash/XmlErrorHandler.java | 34 + trash/XmlHandler.java | 82 + trash/XmlParser.java | 49 + trash/XmlParserTest.java | 40 + trash/align.bat | 3 + trash/align.tar.gz | Bin 0 -> 198660 bytes trash/comparatornew/.svn/all-wcprops | 35 + trash/comparatornew/.svn/entries | 88 + .../.svn/text-base/Comparator.java.svn-base | 17 + .../ComparatorTestSuite.java.svn-base | 11 + .../.svn/text-base/Diff.java.svn-base | 34 + .../SequentialComparator.java.svn-base | 58 + .../SequentialComparatorTest.java.svn-base | 90 + trash/comparatornew/Comparator.java | 17 + trash/comparatornew/ComparatorTestSuite.java | 11 + trash/comparatornew/Diff.java | 34 + trash/comparatornew/SequentialComparator.java | 58 + .../SequentialComparatorTest.java | 90 + trash/comparatorold/.svn/all-wcprops | 35 + trash/comparatorold/.svn/entries | 88 + .../.svn/text-base/Comparator.java.svn-base | 17 + .../ComparatorTestSuite.java.svn-base | 15 + .../text-base/CompareResult.java.svn-base | 33 + .../SequentialComparator.java.svn-base | 109 + .../SequentialComparatorTest.java.svn-base | 59 + trash/comparatorold/Comparator.java | 17 + trash/comparatorold/ComparatorTestSuite.java | 15 + trash/comparatorold/CompareResult.java | 33 + trash/comparatorold/SequentialComparator.java | 109 + .../SequentialComparatorTest.java | 59 + trash/documentx.xml | 9 + trash/example/.svn/all-wcprops | 29 + trash/example/.svn/entries | 80 + .../example/.svn/prop-base/example2a.svn-base | 5 + .../example/.svn/prop-base/example2b.svn-base | 5 + .../example/.svn/prop-base/example2c.svn-base | 5 + .../example/.svn/prop-base/example2d.svn-base | 5 + .../example/.svn/text-base/example2a.svn-base | 9 + .../example/.svn/text-base/example2b.svn-base | 6 + .../example/.svn/text-base/example2c.svn-base | 6 + .../example/.svn/text-base/example2d.svn-base | 6 + trash/example/example2a | 9 + trash/example/example2b | 6 + trash/example/example2c | 6 + trash/example/example2d | 6 + trash/moore.txt | 26 + trash/moore2.txt | 93 + trash/readme_jimmy.htm | 126 ++ trash/simpleinput.txt | 4 + trash/task/.svn/all-wcprops | 5 + trash/task/.svn/entries | 205 ++ .../text-base/CompositeTask.java.svn-base | 108 + .../text-base/CompositeTaskTest.java.svn-base | 7 + .../.svn/text-base/SimpleTask.java.svn-base | 65 + .../text-base/SimpleTaskTest.java.svn-base | 33 + trash/task/.svn/text-base/Task.java.svn-base | 39 + trash/task/CompositeTask.java | 108 + trash/task/CompositeTaskTest.java | 7 + trash/task/SimpleTask.java | 65 + trash/task/SimpleTaskTest.java | 33 + trash/task/Task.java | 39 + trash/trash.txt | 35 + trash/vocabulary/.svn/all-wcprops | 29 + trash/vocabulary/.svn/entries | 76 + .../.svn/text-base/Vocabulary.java.svn-base | 97 + .../text-base/VocabularyTest.java.svn-base | 30 + .../WordIdNotFoundException.java.svn-base | 13 + .../WordNotFoundException.java.svn-base | 13 + trash/vocabulary/Vocabulary.java | 97 + trash/vocabulary/VocabularyTest.java | 30 + trash/vocabulary/WordIdNotFoundException.java | 13 + trash/vocabulary/WordNotFoundException.java | 13 + trash/xpath/.svn/all-wcprops | 35 + trash/xpath/.svn/entries | 110 + trash/xpath/.svn/text-base/Util.java.svn-base | 31 + .../.svn/text-base/XPathParser.java.svn-base | 94 + .../XPathParserException.java.svn-base | 32 + .../text-base/XPathParserTest.java.svn-base | 31 + .../.svn/text-base/simpletext.xml.svn-base | 10 + trash/xpath/Util.java | 31 + trash/xpath/XPathParser.java | 94 + trash/xpath/XPathParserException.java | 32 + trash/xpath/XPathParserTest.java | 31 + trash/xpath/simpletext.xml | 10 + 874 files changed, 113109 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 build.number create mode 100755 build.properties create mode 100755 build.xml create mode 100644 doc/.svn/all-wcprops create mode 100644 doc/.svn/entries create mode 100644 doc/.svn/text-base/authors.html.svn-base create mode 100755 doc/.svn/text-base/copying.html.svn-base create mode 100644 doc/.svn/text-base/history.html.svn-base create mode 100644 doc/.svn/text-base/readme.html.svn-base create mode 100755 doc/authors.html create mode 100755 doc/copying.html create mode 100755 doc/history.html create mode 100755 doc/readme.html create mode 100644 doc/tech/.svn/all-wcprops create mode 100644 doc/tech/.svn/entries create mode 100644 doc/tech/.svn/prop-base/moore.txt.svn-base create mode 100644 doc/tech/.svn/prop-base/moore2.txt.svn-base create mode 100755 doc/tech/.svn/text-base/ideas.txt.svn-base create mode 100755 doc/tech/.svn/text-base/moore.txt.svn-base create mode 100755 doc/tech/.svn/text-base/moore2.txt.svn-base create mode 100755 doc/tech/.svn/text-base/todo.txt.svn-base create mode 100755 doc/tech/ideas.txt create mode 100755 doc/tech/moore.txt create mode 100755 doc/tech/moore2.txt create mode 100755 doc/tech/todo.txt create mode 100644 examples/.svn/all-wcprops create mode 100644 examples/.svn/entries create mode 100644 examples/align/.svn/all-wcprops create mode 100644 examples/align/.svn/entries create mode 100644 examples/align/human/.svn/all-wcprops create mode 100644 examples/align/human/.svn/entries create mode 100755 examples/align/human/.svn/text-base/gpl.al.svn-base create mode 100755 examples/align/human/.svn/text-base/poznan-oracle.al.svn-base create mode 100755 examples/align/human/.svn/text-base/poznan.al.svn-base create mode 100755 examples/align/human/.svn/text-base/stallman-ch1.al.svn-base create mode 100755 examples/align/human/gpl.al create mode 100755 examples/align/human/poznan-oracle.al create mode 100755 examples/align/human/poznan.al create mode 100755 examples/align/human/stallman-ch1.al create mode 100644 examples/align/moore/.svn/all-wcprops create mode 100644 examples/align/moore/.svn/entries create mode 100755 examples/align/moore/.svn/text-base/gpl.al.svn-base create mode 100755 examples/align/moore/.svn/text-base/poznan.al.svn-base create mode 100755 examples/align/moore/.svn/text-base/stallman-ch1.al.svn-base create mode 100755 examples/align/moore/gpl.al create mode 100644 examples/align/moore/poznan.al create mode 100755 examples/align/moore/stallman-ch1.al create mode 100644 examples/script/.svn/all-wcprops create mode 100644 examples/script/.svn/entries create mode 100644 examples/script/.svn/prop-base/example1.svn-base create mode 100644 examples/script/.svn/prop-base/example2.svn-base create mode 100644 examples/script/.svn/prop-base/example3.svn-base create mode 100755 examples/script/.svn/text-base/example1.bat.svn-base create mode 100755 examples/script/.svn/text-base/example1.svn-base create mode 100755 examples/script/.svn/text-base/example2.bat.svn-base create mode 100755 examples/script/.svn/text-base/example2.svn-base create mode 100755 examples/script/.svn/text-base/example3.bat.svn-base create mode 100755 examples/script/.svn/text-base/example3.svn-base create mode 100755 examples/script/example1 create mode 100755 examples/script/example1.bat create mode 100755 examples/script/example2 create mode 100755 examples/script/example2.bat create mode 100755 examples/script/example3 create mode 100755 examples/script/example3.bat create mode 100644 examples/split/.svn/all-wcprops create mode 100644 examples/split/.svn/entries create mode 100755 examples/split/.svn/text-base/gpl.al.svn-base create mode 100755 examples/split/.svn/text-base/poznan.al.svn-base create mode 100755 examples/split/.svn/text-base/stallman-ch1.al.svn-base create mode 100755 examples/split/gpl.al create mode 100755 examples/split/poznan.al create mode 100755 examples/split/stallman-ch1.al create mode 100644 examples/txt/.svn/all-wcprops create mode 100644 examples/txt/.svn/entries create mode 100755 examples/txt/.svn/text-base/gpl-en.txt.svn-base create mode 100755 examples/txt/.svn/text-base/gpl-pl.txt.svn-base create mode 100755 examples/txt/.svn/text-base/help-en.txt.svn-base create mode 100755 examples/txt/.svn/text-base/help-pl.txt.svn-base create mode 100755 examples/txt/.svn/text-base/poznan-de.txt.svn-base create mode 100755 examples/txt/.svn/text-base/poznan-pl.txt.svn-base create mode 100755 examples/txt/.svn/text-base/poznan-small-de.txt.svn-base create mode 100755 examples/txt/.svn/text-base/poznan-small-pl.txt.svn-base create mode 100755 examples/txt/.svn/text-base/stallman-ch1-en.txt.svn-base create mode 100755 examples/txt/.svn/text-base/stallman-ch1-pl.txt.svn-base create mode 100755 examples/txt/.svn/text-base/stallman-en.txt.svn-base create mode 100755 examples/txt/.svn/text-base/stallman-pl.txt.svn-base create mode 100755 examples/txt/gpl-en.txt create mode 100755 examples/txt/gpl-pl.txt create mode 100755 examples/txt/help-en.txt create mode 100755 examples/txt/help-pl.txt create mode 100755 examples/txt/poznan-de.txt create mode 100755 examples/txt/poznan-pl.txt create mode 100755 examples/txt/poznan-small-de.txt create mode 100755 examples/txt/poznan-small-pl.txt create mode 100755 examples/txt/stallman-ch1-en.txt create mode 100755 examples/txt/stallman-ch1-pl.txt create mode 100755 examples/txt/stallman-en.txt create mode 100755 examples/txt/stallman-pl.txt create mode 100644 res/.svn/all-wcprops create mode 100644 res/.svn/entries create mode 100644 res/net/.svn/all-wcprops create mode 100644 res/net/.svn/entries create mode 100644 res/net/sourceforge/.svn/all-wcprops create mode 100644 res/net/sourceforge/.svn/entries create mode 100644 res/net/sourceforge/align/.svn/all-wcprops create mode 100644 res/net/sourceforge/align/.svn/entries create mode 100644 res/net/sourceforge/align/res/.svn/all-wcprops create mode 100644 res/net/sourceforge/align/res/.svn/entries create mode 100644 res/net/sourceforge/align/res/test/.svn/all-wcprops create mode 100644 res/net/sourceforge/align/res/test/.svn/entries create mode 100755 res/net/sourceforge/align/res/test/.svn/text-base/simpletext.al.svn-base create mode 100644 res/net/sourceforge/align/res/test/.svn/text-base/simpletext.tmx.svn-base create mode 100755 res/net/sourceforge/align/res/test/simpletext.al create mode 100755 res/net/sourceforge/align/res/test/simpletext.tmx create mode 100644 res/net/sourceforge/align/res/xml/.svn/all-wcprops create mode 100644 res/net/sourceforge/align/res/xml/.svn/entries create mode 100755 res/net/sourceforge/align/res/xml/.svn/text-base/al.xsd.svn-base create mode 100755 res/net/sourceforge/align/res/xml/.svn/text-base/tmx.xsd.svn-base create mode 100755 res/net/sourceforge/align/res/xml/.svn/text-base/xml.xsd.svn-base create mode 100755 res/net/sourceforge/align/res/xml/al.xsd create mode 100755 res/net/sourceforge/align/res/xml/tmx.xsd create mode 100755 res/net/sourceforge/align/res/xml/xml.xsd create mode 100644 result/.svn/all-wcprops create mode 100644 result/.svn/entries create mode 100644 result/content/.svn/all-wcprops create mode 100644 result/content/.svn/entries create mode 100644 result/content/normal-translation/.svn/all-wcprops create mode 100644 result/content/normal-translation/.svn/entries create mode 100755 result/content/normal-translation/.svn/text-base/stallman-ch1.al.svn-base create mode 100755 result/content/normal-translation/stallman-ch1.al create mode 100644 result/content/poisson-translation/.svn/all-wcprops create mode 100644 result/content/poisson-translation/.svn/entries create mode 100755 result/content/poisson-translation/.svn/text-base/gpl.al.svn-base create mode 100755 result/content/poisson-translation/.svn/text-base/poznan.al.svn-base create mode 100755 result/content/poisson-translation/.svn/text-base/stallman-ch1.al.svn-base create mode 100755 result/content/poisson-translation/gpl.al create mode 100755 result/content/poisson-translation/poznan.al create mode 100755 result/content/poisson-translation/stallman-ch1.al create mode 100644 result/content/translation/.svn/all-wcprops create mode 100644 result/content/translation/.svn/entries create mode 100755 result/content/translation/.svn/text-base/gpl.al.svn-base create mode 100755 result/content/translation/.svn/text-base/stallman-ch1.al.svn-base create mode 100755 result/content/translation/gpl.al create mode 100755 result/content/translation/stallman-ch1.al create mode 100644 result/length/.svn/all-wcprops create mode 100644 result/length/.svn/entries create mode 100644 result/length/normal/.svn/all-wcprops create mode 100644 result/length/normal/.svn/entries create mode 100755 result/length/normal/.svn/text-base/gpl.al.svn-base create mode 100755 result/length/normal/.svn/text-base/stallman-ch1.al.svn-base create mode 100755 result/length/normal/gpl.al create mode 100755 result/length/normal/stallman-ch1.al create mode 100644 result/length/poisson/.svn/all-wcprops create mode 100644 result/length/poisson/.svn/entries create mode 100755 result/length/poisson/.svn/text-base/gpl.al.svn-base create mode 100755 result/length/poisson/.svn/text-base/poznan.al.svn-base create mode 100755 result/length/poisson/.svn/text-base/stallman-ch1.al.svn-base create mode 100755 result/length/poisson/gpl.al create mode 100755 result/length/poisson/poznan.al create mode 100755 result/length/poisson/stallman-ch1.al create mode 100644 src/.svn/all-wcprops create mode 100644 src/.svn/entries create mode 100644 src/net/.svn/all-wcprops create mode 100644 src/net/.svn/entries create mode 100644 src/net/sourceforge/.svn/all-wcprops create mode 100644 src/net/sourceforge/.svn/entries create mode 100644 src/net/sourceforge/align/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/.svn/entries create mode 100644 src/net/sourceforge/align/.svn/text-base/AlignTestSuite.java.svn-base create mode 100755 src/net/sourceforge/align/AlignTestSuite.java create mode 100644 src/net/sourceforge/align/calculator/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/calculator/.svn/entries create mode 100644 src/net/sourceforge/align/calculator/.svn/text-base/Calculator.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/.svn/text-base/CalculatorMock.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/.svn/text-base/CalculatorTestSuite.java.svn-base create mode 100755 src/net/sourceforge/align/calculator/Calculator.java create mode 100755 src/net/sourceforge/align/calculator/CalculatorMock.java create mode 100755 src/net/sourceforge/align/calculator/CalculatorTestSuite.java create mode 100644 src/net/sourceforge/align/calculator/content/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/calculator/content/.svn/entries create mode 100644 src/net/sourceforge/align/calculator/content/.svn/prop-base/TranslationCalculator.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/content/.svn/text-base/OracleCalculator.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/content/.svn/text-base/TranslationCalculator.java.svn-base create mode 100755 src/net/sourceforge/align/calculator/content/OracleCalculator.java create mode 100755 src/net/sourceforge/align/calculator/content/TranslationCalculator.java create mode 100644 src/net/sourceforge/align/calculator/length/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/calculator/length/.svn/entries create mode 100644 src/net/sourceforge/align/calculator/length/.svn/prop-base/LengthCalculator.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/length/.svn/text-base/LengthCalculator.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/length/.svn/text-base/NormalDistributionCalculator.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/length/.svn/text-base/PoissonDistributionCalculator.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/length/.svn/text-base/PoissonDistributionCalculatorTest.java.svn-base create mode 100755 src/net/sourceforge/align/calculator/length/LengthCalculator.java create mode 100755 src/net/sourceforge/align/calculator/length/NormalDistributionCalculator.java create mode 100755 src/net/sourceforge/align/calculator/length/PoissonDistributionCalculator.java create mode 100755 src/net/sourceforge/align/calculator/length/PoissonDistributionCalculatorTest.java create mode 100644 src/net/sourceforge/align/calculator/length/counter/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/calculator/length/counter/.svn/entries create mode 100644 src/net/sourceforge/align/calculator/length/counter/.svn/text-base/CharCounter.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/length/counter/.svn/text-base/Counter.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/length/counter/.svn/text-base/SplitCounter.java.svn-base create mode 100755 src/net/sourceforge/align/calculator/length/counter/CharCounter.java create mode 100755 src/net/sourceforge/align/calculator/length/counter/Counter.java create mode 100755 src/net/sourceforge/align/calculator/length/counter/SplitCounter.java create mode 100644 src/net/sourceforge/align/calculator/meta/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/calculator/meta/.svn/entries create mode 100644 src/net/sourceforge/align/calculator/meta/.svn/text-base/CompositeCalculator.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/meta/.svn/text-base/CompositeCalculatorTest.java.svn-base create mode 100644 src/net/sourceforge/align/calculator/meta/.svn/text-base/MinimumCalculator.java.svn-base create mode 100755 src/net/sourceforge/align/calculator/meta/CompositeCalculator.java create mode 100755 src/net/sourceforge/align/calculator/meta/CompositeCalculatorTest.java create mode 100755 src/net/sourceforge/align/calculator/meta/MinimumCalculator.java create mode 100644 src/net/sourceforge/align/comparator/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/comparator/.svn/entries create mode 100644 src/net/sourceforge/align/comparator/.svn/text-base/Comparator.java.svn-base create mode 100644 src/net/sourceforge/align/comparator/.svn/text-base/ComparatorTest.java.svn-base create mode 100755 src/net/sourceforge/align/comparator/.svn/text-base/ComparatorTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/comparator/.svn/text-base/Diff.java.svn-base create mode 100755 src/net/sourceforge/align/comparator/Comparator.java create mode 100755 src/net/sourceforge/align/comparator/ComparatorTest.java create mode 100755 src/net/sourceforge/align/comparator/ComparatorTestSuite.java create mode 100755 src/net/sourceforge/align/comparator/Diff.java create mode 100644 src/net/sourceforge/align/coretypes/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/coretypes/.svn/entries create mode 100644 src/net/sourceforge/align/coretypes/.svn/text-base/Alignment.java.svn-base create mode 100644 src/net/sourceforge/align/coretypes/.svn/text-base/AlignmentTest.java.svn-base create mode 100644 src/net/sourceforge/align/coretypes/.svn/text-base/Category.java.svn-base create mode 100644 src/net/sourceforge/align/coretypes/.svn/text-base/CategoryDefaults.java.svn-base create mode 100755 src/net/sourceforge/align/coretypes/Alignment.java create mode 100755 src/net/sourceforge/align/coretypes/AlignmentTest.java create mode 100755 src/net/sourceforge/align/coretypes/Category.java create mode 100644 src/net/sourceforge/align/coretypes/CategoryDefaults.java create mode 100644 src/net/sourceforge/align/filter/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/.svn/entries create mode 100644 src/net/sourceforge/align/filter/.svn/text-base/Filter.java.svn-base create mode 100644 src/net/sourceforge/align/filter/.svn/text-base/FilterTestSuite.java.svn-base create mode 100755 src/net/sourceforge/align/filter/Filter.java create mode 100755 src/net/sourceforge/align/filter/FilterTestSuite.java create mode 100644 src/net/sourceforge/align/filter/aligner/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/aligner/.svn/entries create mode 100644 src/net/sourceforge/align/filter/aligner/.svn/text-base/Aligner.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignerTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignerTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignmentImpossibleException.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/.svn/text-base/UnifyAligner.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/.svn/text-base/UnifyAlignerTest.java.svn-base create mode 100755 src/net/sourceforge/align/filter/aligner/Aligner.java create mode 100755 src/net/sourceforge/align/filter/aligner/AlignerTest.java create mode 100755 src/net/sourceforge/align/filter/aligner/AlignerTestSuite.java create mode 100755 src/net/sourceforge/align/filter/aligner/AlignmentImpossibleException.java create mode 100755 src/net/sourceforge/align/filter/aligner/UnifyAligner.java create mode 100755 src/net/sourceforge/align/filter/aligner/UnifyAlignerTest.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/aligner/align/.svn/entries create mode 100644 src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmMock.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmMockTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmTestSuite.java.svn-base create mode 100755 src/net/sourceforge/align/filter/aligner/align/AlignAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMock.java create mode 100755 src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMockTest.java create mode 100755 src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmTestSuite.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/.svn/entries create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/HmmAlignAlgorithmFactory.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/HmmAlignAlgorithmTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/Util.java.svn-base create mode 100755 src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmFactory.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmTest.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/Util.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/entries create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/text-base/AdaptiveBandAlgorithm.java.svn-base create mode 100755 src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/text-base/HmmAlignAlgorithmFactory.java.svn-base create mode 100755 src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/AdaptiveBandAlgorithm.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/entries create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithmFactory.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithmTest.java.svn-base create mode 100755 src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmFactory.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmTest.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/entries create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithmFactory.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithmTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiData.java.svn-base create mode 100755 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmFactory.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmTest.java create mode 100755 src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiData.java create mode 100644 src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/entries create mode 100644 src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/text-base/OneToOneAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/text-base/OneToOneAlgorithmTest.java.svn-base create mode 100755 src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithmTest.java create mode 100644 src/net/sourceforge/align/filter/macro/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/macro/.svn/entries create mode 100644 src/net/sourceforge/align/filter/macro/.svn/text-base/GaleAndChurchMacro.java.svn-base create mode 100644 src/net/sourceforge/align/filter/macro/.svn/text-base/Macro.java.svn-base create mode 100644 src/net/sourceforge/align/filter/macro/.svn/text-base/MacroTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/filter/macro/.svn/text-base/MooreMacro.java.svn-base create mode 100644 src/net/sourceforge/align/filter/macro/.svn/text-base/MooreMacroTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/macro/.svn/text-base/PoissonMacro.java.svn-base create mode 100644 src/net/sourceforge/align/filter/macro/.svn/text-base/PoissonTranslationMacro.java.svn-base create mode 100644 src/net/sourceforge/align/filter/macro/.svn/text-base/TranslationMacro.java.svn-base create mode 100755 src/net/sourceforge/align/filter/macro/GaleAndChurchMacro.java create mode 100755 src/net/sourceforge/align/filter/macro/Macro.java create mode 100644 src/net/sourceforge/align/filter/macro/MacroTestSuite.java create mode 100755 src/net/sourceforge/align/filter/macro/MooreMacro.java create mode 100644 src/net/sourceforge/align/filter/macro/MooreMacroTest.java create mode 100755 src/net/sourceforge/align/filter/macro/PoissonMacro.java create mode 100755 src/net/sourceforge/align/filter/macro/PoissonTranslationMacro.java create mode 100755 src/net/sourceforge/align/filter/macro/TranslationMacro.java create mode 100644 src/net/sourceforge/align/filter/meta/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/meta/.svn/entries create mode 100644 src/net/sourceforge/align/filter/meta/.svn/prop-base/MetaTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/filter/meta/.svn/text-base/CompositeFilter.java.svn-base create mode 100644 src/net/sourceforge/align/filter/meta/.svn/text-base/CompositeFilterTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/meta/.svn/text-base/FilterDecorators.java.svn-base create mode 100644 src/net/sourceforge/align/filter/meta/.svn/text-base/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java.svn-base create mode 100644 src/net/sourceforge/align/filter/meta/.svn/text-base/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/meta/.svn/text-base/MetaTestSuite.java.svn-base create mode 100755 src/net/sourceforge/align/filter/meta/CompositeFilter.java create mode 100755 src/net/sourceforge/align/filter/meta/CompositeFilterTest.java create mode 100644 src/net/sourceforge/align/filter/meta/FilterDecorators.java create mode 100644 src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java create mode 100644 src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java create mode 100755 src/net/sourceforge/align/filter/meta/MetaTestSuite.java create mode 100644 src/net/sourceforge/align/filter/modifier/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/modifier/.svn/entries create mode 100644 src/net/sourceforge/align/filter/modifier/.svn/text-base/Modifier.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/.svn/text-base/ModifierTestSuite.java.svn-base create mode 100755 src/net/sourceforge/align/filter/modifier/Modifier.java create mode 100755 src/net/sourceforge/align/filter/modifier/ModifierTestSuite.java create mode 100644 src/net/sourceforge/align/filter/modifier/modify/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/modifier/modify/.svn/entries create mode 100644 src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/ModifyAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/ModifyTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/NullModifyAlgorithm.java.svn-base create mode 100755 src/net/sourceforge/align/filter/modifier/modify/ModifyAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/ModifyTestSuite.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/NullModifyAlgorithm.java create mode 100644 src/net/sourceforge/align/filter/modifier/modify/clean/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/modifier/modify/clean/.svn/entries create mode 100644 src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/CleanAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/FilterNonWordsCleanAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/LowercaseCleanAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/TrimCleanAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/UnifyRareWordsCleanAlgorithm.java.svn-base create mode 100755 src/net/sourceforge/align/filter/modifier/modify/clean/CleanAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/clean/FilterNonWordsCleanAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/clean/LowercaseCleanAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/clean/TrimCleanAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/clean/UnifyRareWordsCleanAlgorithm.java create mode 100644 src/net/sourceforge/align/filter/modifier/modify/merge/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/modifier/modify/merge/.svn/entries create mode 100644 src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/MergeAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/MergeTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/SeparatorMergeAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/SeparatorMergeAlgorithmTest.java.svn-base create mode 100755 src/net/sourceforge/align/filter/modifier/modify/merge/MergeAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/merge/MergeTestSuite.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithmTest.java create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/entries create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/FilterNonWordsSplitAlgorithmDecorator.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/ParagraphSplitAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SentenceSplitAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SentenceSplitAlgorithmTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SimpleSplitter.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithmMock.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithmMockTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SrxSplitAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/WordSplitAlgorithm.java.svn-base create mode 100644 src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/WordSplitAlgorithmTest.java.svn-base create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/FilterNonWordsSplitAlgorithmDecorator.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/ParagraphSplitAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithmTest.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/SimpleSplitter.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMock.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMockTest.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/SplitTestSuite.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/SrxSplitAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithm.java create mode 100755 src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithmTest.java create mode 100644 src/net/sourceforge/align/filter/selector/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/filter/selector/.svn/entries create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/DifferenceSelector.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/DifferenceSelectorTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/FractionSelector.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/FractionSelectorTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/IntersectionSelector.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/IntersectionSelectorTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/OneToOneSelector.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/OneToOneSelectorTest.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/ProbabilitySelector.java.svn-base create mode 100644 src/net/sourceforge/align/filter/selector/.svn/text-base/SelectorTestSuite.java.svn-base create mode 100755 src/net/sourceforge/align/filter/selector/DifferenceSelector.java create mode 100755 src/net/sourceforge/align/filter/selector/DifferenceSelectorTest.java create mode 100755 src/net/sourceforge/align/filter/selector/FractionSelector.java create mode 100755 src/net/sourceforge/align/filter/selector/FractionSelectorTest.java create mode 100755 src/net/sourceforge/align/filter/selector/IntersectionSelector.java create mode 100755 src/net/sourceforge/align/filter/selector/IntersectionSelectorTest.java create mode 100755 src/net/sourceforge/align/filter/selector/OneToOneSelector.java create mode 100755 src/net/sourceforge/align/filter/selector/OneToOneSelectorTest.java create mode 100755 src/net/sourceforge/align/filter/selector/ProbabilitySelector.java create mode 100755 src/net/sourceforge/align/filter/selector/SelectorTestSuite.java create mode 100644 src/net/sourceforge/align/formatter/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/formatter/.svn/entries create mode 100644 src/net/sourceforge/align/formatter/.svn/prop-base/HtmlFormatter.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/AlFormatter.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/AlFormatterTest.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/Formatter.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/FormatterTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/HtmlFormatter.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/InfoFormatter.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/PlaintextFormatter.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/PresentationFormatter.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/PresentationFormatterTest.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/TmxFormatter.java.svn-base create mode 100644 src/net/sourceforge/align/formatter/.svn/text-base/TmxFormatterTest.java.svn-base create mode 100755 src/net/sourceforge/align/formatter/AlFormatter.java create mode 100755 src/net/sourceforge/align/formatter/AlFormatterTest.java create mode 100755 src/net/sourceforge/align/formatter/Formatter.java create mode 100755 src/net/sourceforge/align/formatter/FormatterTestSuite.java create mode 100755 src/net/sourceforge/align/formatter/HtmlFormatter.java create mode 100755 src/net/sourceforge/align/formatter/InfoFormatter.java create mode 100755 src/net/sourceforge/align/formatter/PlaintextFormatter.java create mode 100755 src/net/sourceforge/align/formatter/PresentationFormatter.java create mode 100755 src/net/sourceforge/align/formatter/PresentationFormatterTest.java create mode 100755 src/net/sourceforge/align/formatter/TmxFormatter.java create mode 100755 src/net/sourceforge/align/formatter/TmxFormatterTest.java create mode 100644 src/net/sourceforge/align/matrix/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/matrix/.svn/entries create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/BandMatrix.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/BandMatrixFactory.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/BandMatrixIterator.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/FullMatrix.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/FullMatrixFactory.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/FullMatrixIterator.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/Matrix.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/MatrixFactory.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/MatrixIterator.java.svn-base create mode 100644 src/net/sourceforge/align/matrix/.svn/text-base/PositionOutsideBandException.java.svn-base create mode 100755 src/net/sourceforge/align/matrix/BandMatrix.java create mode 100755 src/net/sourceforge/align/matrix/BandMatrixFactory.java create mode 100755 src/net/sourceforge/align/matrix/BandMatrixIterator.java create mode 100755 src/net/sourceforge/align/matrix/FullMatrix.java create mode 100755 src/net/sourceforge/align/matrix/FullMatrixFactory.java create mode 100755 src/net/sourceforge/align/matrix/FullMatrixIterator.java create mode 100755 src/net/sourceforge/align/matrix/Matrix.java create mode 100755 src/net/sourceforge/align/matrix/MatrixFactory.java create mode 100755 src/net/sourceforge/align/matrix/MatrixIterator.java create mode 100755 src/net/sourceforge/align/matrix/PositionOutsideBandException.java create mode 100644 src/net/sourceforge/align/model/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/model/.svn/entries create mode 100644 src/net/sourceforge/align/model/.svn/text-base/ModelParseException.java.svn-base create mode 100644 src/net/sourceforge/align/model/.svn/text-base/ModelTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/model/.svn/text-base/Util.java.svn-base create mode 100755 src/net/sourceforge/align/model/ModelParseException.java create mode 100755 src/net/sourceforge/align/model/ModelTestSuite.java create mode 100755 src/net/sourceforge/align/model/Util.java create mode 100644 src/net/sourceforge/align/model/language/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/model/language/.svn/entries create mode 100644 src/net/sourceforge/align/model/language/.svn/text-base/LanguageModel.java.svn-base create mode 100644 src/net/sourceforge/align/model/language/.svn/text-base/LanguageModelUtil.java.svn-base create mode 100644 src/net/sourceforge/align/model/language/.svn/text-base/LanguageModelUtilTest.java.svn-base create mode 100644 src/net/sourceforge/align/model/language/.svn/text-base/LanguageTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/model/language/.svn/text-base/MutableLanguageModel.java.svn-base create mode 100644 src/net/sourceforge/align/model/language/.svn/text-base/MutableLanguageModelTest.java.svn-base create mode 100755 src/net/sourceforge/align/model/language/LanguageModel.java create mode 100755 src/net/sourceforge/align/model/language/LanguageModelUtil.java create mode 100755 src/net/sourceforge/align/model/language/LanguageModelUtilTest.java create mode 100755 src/net/sourceforge/align/model/language/LanguageTestSuite.java create mode 100755 src/net/sourceforge/align/model/language/MutableLanguageModel.java create mode 100755 src/net/sourceforge/align/model/language/MutableLanguageModelTest.java create mode 100644 src/net/sourceforge/align/model/length/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/model/length/.svn/entries create mode 100644 src/net/sourceforge/align/model/length/.svn/text-base/LengthModel.java.svn-base create mode 100644 src/net/sourceforge/align/model/length/.svn/text-base/LengthModelUtil.java.svn-base create mode 100644 src/net/sourceforge/align/model/length/.svn/text-base/LengthModelUtilTest.java.svn-base create mode 100644 src/net/sourceforge/align/model/length/.svn/text-base/LengthTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/model/length/.svn/text-base/MutableLengthModel.java.svn-base create mode 100644 src/net/sourceforge/align/model/length/.svn/text-base/MutableLengthModelTest.java.svn-base create mode 100755 src/net/sourceforge/align/model/length/LengthModel.java create mode 100755 src/net/sourceforge/align/model/length/LengthModelUtil.java create mode 100755 src/net/sourceforge/align/model/length/LengthModelUtilTest.java create mode 100755 src/net/sourceforge/align/model/length/LengthTestSuite.java create mode 100755 src/net/sourceforge/align/model/length/MutableLengthModel.java create mode 100755 src/net/sourceforge/align/model/length/MutableLengthModelTest.java create mode 100644 src/net/sourceforge/align/model/translation/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/model/translation/.svn/entries create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/EmptySourceData.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/InitialSourceData.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/InitialTranslationModel.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/MutableSourceData.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/MutableSourceDataTest.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/MutableTranslationModel.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/MutableTranslationModelTest.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/SourceData.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/TargetData.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/TargetDataProbabilityComparator.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/TargetDataProbabilityComparatorTest.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModel.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModelUtil.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModelUtilTest.java.svn-base create mode 100644 src/net/sourceforge/align/model/translation/.svn/text-base/TranslationTestSuite.java.svn-base create mode 100755 src/net/sourceforge/align/model/translation/EmptySourceData.java create mode 100755 src/net/sourceforge/align/model/translation/InitialSourceData.java create mode 100755 src/net/sourceforge/align/model/translation/InitialTranslationModel.java create mode 100755 src/net/sourceforge/align/model/translation/MutableSourceData.java create mode 100755 src/net/sourceforge/align/model/translation/MutableSourceDataTest.java create mode 100755 src/net/sourceforge/align/model/translation/MutableTranslationModel.java create mode 100755 src/net/sourceforge/align/model/translation/MutableTranslationModelTest.java create mode 100755 src/net/sourceforge/align/model/translation/SourceData.java create mode 100755 src/net/sourceforge/align/model/translation/TargetData.java create mode 100755 src/net/sourceforge/align/model/translation/TargetDataProbabilityComparator.java create mode 100755 src/net/sourceforge/align/model/translation/TargetDataProbabilityComparatorTest.java create mode 100755 src/net/sourceforge/align/model/translation/TranslationModel.java create mode 100755 src/net/sourceforge/align/model/translation/TranslationModelUtil.java create mode 100755 src/net/sourceforge/align/model/translation/TranslationModelUtilTest.java create mode 100755 src/net/sourceforge/align/model/translation/TranslationTestSuite.java create mode 100644 src/net/sourceforge/align/model/vocabulary/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/model/vocabulary/.svn/entries create mode 100644 src/net/sourceforge/align/model/vocabulary/.svn/text-base/Vocabulary.java.svn-base create mode 100644 src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyTest.java.svn-base create mode 100644 src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyUtil.java.svn-base create mode 100644 src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyUtilTest.java.svn-base create mode 100755 src/net/sourceforge/align/model/vocabulary/Vocabulary.java create mode 100755 src/net/sourceforge/align/model/vocabulary/VocabularyTest.java create mode 100755 src/net/sourceforge/align/model/vocabulary/VocabularyTestSuite.java create mode 100755 src/net/sourceforge/align/model/vocabulary/VocabularyUtil.java create mode 100755 src/net/sourceforge/align/model/vocabulary/VocabularyUtilTest.java create mode 100644 src/net/sourceforge/align/parser/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/parser/.svn/entries create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/AlParser.java.svn-base create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/AlParserTest.java.svn-base create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/Parser.java.svn-base create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/ParserTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/PlaintextParser.java.svn-base create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/PlaintextParserTest.java.svn-base create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/TmxParseException.java.svn-base create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/TmxParser.java.svn-base create mode 100644 src/net/sourceforge/align/parser/.svn/text-base/TmxParserTest.java.svn-base create mode 100755 src/net/sourceforge/align/parser/AlParser.java create mode 100755 src/net/sourceforge/align/parser/AlParserTest.java create mode 100755 src/net/sourceforge/align/parser/Parser.java create mode 100755 src/net/sourceforge/align/parser/ParserTestSuite.java create mode 100755 src/net/sourceforge/align/parser/PlaintextParser.java create mode 100755 src/net/sourceforge/align/parser/PlaintextParserTest.java create mode 100755 src/net/sourceforge/align/parser/TmxParseException.java create mode 100755 src/net/sourceforge/align/parser/TmxParser.java create mode 100755 src/net/sourceforge/align/parser/TmxParserTest.java create mode 100644 src/net/sourceforge/align/progress/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/progress/.svn/entries create mode 100644 src/net/sourceforge/align/progress/.svn/text-base/ProgressManager.java.svn-base create mode 100644 src/net/sourceforge/align/progress/.svn/text-base/ProgressMeter.java.svn-base create mode 100644 src/net/sourceforge/align/progress/.svn/text-base/ProgressObserver.java.svn-base create mode 100644 src/net/sourceforge/align/progress/.svn/text-base/WriterProgressObserver.java.svn-base create mode 100644 src/net/sourceforge/align/progress/ProgressManager.java create mode 100644 src/net/sourceforge/align/progress/ProgressMeter.java create mode 100644 src/net/sourceforge/align/progress/ProgressObserver.java create mode 100644 src/net/sourceforge/align/progress/WriterProgressObserver.java create mode 100644 src/net/sourceforge/align/ui/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/ui/.svn/entries create mode 100644 src/net/sourceforge/align/ui/console/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/ui/console/.svn/entries create mode 100644 src/net/sourceforge/align/ui/console/.svn/text-base/Maligna.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/Maligna.java create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/entries create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/AbstractCommand.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/AlignCommand.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/.svn/text-base/Command.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/.svn/text-base/CommandFactory.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/CompareCommand.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/FormatCommand.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/MacroCommand.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/ModelCommand.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/ModifyCommand.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/ParseCommand.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/SelectCommand.java.svn-base create mode 100644 src/net/sourceforge/align/ui/console/command/.svn/text-base/TestCommand.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/AbstractCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/AlignCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/Command.java create mode 100755 src/net/sourceforge/align/ui/console/command/CommandFactory.java create mode 100755 src/net/sourceforge/align/ui/console/command/CompareCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/FormatCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/MacroCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/ModelCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/ModifyCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/ParseCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/SelectCommand.java create mode 100755 src/net/sourceforge/align/ui/console/command/TestCommand.java create mode 100644 src/net/sourceforge/align/ui/console/command/exception/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/ui/console/command/exception/.svn/entries create mode 100755 src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/CommandException.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/MissingParameterException.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/ParameterFormatException.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/ParametersParseException.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/UnknownParameterException.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/WrongArgumentCountException.java.svn-base create mode 100755 src/net/sourceforge/align/ui/console/command/exception/CommandException.java create mode 100755 src/net/sourceforge/align/ui/console/command/exception/MissingParameterException.java create mode 100755 src/net/sourceforge/align/ui/console/command/exception/ParameterFormatException.java create mode 100755 src/net/sourceforge/align/ui/console/command/exception/ParametersParseException.java create mode 100755 src/net/sourceforge/align/ui/console/command/exception/UnknownParameterException.java create mode 100755 src/net/sourceforge/align/ui/console/command/exception/WrongArgumentCountException.java create mode 100644 src/net/sourceforge/align/util/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/util/.svn/entries create mode 100755 src/net/sourceforge/align/util/.svn/text-base/IORuntimeException.java.svn-base create mode 100755 src/net/sourceforge/align/util/.svn/text-base/ImpossibleException.java.svn-base create mode 100755 src/net/sourceforge/align/util/.svn/text-base/Pair.java.svn-base create mode 100644 src/net/sourceforge/align/util/.svn/text-base/ResourceNotFoundException.java.svn-base create mode 100644 src/net/sourceforge/align/util/.svn/text-base/Util.java.svn-base create mode 100644 src/net/sourceforge/align/util/.svn/text-base/UtilTest.java.svn-base create mode 100644 src/net/sourceforge/align/util/.svn/text-base/UtilTestSuite.java.svn-base create mode 100644 src/net/sourceforge/align/util/.svn/text-base/Version.java.svn-base create mode 100755 src/net/sourceforge/align/util/IORuntimeException.java create mode 100755 src/net/sourceforge/align/util/ImpossibleException.java create mode 100755 src/net/sourceforge/align/util/Pair.java create mode 100755 src/net/sourceforge/align/util/ResourceNotFoundException.java create mode 100755 src/net/sourceforge/align/util/Util.java create mode 100755 src/net/sourceforge/align/util/UtilTest.java create mode 100755 src/net/sourceforge/align/util/UtilTestSuite.java create mode 100755 src/net/sourceforge/align/util/Version.java create mode 100644 src/net/sourceforge/align/util/bind/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/util/bind/.svn/entries create mode 100644 src/net/sourceforge/align/util/bind/.svn/text-base/AlMarshallerUnmarshaller.java.svn-base create mode 100644 src/net/sourceforge/align/util/bind/.svn/text-base/BindException.java.svn-base create mode 100644 src/net/sourceforge/align/util/bind/.svn/text-base/MarshallerUnmarshaller.java.svn-base create mode 100644 src/net/sourceforge/align/util/bind/.svn/text-base/QuietValidationEventHandler.java.svn-base create mode 100644 src/net/sourceforge/align/util/bind/.svn/text-base/TmxMarshallerUnmarshaller.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/AlMarshallerUnmarshaller.java create mode 100755 src/net/sourceforge/align/util/bind/BindException.java create mode 100755 src/net/sourceforge/align/util/bind/MarshallerUnmarshaller.java create mode 100755 src/net/sourceforge/align/util/bind/QuietValidationEventHandler.java create mode 100755 src/net/sourceforge/align/util/bind/TmxMarshallerUnmarshaller.java create mode 100644 src/net/sourceforge/align/util/bind/al/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/util/bind/al/.svn/entries create mode 100755 src/net/sourceforge/align/util/bind/al/.svn/text-base/Alignment.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/al/.svn/text-base/Alignmentlist.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/al/.svn/text-base/ObjectFactory.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/al/.svn/text-base/Segmentlist.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/al/Alignment.java create mode 100755 src/net/sourceforge/align/util/bind/al/Alignmentlist.java create mode 100755 src/net/sourceforge/align/util/bind/al/ObjectFactory.java create mode 100755 src/net/sourceforge/align/util/bind/al/Segmentlist.java create mode 100644 src/net/sourceforge/align/util/bind/tmx/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/util/bind/tmx/.svn/entries create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Body.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Bpt.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ept.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Header.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Hi.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/It.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Map.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Note.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/ObjectFactory.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ph.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Prop.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Seg.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Sub.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tmx.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tu.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tuv.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ude.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ut.java.svn-base create mode 100755 src/net/sourceforge/align/util/bind/tmx/Body.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Bpt.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Ept.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Header.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Hi.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/It.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Map.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Note.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/ObjectFactory.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Ph.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Prop.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Seg.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Sub.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Tmx.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Tu.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Tuv.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Ude.java create mode 100755 src/net/sourceforge/align/util/bind/tmx/Ut.java create mode 100644 src/net/sourceforge/align/util/date/.svn/all-wcprops create mode 100644 src/net/sourceforge/align/util/date/.svn/entries create mode 100755 src/net/sourceforge/align/util/date/.svn/text-base/DateParser.java.svn-base create mode 100644 src/net/sourceforge/align/util/date/.svn/text-base/InvalidDateException.java.svn-base create mode 100755 src/net/sourceforge/align/util/date/DateParser.java create mode 100755 src/net/sourceforge/align/util/date/InvalidDateException.java create mode 100644 trash/.svn/all-wcprops create mode 100644 trash/.svn/entries create mode 100644 trash/.svn/prop-base/align.tar.gz.svn-base create mode 100644 trash/.svn/prop-base/loomchild-util-1.3.9.jar.svn-base create mode 100755 trash/.svn/text-base/AbstractAligner.java.svn-base create mode 100755 trash/.svn/text-base/AlignJob.java.svn-base create mode 100755 trash/.svn/text-base/AlignmentTest.java.svn-base create mode 100755 trash/.svn/text-base/ChildRegion.java.svn-base create mode 100755 trash/.svn/text-base/CommonAlgorithmTest.java.svn-base create mode 100755 trash/.svn/text-base/DOMXmlParser.java.svn-base create mode 100755 trash/.svn/text-base/Entry.java.svn-base create mode 100755 trash/.svn/text-base/FormatterException.java.svn-base create mode 100755 trash/.svn/text-base/IgnoreDTDEntityResolver.java.svn-base create mode 100755 trash/.svn/text-base/LanguageRule.java.svn-base create mode 100755 trash/.svn/text-base/LengthBasedAlgorithmTest.java.svn-base create mode 100644 trash/.svn/text-base/LexiconAligner.java.svn-base create mode 100755 trash/.svn/text-base/Main.java.svn-base create mode 100644 trash/.svn/text-base/MooreCategoryList.java.svn-base create mode 100755 trash/.svn/text-base/ParentRegion.java.svn-base create mode 100755 trash/.svn/text-base/Parser.java.svn-base create mode 100755 trash/.svn/text-base/ParserException.java.svn-base create mode 100755 trash/.svn/text-base/PlaintextParser.java.svn-base create mode 100755 trash/.svn/text-base/PlaintextParserOld.java.svn-base create mode 100755 trash/.svn/text-base/PlaintextParserOldTest.java.svn-base create mode 100755 trash/.svn/text-base/PlaintextParserTest.java.svn-base create mode 100755 trash/.svn/text-base/Region.java.svn-base create mode 100755 trash/.svn/text-base/RegionInt.java.svn-base create mode 100755 trash/.svn/text-base/RegionOld.java.svn-base create mode 100755 trash/.svn/text-base/Segamentator.java.svn-base create mode 100755 trash/.svn/text-base/SentenceSegmentator.java.svn-base create mode 100755 trash/.svn/text-base/SeparatorSegmentator.java.svn-base create mode 100755 trash/.svn/text-base/SimpleTaskTest.java.svn-base create mode 100755 trash/.svn/text-base/SrxSplitAlgorithm.java.svn-base create mode 100755 trash/.svn/text-base/SrxSplitAlgorithmImpl.java.svn-base create mode 100755 trash/.svn/text-base/SrxSplitAlgorithmMock.java.svn-base create mode 100755 trash/.svn/text-base/Trainer.java.svn-base create mode 100755 trash/.svn/text-base/Translation.java.svn-base create mode 100755 trash/.svn/text-base/WordNotFoundException.java.svn-base create mode 100755 trash/.svn/text-base/XmlErrorHandler.java.svn-base create mode 100755 trash/.svn/text-base/XmlHandler.java.svn-base create mode 100755 trash/.svn/text-base/XmlParser.java.svn-base create mode 100755 trash/.svn/text-base/XmlParserTest.java.svn-base create mode 100755 trash/.svn/text-base/align.bat.svn-base create mode 100644 trash/.svn/text-base/align.tar.gz.svn-base create mode 100755 trash/.svn/text-base/documentx.xml.svn-base create mode 100644 trash/.svn/text-base/loomchild-util-1.3.9.jar.svn-base create mode 100755 trash/.svn/text-base/moore.txt.svn-base create mode 100755 trash/.svn/text-base/moore2.txt.svn-base create mode 100644 trash/.svn/text-base/readme_jimmy.htm.svn-base create mode 100755 trash/.svn/text-base/simpleinput.txt.svn-base create mode 100755 trash/.svn/text-base/trash.txt.svn-base create mode 100755 trash/AbstractAligner.java create mode 100755 trash/AlignJob.java create mode 100755 trash/AlignmentTest.java create mode 100755 trash/ChildRegion.java create mode 100755 trash/CommonAlgorithmTest.java create mode 100755 trash/DOMXmlParser.java create mode 100755 trash/Entry.java create mode 100755 trash/FormatterException.java create mode 100755 trash/IgnoreDTDEntityResolver.java create mode 100755 trash/LanguageRule.java create mode 100755 trash/LengthBasedAlgorithmTest.java create mode 100644 trash/LexiconAligner.java create mode 100755 trash/Main.java create mode 100755 trash/MooreCategoryList.java create mode 100755 trash/ParentRegion.java create mode 100755 trash/Parser.java create mode 100755 trash/ParserException.java create mode 100755 trash/PlaintextParser.java create mode 100755 trash/PlaintextParserOld.java create mode 100755 trash/PlaintextParserOldTest.java create mode 100755 trash/PlaintextParserTest.java create mode 100755 trash/Region.java create mode 100755 trash/RegionInt.java create mode 100755 trash/RegionOld.java create mode 100755 trash/Segamentator.java create mode 100755 trash/SentenceSegmentator.java create mode 100755 trash/SeparatorSegmentator.java create mode 100755 trash/SimpleTaskTest.java create mode 100755 trash/SrxSplitAlgorithm.java create mode 100755 trash/SrxSplitAlgorithmImpl.java create mode 100755 trash/SrxSplitAlgorithmMock.java create mode 100755 trash/Trainer.java create mode 100755 trash/Translation.java create mode 100755 trash/WordNotFoundException.java create mode 100755 trash/XmlErrorHandler.java create mode 100755 trash/XmlHandler.java create mode 100755 trash/XmlParser.java create mode 100755 trash/XmlParserTest.java create mode 100755 trash/align.bat create mode 100644 trash/align.tar.gz create mode 100644 trash/comparatornew/.svn/all-wcprops create mode 100644 trash/comparatornew/.svn/entries create mode 100755 trash/comparatornew/.svn/text-base/Comparator.java.svn-base create mode 100755 trash/comparatornew/.svn/text-base/ComparatorTestSuite.java.svn-base create mode 100755 trash/comparatornew/.svn/text-base/Diff.java.svn-base create mode 100755 trash/comparatornew/.svn/text-base/SequentialComparator.java.svn-base create mode 100755 trash/comparatornew/.svn/text-base/SequentialComparatorTest.java.svn-base create mode 100755 trash/comparatornew/Comparator.java create mode 100755 trash/comparatornew/ComparatorTestSuite.java create mode 100755 trash/comparatornew/Diff.java create mode 100755 trash/comparatornew/SequentialComparator.java create mode 100755 trash/comparatornew/SequentialComparatorTest.java create mode 100644 trash/comparatorold/.svn/all-wcprops create mode 100644 trash/comparatorold/.svn/entries create mode 100755 trash/comparatorold/.svn/text-base/Comparator.java.svn-base create mode 100755 trash/comparatorold/.svn/text-base/ComparatorTestSuite.java.svn-base create mode 100755 trash/comparatorold/.svn/text-base/CompareResult.java.svn-base create mode 100755 trash/comparatorold/.svn/text-base/SequentialComparator.java.svn-base create mode 100755 trash/comparatorold/.svn/text-base/SequentialComparatorTest.java.svn-base create mode 100755 trash/comparatorold/Comparator.java create mode 100755 trash/comparatorold/ComparatorTestSuite.java create mode 100755 trash/comparatorold/CompareResult.java create mode 100755 trash/comparatorold/SequentialComparator.java create mode 100755 trash/comparatorold/SequentialComparatorTest.java create mode 100755 trash/documentx.xml create mode 100644 trash/example/.svn/all-wcprops create mode 100644 trash/example/.svn/entries create mode 100644 trash/example/.svn/prop-base/example2a.svn-base create mode 100644 trash/example/.svn/prop-base/example2b.svn-base create mode 100644 trash/example/.svn/prop-base/example2c.svn-base create mode 100644 trash/example/.svn/prop-base/example2d.svn-base create mode 100755 trash/example/.svn/text-base/example2a.svn-base create mode 100755 trash/example/.svn/text-base/example2b.svn-base create mode 100755 trash/example/.svn/text-base/example2c.svn-base create mode 100755 trash/example/.svn/text-base/example2d.svn-base create mode 100755 trash/example/example2a create mode 100755 trash/example/example2b create mode 100755 trash/example/example2c create mode 100755 trash/example/example2d create mode 100755 trash/moore.txt create mode 100755 trash/moore2.txt create mode 100755 trash/readme_jimmy.htm create mode 100755 trash/simpleinput.txt create mode 100644 trash/task/.svn/all-wcprops create mode 100644 trash/task/.svn/entries create mode 100755 trash/task/.svn/text-base/CompositeTask.java.svn-base create mode 100755 trash/task/.svn/text-base/CompositeTaskTest.java.svn-base create mode 100755 trash/task/.svn/text-base/SimpleTask.java.svn-base create mode 100755 trash/task/.svn/text-base/SimpleTaskTest.java.svn-base create mode 100755 trash/task/.svn/text-base/Task.java.svn-base create mode 100755 trash/task/CompositeTask.java create mode 100755 trash/task/CompositeTaskTest.java create mode 100755 trash/task/SimpleTask.java create mode 100755 trash/task/SimpleTaskTest.java create mode 100755 trash/task/Task.java create mode 100755 trash/trash.txt create mode 100644 trash/vocabulary/.svn/all-wcprops create mode 100644 trash/vocabulary/.svn/entries create mode 100755 trash/vocabulary/.svn/text-base/Vocabulary.java.svn-base create mode 100755 trash/vocabulary/.svn/text-base/VocabularyTest.java.svn-base create mode 100755 trash/vocabulary/.svn/text-base/WordIdNotFoundException.java.svn-base create mode 100755 trash/vocabulary/.svn/text-base/WordNotFoundException.java.svn-base create mode 100755 trash/vocabulary/Vocabulary.java create mode 100755 trash/vocabulary/VocabularyTest.java create mode 100755 trash/vocabulary/WordIdNotFoundException.java create mode 100755 trash/vocabulary/WordNotFoundException.java create mode 100644 trash/xpath/.svn/all-wcprops create mode 100644 trash/xpath/.svn/entries create mode 100755 trash/xpath/.svn/text-base/Util.java.svn-base create mode 100755 trash/xpath/.svn/text-base/XPathParser.java.svn-base create mode 100755 trash/xpath/.svn/text-base/XPathParserException.java.svn-base create mode 100755 trash/xpath/.svn/text-base/XPathParserTest.java.svn-base create mode 100755 trash/xpath/.svn/text-base/simpletext.xml.svn-base create mode 100755 trash/xpath/Util.java create mode 100755 trash/xpath/XPathParser.java create mode 100755 trash/xpath/XPathParserException.java create mode 100755 trash/xpath/XPathParserTest.java create mode 100755 trash/xpath/simpletext.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c15885f --- /dev/null +++ b/.gitignore @@ -0,0 +1,120 @@ +# Created by https://www.gitignore.io/api/maven,eclipse,intellij,java + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties + + +### Eclipse ### +*.pydevproject +.metadata +.gradle +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific +.buildpath + +# sbteclipse plugin +.target + +# TeXlipse plugin +.texlipse + + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties + + +### Java ### +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +private/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..db3635c --- /dev/null +++ b/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'java' +apply plugin: 'application' + +version = '1.0' + +mainClassName = 'net.loomchild.maligna.ui.Maligna' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile 'net.loomchild:segment:2.0.0-SNAPSHOT + compile 'commons-logging:commons-logging:1.1.1' + compile 'commons-cli:commons-cli:1.2' + compile 'junit:junit:4.1' +} + +applicationDistribution.from("$projectDir/examples") { + into "examples" +} +applicationDistribution.from("$projectDir/README.md") + +distZip.doLast { + file("$destinationDir/$archiveName").renameTo("$destinationDir/"+baseName+'-'+version+'.zip') +} + +task wrapper(type: Wrapper) { + gradleVersion = '2.7' +} + diff --git a/build.number b/build.number new file mode 100644 index 0000000..560f1d6 --- /dev/null +++ b/build.number @@ -0,0 +1,3 @@ +#Build Number for ANT. Do not edit! +#Mon Oct 24 14:00:49 CEST 2011 +build.number=2 diff --git a/build.properties b/build.properties new file mode 100755 index 0000000..8a9bb91 --- /dev/null +++ b/build.properties @@ -0,0 +1,5 @@ +project.name=maligna +project.version=2.7 +project.fullversion=${project.version}.${build.number} +project.fullname=${project.name}-${project.fullversion} +project.authors=Jarek Lipski diff --git a/build.xml b/build.xml new file mode 100755 index 0000000..e5bf347 --- /dev/null +++ b/build.xml @@ -0,0 +1,140 @@ + + + Maligna is a bilingual sentence aligner. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/.svn/all-wcprops b/doc/.svn/all-wcprops new file mode 100644 index 0000000..ef5f194 --- /dev/null +++ b/doc/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 44 +/svnroot/align/!svn/ver/50/trunk/maligna/doc +END +readme.html +K 25 +svn:wc:ra_dav:version-url +V 56 +/svnroot/align/!svn/ver/50/trunk/maligna/doc/readme.html +END +history.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/align/!svn/ver/57/trunk/maligna/doc/history.html +END +authors.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/align/!svn/ver/44/trunk/maligna/doc/authors.html +END +copying.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/align/!svn/ver/39/trunk/maligna/doc/copying.html +END diff --git a/doc/.svn/entries b/doc/.svn/entries new file mode 100644 index 0000000..5e726a8 --- /dev/null +++ b/doc/.svn/entries @@ -0,0 +1,167 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/doc +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +readme.html +file + + + + +2010-12-02T07:55:20.000000Z +7ae84ad2b9d1cc445767946ad1695ce0 +2010-12-02T11:07:14.247557Z +50 +jarekl + + + + + + + + + + + + + + + + + + + + + +11387 + +tech +dir + +history.html +file +57 + + + +2011-10-23T08:54:51.905230Z +e71b96b618b918799dd0901c4418b165 +2011-10-23T09:19:34.947191Z +57 +jarekl + + + + + + + + + + + + + + + + + + + + + +2947 + +authors.html +file + + + + +2010-11-09T18:41:24.000000Z +b82ee264d45b4d8957cbdcd3bdb0e8ed +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +397 + +copying.html +file + + + + +2009-05-27T21:18:53.000000Z +a232eccaf7c58d38dbbc8ec40db4fe0a +2009-05-28T21:59:27.401677Z +39 +jarekl + + + + + + + + + + + + + + + + + + + + + +1283 + diff --git a/doc/.svn/text-base/authors.html.svn-base b/doc/.svn/text-base/authors.html.svn-base new file mode 100644 index 0000000..dfef4b0 --- /dev/null +++ b/doc/.svn/text-base/authors.html.svn-base @@ -0,0 +1,10 @@ +Authors + +

Authors

+ + + + diff --git a/doc/.svn/text-base/copying.html.svn-base b/doc/.svn/text-base/copying.html.svn-base new file mode 100755 index 0000000..d86190b --- /dev/null +++ b/doc/.svn/text-base/copying.html.svn-base @@ -0,0 +1,13 @@ +Copying + +

MIT License

+ +

© 2009 Jarek Lipski

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ + diff --git a/doc/.svn/text-base/history.html.svn-base b/doc/.svn/text-base/history.html.svn-base new file mode 100644 index 0000000..f488d7a --- /dev/null +++ b/doc/.svn/text-base/history.html.svn-base @@ -0,0 +1,71 @@ +Historia + +

History

+ + + + diff --git a/doc/.svn/text-base/readme.html.svn-base b/doc/.svn/text-base/readme.html.svn-base new file mode 100644 index 0000000..f010dec --- /dev/null +++ b/doc/.svn/text-base/readme.html.svn-base @@ -0,0 +1,282 @@ +Read Me + +

mALIGNa

+ +

Version @project.fullversion@, Date @build.date@

+
+ +

Table of Contents

+
    +
  1. Introduction
  2. +
  3. Requirements
  4. +
  5. Running
  6. +
  7. Formats
  8. +
  9. Algorithms
  10. +
  11. Resources
  12. +
  13. Tools
  14. +
+ +
+ +

1. Introduction

+

+mALIGNa is a program for aligning documents on the sentence level. +It contains implementations of a few groups of alignment algorithms - +algorithms based exclusively on the sentence length (Gale and Church, Brown), +algorithms based on the connections between words (Moore's algorithm), +as well as any variation and intersection of these algorithms. +The aim of alignment is to obtain a bilingual corpus. +It can be used for creating translation memories, translation by analogy, +modelling probabilistic dictionaries and other applications. +More information about maligna can be found in an article which I co-authored +(see Resources section). +

+ +

2. Requirements

+

+JVM 1.6 is required to run the program. +To build the program both JDK 1.6 and Ant are required. +Theoretically, the program is platform independent (like Java), +but it was tested only on Linux and Windows. +

+ +

3. Running

+

+Aligning documents consists of several stages, which may be performed +in different ways. Therefore, the text interface of the program is divided +into several independent commands. A common feature of the commands is +that they read input text from standard input and write the results +to standard output, always using the native format .al. +Therefore these programs act as filters and may be combined in a pipe using |. +Below is a brief description of each command, you can get more information +about exact parameters of individual commands using the option --help. +At the end of this document, there is a complete example of text +alignment using several commands connected in a pipeline. +

+ +

3.1 The 'parse' command

+

+The parse command is used to convert an external format +to the native format .al. It also allows you to combine several documents +into one, by giving a list of files as arguments. +It accepts input files as arguments and writes the result to standard output. +This command can only occur at the beginning of the pipeline. +

+ +

3.2 The 'format' command

+

+The 'format' command is used to convert the native format .al +to an external format. It reads data from standard input and writes the result +to the files given as arguments. This command can only occur at the end +of the pipeline. +

+ +

3.3 The 'align' command

+

+Align command. Segments of each of the input mappings are aligned independently, +thanks to which alignment can be performed at different levels of accuracy +(document, paragraph, sentence), by performing consecutive alignment operations, +and then dividing the results into smaller and smaller segments. +Filter; may be used at any point of the pipeline. +

+ +

3.4 The 'modify' command

+

+This command performs modifications on every mapping, replacing source and +target lists of segments with other lists of segments. +Both the amount of the segments and their contents may be changed +(e.g. merge segments in one, split segment into more segments or +remove unnecessary whitespace in each segment). +Filter; may be used at any point of the pipeline. +

+ +

3.5 The 'select' command

+

+Basing on certain criteria, chooses from the input list of mappings only +some mappings and writes them to standard output. +Eg. using this command you can choose only the most probable mappings +or only 1 - 1 mappings. Filter; may be used at any point of the pipeline. +

+ +

3.6 The 'compare' command

+

+This command is used for comparing two files of alignments with each other, +provided as arguments, returning the degree of their similarity +(precision, recall) and the differences occurring. +Used for test purposes outside the pipeline. +

+ +

3.7 The 'model' command

+

+This command manipulates translation, language and length models. +Currently not fully implemented. +Used outside the pipeline. +

+ +

3.8 The 'macro' command

+

+Executes a set of predefined filtering commands, like doing a Moore alignment. +Created to simplify complex operations and improve the performance. +Filter; may be used at any point of the pipeline. +

+ + +

3.9 The 'test' command

+

+Runs the program's automatic tests. +

+ +

3.8 Examples

+

+Below I have given examples of pipelines of commands that that should be used +to align two documents in .txt files and write the results as two .txt files. +The output documents will contain the same number of sentences, +one per line, and sentences of corresponding numbers should be mutual +translations. The commands given below will do everything required, +however it is worth remembering that sometimes it's better to preserve +the intermediate results of the operations of each command in temporary files +instead of redirecting them directly to the next command for debugging purposes. +This example should be executed in the main directory of the project. +Ready to run example scripts can be found in the examples/scripts directory. +

+

+bin/maligna parse -c txt example/txt/poznan-pl.txt example/txt/poznan-de.txt |
+bin/maligna modify -c split-sentence |
+bin/maligna modify -c trim |
+bin/maligna align -c viterbi -a poisson -n word -s iterative-band |
+bin/maligna select -c one-to-one |
+bin/maligna format -c txt poznan-pl-align.txt poznan-de-align.txt +

+

+Another interesting case is alignment using Moore's algorithm, +which requires a properly aligned corpus to build a translation model. +To do this you must perform several groups of commands. +

+

+Split a text into sentences and clean them up:
+ +bin/maligna parse -c txt example/txt/poznan-pl.txt example/txt/poznan-de.txt |
+bin/maligna modify -c split-sentence |
+bin/maligna modify -c trim >
+poznan-split.al +
+

+

+Align using sentence length-based algorithm (Brown, Gale and Church) +and select most probable alignments:
+ +cat poznan-split.al |
+bin/maligna align -c viterbi -a poisson -n word -s iterative-band |
+bin/maligna select -c one-to-one |
+bin/maligna select -c fraction -f 0.85 >
+poznan-align-length.al +
+

+

+Finally align using Moore's algorithm:
+ +cat poznan-split.al |
+bin/maligna align -c viterbi -a translation -n word -s iterative-band -t poznan-align-length.al >
+poznan-align.al +
+

+ +

4. Formats

+

+Most commands expect input and output in the native format .al. +To use a different format, you must parse the input using the parse command. +To get the result in another format, you need to format it using +the format command. +

+ +

4.1 The .al format

+

+This is the native format for alignment files. +Contains all necessary information for each mapping: +lists of source and target segments and mapping score (-log(probability)). +If mapping score is equal to "-INF" then all commands ignore this mapping, +no operation is performed on it. This feature can be used to mark manual, +human-aligned fragments to be preserved in the result. +

+ +

4.2 The .tmx format

+

+The standard format for translation memories, supported by many tools. +Both an input and output format. For the full specification see +http://www.lisa.org/standards/tmx/tmx.html. +

+ +

4.3 The .txt format

+

+Plain text, in the form of two files in two languages. +On input the whole file is treated as one segment. +On output, successive lines of files correspond to mappings and are +mutual translations (which implies that numbers of lines are equal). +

+ +

4.4 The presentation format

+

+An output format which presents an alignment in a human readable manner. +

+ +

5. Algorithms

+

+In the program a few alignment algorithms were implemented, and thanks to the +flexibility of the code it is easy to add new algorithms, +modify the existing ones and join their results together. +

+ +

5.1 Gale and Church algorithm

+

+This is a fast bilingual text alignment algorithm. The algorithm counts the +probability of each possible mapping, which depends on ratio of lengths of +sentences in each language. Next it finds alignment for the whole text with +maximum probability (calculated as a product of individual mapping probabilities). +Details can be found in the Gale and Church article, referenced in resources. +

+ +

5.1 Moore's algorithm

+

+This is a modern algorithm based not only on the length of sentences but also on +their contents. +The first phase of operation of this algorithm is alignment based on length +(for example using Gale and Church algorithm described above). +Next, from this alignment only 1 - 1 mappings alignments are selected, +and from them only the most probable ones (e.g. 80% probability) are selected. +In this manner a relatively well aligned corpus is yielded. +Later a translation model (IBM Model 1) and unigram language models are built +based on this corpus. +In the final alignment, probability of the translation of the source sentence to +the target sentence is taken into account (calculated on the basis of the +translation model and the language models). +Details can be found in the Moore article, referenced in the resources. +

+ +

6. Resources

+

+

    +
  1. A new tool for the bilingual text aligning at the sentence level, + Krzysztof Jassem, Jarek Lipski, Proceedings of Intelligent Information Systems Conference 2008, Zakopane, Poland, + http://iis.ipipan.waw.pl/2008/proceedings/iis08-27.pdf
  2. +
  3. A Program for Aligning Sentences in Bilingual Corpora, William A. Gale, Kenneth Ward Church
  4. +
  5. Fast and Accurate Sentence Alignment of Bilingual Corpora, Robert C. Moore
  6. +
+

+ +

7. Tools

+

+I write this program using the Eclipse IDE. +For the automation of various tasks, I use Ant tool. +

+ +
+ +

+I wrote this program during my studies in Machine Translation, +and later I expanded it as practical part of a master's thesis. +Currently it is being developed as an open-source project and used by +various other projects. +Happy aligning!

+

   -- Jarek Lipski

+ + diff --git a/doc/authors.html b/doc/authors.html new file mode 100755 index 0000000..dfef4b0 --- /dev/null +++ b/doc/authors.html @@ -0,0 +1,10 @@ +Authors + +

Authors

+ + + + diff --git a/doc/copying.html b/doc/copying.html new file mode 100755 index 0000000..d86190b --- /dev/null +++ b/doc/copying.html @@ -0,0 +1,13 @@ +Copying + +

MIT License

+ +

© 2009 Jarek Lipski

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ + diff --git a/doc/history.html b/doc/history.html new file mode 100755 index 0000000..f488d7a --- /dev/null +++ b/doc/history.html @@ -0,0 +1,71 @@ +Historia + +

History

+ + + + diff --git a/doc/readme.html b/doc/readme.html new file mode 100755 index 0000000..f010dec --- /dev/null +++ b/doc/readme.html @@ -0,0 +1,282 @@ +Read Me + +

mALIGNa

+ +

Version @project.fullversion@, Date @build.date@

+
+ +

Table of Contents

+
    +
  1. Introduction
  2. +
  3. Requirements
  4. +
  5. Running
  6. +
  7. Formats
  8. +
  9. Algorithms
  10. +
  11. Resources
  12. +
  13. Tools
  14. +
+ +
+ +

1. Introduction

+

+mALIGNa is a program for aligning documents on the sentence level. +It contains implementations of a few groups of alignment algorithms - +algorithms based exclusively on the sentence length (Gale and Church, Brown), +algorithms based on the connections between words (Moore's algorithm), +as well as any variation and intersection of these algorithms. +The aim of alignment is to obtain a bilingual corpus. +It can be used for creating translation memories, translation by analogy, +modelling probabilistic dictionaries and other applications. +More information about maligna can be found in an article which I co-authored +(see Resources section). +

+ +

2. Requirements

+

+JVM 1.6 is required to run the program. +To build the program both JDK 1.6 and Ant are required. +Theoretically, the program is platform independent (like Java), +but it was tested only on Linux and Windows. +

+ +

3. Running

+

+Aligning documents consists of several stages, which may be performed +in different ways. Therefore, the text interface of the program is divided +into several independent commands. A common feature of the commands is +that they read input text from standard input and write the results +to standard output, always using the native format .al. +Therefore these programs act as filters and may be combined in a pipe using |. +Below is a brief description of each command, you can get more information +about exact parameters of individual commands using the option --help. +At the end of this document, there is a complete example of text +alignment using several commands connected in a pipeline. +

+ +

3.1 The 'parse' command

+

+The parse command is used to convert an external format +to the native format .al. It also allows you to combine several documents +into one, by giving a list of files as arguments. +It accepts input files as arguments and writes the result to standard output. +This command can only occur at the beginning of the pipeline. +

+ +

3.2 The 'format' command

+

+The 'format' command is used to convert the native format .al +to an external format. It reads data from standard input and writes the result +to the files given as arguments. This command can only occur at the end +of the pipeline. +

+ +

3.3 The 'align' command

+

+Align command. Segments of each of the input mappings are aligned independently, +thanks to which alignment can be performed at different levels of accuracy +(document, paragraph, sentence), by performing consecutive alignment operations, +and then dividing the results into smaller and smaller segments. +Filter; may be used at any point of the pipeline. +

+ +

3.4 The 'modify' command

+

+This command performs modifications on every mapping, replacing source and +target lists of segments with other lists of segments. +Both the amount of the segments and their contents may be changed +(e.g. merge segments in one, split segment into more segments or +remove unnecessary whitespace in each segment). +Filter; may be used at any point of the pipeline. +

+ +

3.5 The 'select' command

+

+Basing on certain criteria, chooses from the input list of mappings only +some mappings and writes them to standard output. +Eg. using this command you can choose only the most probable mappings +or only 1 - 1 mappings. Filter; may be used at any point of the pipeline. +

+ +

3.6 The 'compare' command

+

+This command is used for comparing two files of alignments with each other, +provided as arguments, returning the degree of their similarity +(precision, recall) and the differences occurring. +Used for test purposes outside the pipeline. +

+ +

3.7 The 'model' command

+

+This command manipulates translation, language and length models. +Currently not fully implemented. +Used outside the pipeline. +

+ +

3.8 The 'macro' command

+

+Executes a set of predefined filtering commands, like doing a Moore alignment. +Created to simplify complex operations and improve the performance. +Filter; may be used at any point of the pipeline. +

+ + +

3.9 The 'test' command

+

+Runs the program's automatic tests. +

+ +

3.8 Examples

+

+Below I have given examples of pipelines of commands that that should be used +to align two documents in .txt files and write the results as two .txt files. +The output documents will contain the same number of sentences, +one per line, and sentences of corresponding numbers should be mutual +translations. The commands given below will do everything required, +however it is worth remembering that sometimes it's better to preserve +the intermediate results of the operations of each command in temporary files +instead of redirecting them directly to the next command for debugging purposes. +This example should be executed in the main directory of the project. +Ready to run example scripts can be found in the examples/scripts directory. +

+

+bin/maligna parse -c txt example/txt/poznan-pl.txt example/txt/poznan-de.txt |
+bin/maligna modify -c split-sentence |
+bin/maligna modify -c trim |
+bin/maligna align -c viterbi -a poisson -n word -s iterative-band |
+bin/maligna select -c one-to-one |
+bin/maligna format -c txt poznan-pl-align.txt poznan-de-align.txt +

+

+Another interesting case is alignment using Moore's algorithm, +which requires a properly aligned corpus to build a translation model. +To do this you must perform several groups of commands. +

+

+Split a text into sentences and clean them up:
+ +bin/maligna parse -c txt example/txt/poznan-pl.txt example/txt/poznan-de.txt |
+bin/maligna modify -c split-sentence |
+bin/maligna modify -c trim >
+poznan-split.al +
+

+

+Align using sentence length-based algorithm (Brown, Gale and Church) +and select most probable alignments:
+ +cat poznan-split.al |
+bin/maligna align -c viterbi -a poisson -n word -s iterative-band |
+bin/maligna select -c one-to-one |
+bin/maligna select -c fraction -f 0.85 >
+poznan-align-length.al +
+

+

+Finally align using Moore's algorithm:
+ +cat poznan-split.al |
+bin/maligna align -c viterbi -a translation -n word -s iterative-band -t poznan-align-length.al >
+poznan-align.al +
+

+ +

4. Formats

+

+Most commands expect input and output in the native format .al. +To use a different format, you must parse the input using the parse command. +To get the result in another format, you need to format it using +the format command. +

+ +

4.1 The .al format

+

+This is the native format for alignment files. +Contains all necessary information for each mapping: +lists of source and target segments and mapping score (-log(probability)). +If mapping score is equal to "-INF" then all commands ignore this mapping, +no operation is performed on it. This feature can be used to mark manual, +human-aligned fragments to be preserved in the result. +

+ +

4.2 The .tmx format

+

+The standard format for translation memories, supported by many tools. +Both an input and output format. For the full specification see +http://www.lisa.org/standards/tmx/tmx.html. +

+ +

4.3 The .txt format

+

+Plain text, in the form of two files in two languages. +On input the whole file is treated as one segment. +On output, successive lines of files correspond to mappings and are +mutual translations (which implies that numbers of lines are equal). +

+ +

4.4 The presentation format

+

+An output format which presents an alignment in a human readable manner. +

+ +

5. Algorithms

+

+In the program a few alignment algorithms were implemented, and thanks to the +flexibility of the code it is easy to add new algorithms, +modify the existing ones and join their results together. +

+ +

5.1 Gale and Church algorithm

+

+This is a fast bilingual text alignment algorithm. The algorithm counts the +probability of each possible mapping, which depends on ratio of lengths of +sentences in each language. Next it finds alignment for the whole text with +maximum probability (calculated as a product of individual mapping probabilities). +Details can be found in the Gale and Church article, referenced in resources. +

+ +

5.1 Moore's algorithm

+

+This is a modern algorithm based not only on the length of sentences but also on +their contents. +The first phase of operation of this algorithm is alignment based on length +(for example using Gale and Church algorithm described above). +Next, from this alignment only 1 - 1 mappings alignments are selected, +and from them only the most probable ones (e.g. 80% probability) are selected. +In this manner a relatively well aligned corpus is yielded. +Later a translation model (IBM Model 1) and unigram language models are built +based on this corpus. +In the final alignment, probability of the translation of the source sentence to +the target sentence is taken into account (calculated on the basis of the +translation model and the language models). +Details can be found in the Moore article, referenced in the resources. +

+ +

6. Resources

+

+

    +
  1. A new tool for the bilingual text aligning at the sentence level, + Krzysztof Jassem, Jarek Lipski, Proceedings of Intelligent Information Systems Conference 2008, Zakopane, Poland, + http://iis.ipipan.waw.pl/2008/proceedings/iis08-27.pdf
  2. +
  3. A Program for Aligning Sentences in Bilingual Corpora, William A. Gale, Kenneth Ward Church
  4. +
  5. Fast and Accurate Sentence Alignment of Bilingual Corpora, Robert C. Moore
  6. +
+

+ +

7. Tools

+

+I write this program using the Eclipse IDE. +For the automation of various tasks, I use Ant tool. +

+ +
+ +

+I wrote this program during my studies in Machine Translation, +and later I expanded it as practical part of a master's thesis. +Currently it is being developed as an open-source project and used by +various other projects. +Happy aligning!

+

   -- Jarek Lipski

+ + diff --git a/doc/tech/.svn/all-wcprops b/doc/tech/.svn/all-wcprops new file mode 100644 index 0000000..321fece --- /dev/null +++ b/doc/tech/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 49 +/svnroot/align/!svn/ver/29/trunk/maligna/doc/tech +END +moore.txt +K 25 +svn:wc:ra_dav:version-url +V 59 +/svnroot/align/!svn/ver/29/trunk/maligna/doc/tech/moore.txt +END +moore2.txt +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/29/trunk/maligna/doc/tech/moore2.txt +END +todo.txt +K 25 +svn:wc:ra_dav:version-url +V 58 +/svnroot/align/!svn/ver/26/trunk/maligna/doc/tech/todo.txt +END +ideas.txt +K 25 +svn:wc:ra_dav:version-url +V 59 +/svnroot/align/!svn/ver/25/trunk/maligna/doc/tech/ideas.txt +END diff --git a/doc/tech/.svn/entries b/doc/tech/.svn/entries new file mode 100644 index 0000000..43d5c5f --- /dev/null +++ b/doc/tech/.svn/entries @@ -0,0 +1,142 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/doc/tech +https://align.svn.sourceforge.net/svnroot/align + + + +2008-11-09T12:17:16.132862Z +29 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +ideas.txt +file + + + + +2008-09-05T07:47:29.000000Z +8e5a274b63f3e8e1f82fa7abcc29e740 +2008-09-05T07:49:53.323369Z +25 +jarekl + +moore.txt +file + + + + +2008-07-25T05:39:00.000000Z +54f67692501ce142af5f2c8d3cf9c725 +2008-11-09T12:17:16.132862Z +29 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +488 + +moore2.txt +file + + + + +2008-07-28T16:39:04.000000Z +1eb1764e76a972514773ecef0fa4571c +2008-11-09T12:17:16.132862Z +29 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +2827 + +todo.txt +file + + + + +2008-09-08T22:13:29.000000Z +280b40d2aa9622b6c3fd2dabdc75dead +2008-09-08T22:16:23.219543Z +26 +jarekl + + + + + + + + + + + + + + + + + + + + + +1230 + diff --git a/doc/tech/.svn/prop-base/moore.txt.svn-base b/doc/tech/.svn/prop-base/moore.txt.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/doc/tech/.svn/prop-base/moore.txt.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/doc/tech/.svn/prop-base/moore2.txt.svn-base b/doc/tech/.svn/prop-base/moore2.txt.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/doc/tech/.svn/prop-base/moore2.txt.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/doc/tech/.svn/text-base/ideas.txt.svn-base b/doc/tech/.svn/text-base/ideas.txt.svn-base new file mode 100755 index 0000000..b2ac19c --- /dev/null +++ b/doc/tech/.svn/text-base/ideas.txt.svn-base @@ -0,0 +1,19 @@ +Automatyczne rozpoznawanie języka dla SRX. Może stworzyć własnego SRX-a? + +Jeżeli umożliwić dużo kategorii to segmentacja traci na znaczeniu. + +Fajny by był jakiś wskażnik postępu. + +Może rozdzeilić na 2 języki przed splitowaniem, a potem dopiero łączenie + w dwa języki - ale jaki z tego zysk poza utrudnieniem dla użytkownika... + - chyba zły pomysł. Może zostawić taką możliwość bo do splitowania wydaje + się to bardziej naturalne. Z target: source / targe/ both? + +Może wordsplit powinien być kolejnym korpusem jako dodatkowy parametr, + jeśli użytkownik ma własną strategie dzielenia na wyrazy. +Albo jednak potrzebny jest podział mapping -> segment -> token + zamiast alignment -> segment. Ale tokeny nie mogą przechowywać informacji + o spacjach. Może także segmenty nie powinny i cały tekst powinien być + przechowywany wyżej. Bo segmentacja to to samo co tokenizacja. Ale po co? +Na początek tokenizacja wordsplitem. Potem stworzenie słowników. + Potem usunięcie nadmiarowych tokenów. diff --git a/doc/tech/.svn/text-base/moore.txt.svn-base b/doc/tech/.svn/text-base/moore.txt.svn-base new file mode 100755 index 0000000..90fc589 --- /dev/null +++ b/doc/tech/.svn/text-base/moore.txt.svn-base @@ -0,0 +1,26 @@ +(1-1) + +$word_seq_score_pos_1_minus_1 + + +$length_neg_log_prob_pos_1_minus_1 + + +&length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1); + + + +(2-1) + +$word_seq_score_pos_1_minus_2 + + +$length_neg_log_prob_pos_1_minus_2 + + +&length_neg_log_cond_prob_2($length_pair_1,$length_pos_2_minus_1); + + + +(1-2) + +&word_seq_trans_score($words_pos_1_minus_1,[@$words_pos_2_minus_2,@$words_pos_2_minus_1]) + + +$target_pair_2_neg_log_prob{$length_pos_2_minus_2}{$length_pos_2_minus_1}; + diff --git a/doc/tech/.svn/text-base/moore2.txt.svn-base b/doc/tech/.svn/text-base/moore2.txt.svn-base new file mode 100755 index 0000000..02ebbf4 --- /dev/null +++ b/doc/tech/.svn/text-base/moore2.txt.svn-base @@ -0,0 +1,93 @@ + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'delete'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1; + + $bead_score{$pos_1}{$pos_2}{'delete'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'insert'})) { + $new_bead_score = + + // Target language score + &word_seq_score_2(@$words_pos_2_minus_1) + + + // Target length score + $length_neg_log_prob_2{$length_pos_2_minus_1}; + + $bead_score{$pos_1}{$pos_2}{'insert'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'match'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1 + + + // Translation score + &word_seq_trans_score($words_pos_1_minus_1,$words_pos_2_minus_1) + + + // Length translation score + &length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1); + + $bead_score{$pos_1}{$pos_2}{'match'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'contract'})) { + $new_bead_score = + + // Source language score (2nd sentence) + $word_seq_score_pos_1_minus_1 + + + // Source length score (2nd sentence) + $length_neg_log_prob_pos_1_minus_1 + + + // Source language score (1st sentence) + $word_seq_score_pos_1_minus_2 + + + // Source length score (1st sentence) + $length_neg_log_prob_pos_1_minus_2 + + + // Translation score, source sentences sum, to target sentence: + ... $words_pair_1 = [@$words_pos_1_minus_2,@$words_pos_1_minus_1];, ). + &word_seq_trans_score($words_pair_1,$words_pos_2_minus_1) + + + // Length translation score source, sentences sum, to target sentence: + ... $length_pair_1 = $length_pos_1 + $length_pos_1_plus_1 + &length_neg_log_cond_prob_2($length_pair_1,$length_pos_2_minus_1); + + $bead_score{$pos_1}{$pos_2}{'contract'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'expand'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1 + + + // Translation score, source sentence, to target sentence sum + &word_seq_trans_score($words_pos_1_minus_1,[@$words_pos_2_minus_2,@$words_pos_2_minus_1]) + + + // Length translation score, source sentence, to target sentence sum + &length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1 + $length_pos_2_minus_2) + + + // + $target_pair_2_neg_log_prob{$length_pos_2_minus_2}{$length_pos_2_minus_1}; + + $bead_score{$pos_1}{$pos_2}{'expand'} = $new_bead_score; + } + diff --git a/doc/tech/.svn/text-base/todo.txt.svn-base b/doc/tech/.svn/text-base/todo.txt.svn-base new file mode 100755 index 0000000..0019bac --- /dev/null +++ b/doc/tech/.svn/text-base/todo.txt.svn-base @@ -0,0 +1,30 @@ +Cachowanie wyników wszystkich kalkulatorów, najlepiej w osobnym obiekcie cache, + wspólnym dla wszystkich instancji obiektów o tych samych parametrach. + +Sprawdzić wydajność hashy zamiast sprytnych tablic - może jest podobna, to by + uprościło kod i zmniejszyło zużycie pamięci. Można by też zezwolić na nulle albo infinity w tablicach + +Przetlumaczyc javadoc + +Zmenić nazewnictwo alignment na mapping. + +Nawiasy i cudzysłowy przy dzieleniu nie działają odpowiednio. + +Chyba jednak normalizacja to dobry pomysł - inaczej połączenie normal-translation + kończy się katastrofą. + +Jeśli chce się uzyskać 100% recall można wybrać niepewne dopasowania i + przedstawić człowiekowi (różnica zbiorów). Pewne dopasowania można + wybrać poprzez selekcje fraction, score, przecięcia różnych metod. + Opisać i przetestować tą metodę, utworzyć lepsze korpusy testowe, pobrać + też acquisa. + +Refaktoryzacja TUI + Lista kalkulatorów rozdzielonych przecinkami. Dekoratory przed właściwym kalkulatorem. Listy parametrów. + Przetestować zmiany. + +commons-cli błąd gdy help dłuższy niż 2 linie: align. + +Oszczędność pamięci przez ładowanie pliku .al po kawałku - po jednym dopasowaniu. + +HTMLParser diff --git a/doc/tech/ideas.txt b/doc/tech/ideas.txt new file mode 100755 index 0000000..b2ac19c --- /dev/null +++ b/doc/tech/ideas.txt @@ -0,0 +1,19 @@ +Automatyczne rozpoznawanie języka dla SRX. Może stworzyć własnego SRX-a? + +Jeżeli umożliwić dużo kategorii to segmentacja traci na znaczeniu. + +Fajny by był jakiś wskażnik postępu. + +Może rozdzeilić na 2 języki przed splitowaniem, a potem dopiero łączenie + w dwa języki - ale jaki z tego zysk poza utrudnieniem dla użytkownika... + - chyba zły pomysł. Może zostawić taką możliwość bo do splitowania wydaje + się to bardziej naturalne. Z target: source / targe/ both? + +Może wordsplit powinien być kolejnym korpusem jako dodatkowy parametr, + jeśli użytkownik ma własną strategie dzielenia na wyrazy. +Albo jednak potrzebny jest podział mapping -> segment -> token + zamiast alignment -> segment. Ale tokeny nie mogą przechowywać informacji + o spacjach. Może także segmenty nie powinny i cały tekst powinien być + przechowywany wyżej. Bo segmentacja to to samo co tokenizacja. Ale po co? +Na początek tokenizacja wordsplitem. Potem stworzenie słowników. + Potem usunięcie nadmiarowych tokenów. diff --git a/doc/tech/moore.txt b/doc/tech/moore.txt new file mode 100755 index 0000000..90fc589 --- /dev/null +++ b/doc/tech/moore.txt @@ -0,0 +1,26 @@ +(1-1) + +$word_seq_score_pos_1_minus_1 + + +$length_neg_log_prob_pos_1_minus_1 + + +&length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1); + + + +(2-1) + +$word_seq_score_pos_1_minus_2 + + +$length_neg_log_prob_pos_1_minus_2 + + +&length_neg_log_cond_prob_2($length_pair_1,$length_pos_2_minus_1); + + + +(1-2) + +&word_seq_trans_score($words_pos_1_minus_1,[@$words_pos_2_minus_2,@$words_pos_2_minus_1]) + + +$target_pair_2_neg_log_prob{$length_pos_2_minus_2}{$length_pos_2_minus_1}; + diff --git a/doc/tech/moore2.txt b/doc/tech/moore2.txt new file mode 100755 index 0000000..02ebbf4 --- /dev/null +++ b/doc/tech/moore2.txt @@ -0,0 +1,93 @@ + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'delete'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1; + + $bead_score{$pos_1}{$pos_2}{'delete'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'insert'})) { + $new_bead_score = + + // Target language score + &word_seq_score_2(@$words_pos_2_minus_1) + + + // Target length score + $length_neg_log_prob_2{$length_pos_2_minus_1}; + + $bead_score{$pos_1}{$pos_2}{'insert'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'match'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1 + + + // Translation score + &word_seq_trans_score($words_pos_1_minus_1,$words_pos_2_minus_1) + + + // Length translation score + &length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1); + + $bead_score{$pos_1}{$pos_2}{'match'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'contract'})) { + $new_bead_score = + + // Source language score (2nd sentence) + $word_seq_score_pos_1_minus_1 + + + // Source length score (2nd sentence) + $length_neg_log_prob_pos_1_minus_1 + + + // Source language score (1st sentence) + $word_seq_score_pos_1_minus_2 + + + // Source length score (1st sentence) + $length_neg_log_prob_pos_1_minus_2 + + + // Translation score, source sentences sum, to target sentence: + ... $words_pair_1 = [@$words_pos_1_minus_2,@$words_pos_1_minus_1];, ). + &word_seq_trans_score($words_pair_1,$words_pos_2_minus_1) + + + // Length translation score source, sentences sum, to target sentence: + ... $length_pair_1 = $length_pos_1 + $length_pos_1_plus_1 + &length_neg_log_cond_prob_2($length_pair_1,$length_pos_2_minus_1); + + $bead_score{$pos_1}{$pos_2}{'contract'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'expand'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1 + + + // Translation score, source sentence, to target sentence sum + &word_seq_trans_score($words_pos_1_minus_1,[@$words_pos_2_minus_2,@$words_pos_2_minus_1]) + + + // Length translation score, source sentence, to target sentence sum + &length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1 + $length_pos_2_minus_2) + + + // + $target_pair_2_neg_log_prob{$length_pos_2_minus_2}{$length_pos_2_minus_1}; + + $bead_score{$pos_1}{$pos_2}{'expand'} = $new_bead_score; + } + diff --git a/doc/tech/todo.txt b/doc/tech/todo.txt new file mode 100755 index 0000000..0019bac --- /dev/null +++ b/doc/tech/todo.txt @@ -0,0 +1,30 @@ +Cachowanie wyników wszystkich kalkulatorów, najlepiej w osobnym obiekcie cache, + wspólnym dla wszystkich instancji obiektów o tych samych parametrach. + +Sprawdzić wydajność hashy zamiast sprytnych tablic - może jest podobna, to by + uprościło kod i zmniejszyło zużycie pamięci. Można by też zezwolić na nulle albo infinity w tablicach + +Przetlumaczyc javadoc + +Zmenić nazewnictwo alignment na mapping. + +Nawiasy i cudzysłowy przy dzieleniu nie działają odpowiednio. + +Chyba jednak normalizacja to dobry pomysł - inaczej połączenie normal-translation + kończy się katastrofą. + +Jeśli chce się uzyskać 100% recall można wybrać niepewne dopasowania i + przedstawić człowiekowi (różnica zbiorów). Pewne dopasowania można + wybrać poprzez selekcje fraction, score, przecięcia różnych metod. + Opisać i przetestować tą metodę, utworzyć lepsze korpusy testowe, pobrać + też acquisa. + +Refaktoryzacja TUI + Lista kalkulatorów rozdzielonych przecinkami. Dekoratory przed właściwym kalkulatorem. Listy parametrów. + Przetestować zmiany. + +commons-cli błąd gdy help dłuższy niż 2 linie: align. + +Oszczędność pamięci przez ładowanie pliku .al po kawałku - po jednym dopasowaniu. + +HTMLParser diff --git a/examples/.svn/all-wcprops b/examples/.svn/all-wcprops new file mode 100644 index 0000000..7c76986 --- /dev/null +++ b/examples/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 48 +/svnroot/align/!svn/ver/50/trunk/maligna/example +END diff --git a/examples/.svn/entries b/examples/.svn/entries new file mode 100644 index 0000000..ea724eb --- /dev/null +++ b/examples/.svn/entries @@ -0,0 +1,40 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/example +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +align +dir + +script +dir + +split +dir + +txt +dir + diff --git a/examples/align/.svn/all-wcprops b/examples/align/.svn/all-wcprops new file mode 100644 index 0000000..61ffa90 --- /dev/null +++ b/examples/align/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 54 +/svnroot/align/!svn/ver/31/trunk/maligna/example/align +END diff --git a/examples/align/.svn/entries b/examples/align/.svn/entries new file mode 100644 index 0000000..d62e783 --- /dev/null +++ b/examples/align/.svn/entries @@ -0,0 +1,34 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/example/align +https://align.svn.sourceforge.net/svnroot/align + + + +2009-03-11T17:01:23.683133Z +31 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +human +dir + +moore +dir + diff --git a/examples/align/human/.svn/all-wcprops b/examples/align/human/.svn/all-wcprops new file mode 100644 index 0000000..fd2d7f0 --- /dev/null +++ b/examples/align/human/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/31/trunk/maligna/example/align/human +END +stallman-ch1.al +K 25 +svn:wc:ra_dav:version-url +V 76 +/svnroot/align/!svn/ver/16/trunk/maligna/example/align/human/stallman-ch1.al +END +gpl.al +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/align/!svn/ver/16/trunk/maligna/example/align/human/gpl.al +END +poznan.al +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/align/!svn/ver/16/trunk/maligna/example/align/human/poznan.al +END +poznan-oracle.al +K 25 +svn:wc:ra_dav:version-url +V 77 +/svnroot/align/!svn/ver/31/trunk/maligna/example/align/human/poznan-oracle.al +END diff --git a/examples/align/human/.svn/entries b/examples/align/human/.svn/entries new file mode 100644 index 0000000..cd283fa --- /dev/null +++ b/examples/align/human/.svn/entries @@ -0,0 +1,98 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/example/align/human +https://align.svn.sourceforge.net/svnroot/align + + + +2009-03-11T17:01:23.683133Z +31 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +gpl.al +file + + + + +2008-07-29T22:15:00.000000Z +e7436844ac1e9c1ab075fe87941c9281 +2008-08-20T23:12:34.302965Z +16 +jarekl + +poznan-oracle.al +file + + + + +2008-11-09T12:24:00.000000Z +b9ee06b9e70bd0971c91fa376aab1e17 +2009-03-11T17:01:23.683133Z +31 +jarekl + + + + + + + + + + + + + + + + + + + + + +1314 + +poznan.al +file + + + + +2007-02-27T01:26:12.000000Z +d0b84c05d33c5731ff8c4ea5d1b742db +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-ch1.al +file + + + + +2008-07-27T21:35:55.000000Z +42e5a699f1d7445cacc20ffbaf06eef1 +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/examples/align/human/.svn/text-base/gpl.al.svn-base b/examples/align/human/.svn/text-base/gpl.al.svn-base new file mode 100755 index 0000000..5322767 --- /dev/null +++ b/examples/align/human/.svn/text-base/gpl.al.svn-base @@ -0,0 +1,1810 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/examples/align/human/.svn/text-base/poznan-oracle.al.svn-base b/examples/align/human/.svn/text-base/poznan-oracle.al.svn-base new file mode 100755 index 0000000..67c508a --- /dev/null +++ b/examples/align/human/.svn/text-base/poznan-oracle.al.svn-base @@ -0,0 +1,29 @@ + + + + + Jezioro Malta jest zbiornikiem sztucznym. + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + + + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + + + + + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + + + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + diff --git a/examples/align/human/.svn/text-base/poznan.al.svn-base b/examples/align/human/.svn/text-base/poznan.al.svn-base new file mode 100755 index 0000000..b2651ed --- /dev/null +++ b/examples/align/human/.svn/text-base/poznan.al.svn-base @@ -0,0 +1,309 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + + + + + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + + + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + + + + + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + + + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + + + + + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + + + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + + + + + Jego powierzchnia wynosi 285 ha. + + + Seine Fläche beträgt 285 ha. + + + + + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + + + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + + + + + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + + + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + + + + + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + + + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + + + + + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + + + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + + + + + Wędkować można zarówno z brzegu, jak i łodzi. + + + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + + + + + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + + + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + + + + + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + + + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + + + + + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + + + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + + + + + Jezioro Malta jest zbiornikiem sztucznym. + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + + + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + + + + + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + + + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + + + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + + + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + + + + + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + + + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + + + + + Akwen zajmuje powierzchnię 36,7 ha. + + + Der See hat eine Fläche von 36,7 ha. + + + + + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + + + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + + + + + Długość linii brzegowej wynosi 3300 m. + + + Die Länge der Uferlinie beträgt 3300 m. + + + + + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + + + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + + + + + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + + + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + + + + + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + + + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + + + + + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + + + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + + + + + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + + + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + + + + + Ośrodek może przyjąć ok. 10 tys.osób. + + + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + + + + + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + + + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + + + + + Powierzchnia akwenu wynosi 34,9 ha. + + + Die Fläche des Sees beträgt 34,9 ha. + + + + + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + + + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + + + + + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + + + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + + + + + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + + + Der See wird vom Polnischen Angelverein in Poznań genutzt. + + + + + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + + + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + + + + + Jezioro zaliczane jest do typu sielawowego. + + + In dem See überwiegt die Kleine Maräne. + + + + + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + + + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + + + + + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + + + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + + + + + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + + + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + + + + + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/examples/align/human/.svn/text-base/stallman-ch1.al.svn-base b/examples/align/human/.svn/text-base/stallman-ch1.al.svn-base new file mode 100755 index 0000000..5a17a33 --- /dev/null +++ b/examples/align/human/.svn/text-base/stallman-ch1.al.svn-base @@ -0,0 +1,1423 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + Even when they bring gifts. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji w Massachusetts Institute of Technology (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + Upon arrival, he found only four pages in the printer's tray. + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + Stallman wondered. + + + + + Urządzenie było darem Xerox Corporation. + + + The machine had been a donation from the Xerox Corporation. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + + + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + + + The new machine was also more precise. + Circles came out looking like circles, not ovals. + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Był to ze pod każdym względem dar, który należało docenić. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + + + + + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + + + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu. + + + Improving a program was the true test of a hacker's skills. + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + + + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + He simply looked for a way to update the old fix or " hack" for the new system. + + + + + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + + + + + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + + + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + + + + + Można by, spoglądając na jakiś element, mówić Hmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątych". + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + During that visit, he made sure to stop by the computer-science department. + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + + + + + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + + + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + + + Who knows? + All I remember is wanting to get out of there." + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Pojawiło się w postaci daru. + + + It had come disguised as a gift. + + + + + Stallman musiał przełknąć dwie gorzkie pigułki. + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/examples/align/human/gpl.al b/examples/align/human/gpl.al new file mode 100755 index 0000000..5322767 --- /dev/null +++ b/examples/align/human/gpl.al @@ -0,0 +1,1810 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/examples/align/human/poznan-oracle.al b/examples/align/human/poznan-oracle.al new file mode 100755 index 0000000..67c508a --- /dev/null +++ b/examples/align/human/poznan-oracle.al @@ -0,0 +1,29 @@ + + + + + Jezioro Malta jest zbiornikiem sztucznym. + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + + + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + + + + + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + + + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + diff --git a/examples/align/human/poznan.al b/examples/align/human/poznan.al new file mode 100755 index 0000000..b2651ed --- /dev/null +++ b/examples/align/human/poznan.al @@ -0,0 +1,309 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + + + + + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + + + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + + + + + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + + + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + + + + + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + + + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + + + + + Jego powierzchnia wynosi 285 ha. + + + Seine Fläche beträgt 285 ha. + + + + + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + + + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + + + + + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + + + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + + + + + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + + + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + + + + + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + + + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + + + + + Wędkować można zarówno z brzegu, jak i łodzi. + + + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + + + + + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + + + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + + + + + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + + + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + + + + + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + + + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + + + + + Jezioro Malta jest zbiornikiem sztucznym. + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + + + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + + + + + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + + + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + + + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + + + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + + + + + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + + + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + + + + + Akwen zajmuje powierzchnię 36,7 ha. + + + Der See hat eine Fläche von 36,7 ha. + + + + + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + + + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + + + + + Długość linii brzegowej wynosi 3300 m. + + + Die Länge der Uferlinie beträgt 3300 m. + + + + + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + + + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + + + + + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + + + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + + + + + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + + + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + + + + + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + + + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + + + + + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + + + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + + + + + Ośrodek może przyjąć ok. 10 tys.osób. + + + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + + + + + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + + + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + + + + + Powierzchnia akwenu wynosi 34,9 ha. + + + Die Fläche des Sees beträgt 34,9 ha. + + + + + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + + + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + + + + + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + + + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + + + + + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + + + Der See wird vom Polnischen Angelverein in Poznań genutzt. + + + + + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + + + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + + + + + Jezioro zaliczane jest do typu sielawowego. + + + In dem See überwiegt die Kleine Maräne. + + + + + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + + + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + + + + + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + + + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + + + + + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + + + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + + + + + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/examples/align/human/stallman-ch1.al b/examples/align/human/stallman-ch1.al new file mode 100755 index 0000000..5a17a33 --- /dev/null +++ b/examples/align/human/stallman-ch1.al @@ -0,0 +1,1423 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + Even when they bring gifts. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji w Massachusetts Institute of Technology (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + Upon arrival, he found only four pages in the printer's tray. + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + Stallman wondered. + + + + + Urządzenie było darem Xerox Corporation. + + + The machine had been a donation from the Xerox Corporation. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + + + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + + + The new machine was also more precise. + Circles came out looking like circles, not ovals. + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Był to ze pod każdym względem dar, który należało docenić. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + + + + + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + + + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu. + + + Improving a program was the true test of a hacker's skills. + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + + + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + He simply looked for a way to update the old fix or " hack" for the new system. + + + + + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + + + + + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + + + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + + + + + Można by, spoglądając na jakiś element, mówić Hmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątych". + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + During that visit, he made sure to stop by the computer-science department. + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + + + + + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + + + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + + + Who knows? + All I remember is wanting to get out of there." + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Pojawiło się w postaci daru. + + + It had come disguised as a gift. + + + + + Stallman musiał przełknąć dwie gorzkie pigułki. + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/examples/align/moore/.svn/all-wcprops b/examples/align/moore/.svn/all-wcprops new file mode 100644 index 0000000..4b4f2e6 --- /dev/null +++ b/examples/align/moore/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/16/trunk/maligna/example/align/moore +END +stallman-ch1.al +K 25 +svn:wc:ra_dav:version-url +V 76 +/svnroot/align/!svn/ver/16/trunk/maligna/example/align/moore/stallman-ch1.al +END +gpl.al +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/align/!svn/ver/16/trunk/maligna/example/align/moore/gpl.al +END +poznan.al +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/align/!svn/ver/16/trunk/maligna/example/align/moore/poznan.al +END diff --git a/examples/align/moore/.svn/entries b/examples/align/moore/.svn/entries new file mode 100644 index 0000000..54abb18 --- /dev/null +++ b/examples/align/moore/.svn/entries @@ -0,0 +1,86 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/example/align/moore +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +gpl.al +file + + + + +2008-07-29T22:18:17.000000Z +5e462235106a815f577cf2dc1ce6cd5d +2008-08-20T23:12:34.302965Z +16 +jarekl + +poznan.al +file + + + + +2010-12-29T16:50:47.000000Z +8c698d9cdd00ebe827693b86776ca4da +2008-08-20T23:12:34.302965Z +16 +jarekl + + + + + + + + + + + + + + + + + + + + + +14959 + +stallman-ch1.al +file + + + + +2008-07-27T23:06:51.000000Z +fd184e932903f95234a3e14d47a0a8c4 +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/examples/align/moore/.svn/text-base/gpl.al.svn-base b/examples/align/moore/.svn/text-base/gpl.al.svn-base new file mode 100755 index 0000000..a2e19b4 --- /dev/null +++ b/examples/align/moore/.svn/text-base/gpl.al.svn-base @@ -0,0 +1,1755 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/examples/align/moore/.svn/text-base/poznan.al.svn-base b/examples/align/moore/.svn/text-base/poznan.al.svn-base new file mode 100755 index 0000000..b8b40c7 --- /dev/null +++ b/examples/align/moore/.svn/text-base/poznan.al.svn-base @@ -0,0 +1,291 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + + + + + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + + + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + + + + + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + + + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + + + + + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + + + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + + + + + Jego powierzchnia wynosi 285 ha. + + + Seine Fläche beträgt 285 ha. + + + + + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + + + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + + + + + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + + + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + + + + + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + + + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + + + + + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + + + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + + + + + Wędkować można zarówno z brzegu, jak i łodzi. + + + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + + + + + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + + + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + + + + + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + + + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + + + + + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + + + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + + + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + + + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + + + + + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + + + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + + + + + Akwen zajmuje powierzchnię 36,7 ha. + + + Der See hat eine Fläche von 36,7 ha. + + + + + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + + + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + + + + + Długość linii brzegowej wynosi 3300 m. + + + Die Länge der Uferlinie beträgt 3300 m. + + + + + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + + + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + + + + + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + + + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + + + + + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + + + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + + + + + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + + + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + + + + + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + + + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + + + + + Ośrodek może przyjąć ok. 10 tys.osób. + + + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + + + + + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + + + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + + + + + Powierzchnia akwenu wynosi 34,9 ha. + + + Die Fläche des Sees beträgt 34,9 ha. + + + + + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + + + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + + + + + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + + + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + + + + + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + + + Der See wird vom Polnischen Angelverein in Poznań genutzt. + + + + + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + + + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + + + + + Jezioro zaliczane jest do typu sielawowego. + + + In dem See überwiegt die Kleine Maräne. + + + + + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + + + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + + + + + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + + + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + + + + + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + + + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + + + + + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/examples/align/moore/.svn/text-base/stallman-ch1.al.svn-base b/examples/align/moore/.svn/text-base/stallman-ch1.al.svn-base new file mode 100755 index 0000000..91bcc35 --- /dev/null +++ b/examples/align/moore/.svn/text-base/stallman-ch1.al.svn-base @@ -0,0 +1,1067 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + Stallman wondered. + + + + + Urządzenie było darem Xerox Corporation. + + + The machine had been a donation from the Xerox Corporation. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Pojawiło się w postaci daru. + + + It had come disguised as a gift. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/examples/align/moore/gpl.al b/examples/align/moore/gpl.al new file mode 100755 index 0000000..a2e19b4 --- /dev/null +++ b/examples/align/moore/gpl.al @@ -0,0 +1,1755 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/examples/align/moore/poznan.al b/examples/align/moore/poznan.al new file mode 100644 index 0000000..b8b40c7 --- /dev/null +++ b/examples/align/moore/poznan.al @@ -0,0 +1,291 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + + + + + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + + + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + + + + + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + + + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + + + + + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + + + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + + + + + Jego powierzchnia wynosi 285 ha. + + + Seine Fläche beträgt 285 ha. + + + + + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + + + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + + + + + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + + + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + + + + + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + + + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + + + + + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + + + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + + + + + Wędkować można zarówno z brzegu, jak i łodzi. + + + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + + + + + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + + + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + + + + + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + + + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + + + + + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + + + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + + + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + + + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + + + + + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + + + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + + + + + Akwen zajmuje powierzchnię 36,7 ha. + + + Der See hat eine Fläche von 36,7 ha. + + + + + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + + + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + + + + + Długość linii brzegowej wynosi 3300 m. + + + Die Länge der Uferlinie beträgt 3300 m. + + + + + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + + + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + + + + + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + + + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + + + + + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + + + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + + + + + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + + + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + + + + + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + + + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + + + + + Ośrodek może przyjąć ok. 10 tys.osób. + + + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + + + + + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + + + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + + + + + Powierzchnia akwenu wynosi 34,9 ha. + + + Die Fläche des Sees beträgt 34,9 ha. + + + + + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + + + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + + + + + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + + + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + + + + + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + + + Der See wird vom Polnischen Angelverein in Poznań genutzt. + + + + + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + + + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + + + + + Jezioro zaliczane jest do typu sielawowego. + + + In dem See überwiegt die Kleine Maräne. + + + + + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + + + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + + + + + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + + + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + + + + + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + + + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + + + + + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/examples/align/moore/stallman-ch1.al b/examples/align/moore/stallman-ch1.al new file mode 100755 index 0000000..91bcc35 --- /dev/null +++ b/examples/align/moore/stallman-ch1.al @@ -0,0 +1,1067 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + Stallman wondered. + + + + + Urządzenie było darem Xerox Corporation. + + + The machine had been a donation from the Xerox Corporation. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Pojawiło się w postaci daru. + + + It had come disguised as a gift. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/examples/script/.svn/all-wcprops b/examples/script/.svn/all-wcprops new file mode 100644 index 0000000..1d8da7f --- /dev/null +++ b/examples/script/.svn/all-wcprops @@ -0,0 +1,41 @@ +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/align/!svn/ver/50/trunk/maligna/example/script +END +example3.bat +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/align/!svn/ver/30/trunk/maligna/example/script/example3.bat +END +example1 +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/28/trunk/maligna/example/script/example1 +END +example2 +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/28/trunk/maligna/example/script/example2 +END +example3 +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/30/trunk/maligna/example/script/example3 +END +example1.bat +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/align/!svn/ver/28/trunk/maligna/example/script/example1.bat +END +example2.bat +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/align/!svn/ver/28/trunk/maligna/example/script/example2.bat +END diff --git a/examples/script/.svn/entries b/examples/script/.svn/entries new file mode 100644 index 0000000..9c76266 --- /dev/null +++ b/examples/script/.svn/entries @@ -0,0 +1,232 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/example/script +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +example1 +file + + + + +2008-09-17T00:13:03.000000Z +ee8ddd42dc4ead760338cc2f785e14d3 +2008-09-17T19:31:03.495168Z +28 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +507 + +example1.bat +file + + + + +2008-09-17T17:03:22.000000Z +92f7f7c747a66f1564ed8443da6f72e0 +2008-09-17T19:31:03.495168Z +28 +jarekl + + + + + + + + + + + + + + + + + + + + + +526 + +example2 +file + + + + +2008-09-17T00:11:56.000000Z +db4c9872beb309d9a9a7e4e53c5d6c9a +2008-09-17T19:31:03.495168Z +28 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +701 + +example2.bat +file + + + + +2008-09-17T17:04:35.000000Z +e0031ff2ab47d39403460a5f938a3c0d +2008-09-17T19:31:03.495168Z +28 +jarekl + + + + + + + + + + + + + + + + + + + + + +719 + +example3 +file + + + + +2009-03-11T16:56:56.000000Z +a51ffb815d6f74bd61fb84ab48be0123 +2008-12-09T16:27:16.014023Z +30 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +453 + +example3.bat +file + + + + +2009-03-11T16:57:30.000000Z +c5fd34821437d031d03affcfa7e64444 +2008-12-09T16:27:16.014023Z +30 +jarekl + + + + + + + + + + + + + + + + + + + + + +481 + diff --git a/examples/script/.svn/prop-base/example1.svn-base b/examples/script/.svn/prop-base/example1.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/examples/script/.svn/prop-base/example1.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/examples/script/.svn/prop-base/example2.svn-base b/examples/script/.svn/prop-base/example2.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/examples/script/.svn/prop-base/example2.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/examples/script/.svn/prop-base/example3.svn-base b/examples/script/.svn/prop-base/example3.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/examples/script/.svn/prop-base/example3.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/examples/script/.svn/text-base/example1.bat.svn-base b/examples/script/.svn/text-base/example1.bat.svn-base new file mode 100755 index 0000000..575480a --- /dev/null +++ b/examples/script/.svn/text-base/example1.bat.svn-base @@ -0,0 +1,8 @@ +@echo off + +set SCRIPT_DIR=%~d0%~p0 +set PROJECT_HOME=%SCRIPT_DIR%..\.. +set BIN_DIR="%PROJECT_HOME%\bin" +set EXAMPLE_DIR="%PROJECT_HOME%\example" + +%BIN_DIR%\maligna parse -c txt %EXAMPLE_DIR%/txt/poznan-pl.txt %EXAMPLE_DIR%/txt/poznan-de.txt | %BIN_DIR%\maligna modify -c split-sentence | %BIN_DIR%\maligna modify -c trim | %BIN_DIR%\maligna align -c viterbi -a normal -n char -s iterative-band | %BIN_DIR%\maligna select -c one-to-one | %BIN_DIR%\maligna format -c txt poznan-pl-align.txt poznan-de-align.txt diff --git a/examples/script/.svn/text-base/example1.svn-base b/examples/script/.svn/text-base/example1.svn-base new file mode 100755 index 0000000..d11a281 --- /dev/null +++ b/examples/script/.svn/text-base/example1.svn-base @@ -0,0 +1,7 @@ +#!/bin/bash + +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. + +$PROJECT_HOME/bin/maligna parse -c txt $PROJECT_HOME/example/txt/poznan-pl.txt $PROJECT_HOME/example/txt/poznan-de.txt | $PROJECT_HOME/bin/maligna modify -c split-sentence | $PROJECT_HOME/bin/maligna modify -c trim | $PROJECT_HOME/bin/maligna align -c viterbi -a normal -n char -s iterative-band | $PROJECT_HOME/bin/maligna select -c one-to-one | $PROJECT_HOME/bin/maligna format -c txt poznan-pl-align.txt poznan-de-align.txt + diff --git a/examples/script/.svn/text-base/example2.bat.svn-base b/examples/script/.svn/text-base/example2.bat.svn-base new file mode 100755 index 0000000..74f50d1 --- /dev/null +++ b/examples/script/.svn/text-base/example2.bat.svn-base @@ -0,0 +1,12 @@ +@echo off + +set SCRIPT_DIR=%~d0%~p0 +set PROJECT_HOME=%SCRIPT_DIR%..\.. +set BIN_DIR="%PROJECT_HOME%\bin" +set EXAMPLE_DIR="%PROJECT_HOME%\example" + +%BIN_DIR%\maligna parse -c txt %EXAMPLE_DIR%\txt\poznan-pl.txt %EXAMPLE_DIR%\txt\poznan-de.txt | %BIN_DIR%\maligna modify -c split-sentence | %BIN_DIR%\maligna modify -c trim > poznan-split.al + +type poznan-split.al | %BIN_DIR%\maligna align -c fb -a poisson -n word -s iterative-band | %BIN_DIR%\maligna select -c one-to-one | %BIN_DIR%\maligna select -c fraction -f 0.85 > poznan-align-length.al + +type poznan-split.al | %BIN_DIR%\maligna align -c fb -a poisson,translation -n word -s iterative-band -t poznan-align-length.al > poznan-align.al diff --git a/examples/script/.svn/text-base/example2.svn-base b/examples/script/.svn/text-base/example2.svn-base new file mode 100755 index 0000000..52f4e8e --- /dev/null +++ b/examples/script/.svn/text-base/example2.svn-base @@ -0,0 +1,10 @@ +#!/bin/bash + +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. + +$PROJECT_HOME/bin/maligna parse -c txt $PROJECT_HOME/example/txt/poznan-pl.txt $PROJECT_HOME/example/txt/poznan-de.txt | $PROJECT_HOME/bin/maligna modify -c split-sentence | $PROJECT_HOME/bin/maligna modify -c trim > poznan-split.al + +cat poznan-split.al | $PROJECT_HOME/bin/maligna align -c fb -a poisson -n word -s iterative-band | $PROJECT_HOME/bin/maligna select -c one-to-one | $PROJECT_HOME/bin/maligna select -c fraction -f 0.85 > poznan-align-length.al + +cat poznan-split.al | $PROJECT_HOME/bin/maligna align -c fb -a poisson,translation -n word -s iterative-band -t poznan-align-length.al > poznan-align.al diff --git a/examples/script/.svn/text-base/example3.bat.svn-base b/examples/script/.svn/text-base/example3.bat.svn-base new file mode 100755 index 0000000..d230c91 --- /dev/null +++ b/examples/script/.svn/text-base/example3.bat.svn-base @@ -0,0 +1,8 @@ +@echo off + +set SCRIPT_DIR=%~d0%~p0 +set PROJECT_HOME=%SCRIPT_DIR%..\.. +set BIN_DIR="%PROJECT_HOME%\bin" +set EXAMPLE_DIR="%PROJECT_HOME%\example" + +%BIN_DIR%\maligna parse -c txt %EXAMPLE_DIR%/txt/poznan-pl.txt %EXAMPLE_DIR%/txt/poznan-de.txt | %BIN_DIR%\maligna modify -c split-sentence | %BIN_DIR%\maligna modify -c trim | %BIN_DIR%\maligna align -c viterbi -a oracle,normal -d %EXAMPLE_DIR%/align/human/poznan-oracle.al -n char -s iterative-band > poznan-oracle.al diff --git a/examples/script/.svn/text-base/example3.svn-base b/examples/script/.svn/text-base/example3.svn-base new file mode 100755 index 0000000..1412925 --- /dev/null +++ b/examples/script/.svn/text-base/example3.svn-base @@ -0,0 +1,6 @@ +#!/bin/bash + +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. + +$PROJECT_HOME/bin/maligna parse -c txt $PROJECT_HOME/example/txt/poznan-pl.txt $PROJECT_HOME/example/txt/poznan-de.txt | $PROJECT_HOME/bin/maligna modify -c split-sentence | $PROJECT_HOME/bin/maligna modify -c trim | $PROJECT_HOME/bin/maligna align -c viterbi -a oracle,normal -d $PROJECT_HOME/example/align/human/poznan-oracle.al -n char -s iterative-band > poznan-oracle.al diff --git a/examples/script/example1 b/examples/script/example1 new file mode 100755 index 0000000..d11a281 --- /dev/null +++ b/examples/script/example1 @@ -0,0 +1,7 @@ +#!/bin/bash + +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. + +$PROJECT_HOME/bin/maligna parse -c txt $PROJECT_HOME/example/txt/poznan-pl.txt $PROJECT_HOME/example/txt/poznan-de.txt | $PROJECT_HOME/bin/maligna modify -c split-sentence | $PROJECT_HOME/bin/maligna modify -c trim | $PROJECT_HOME/bin/maligna align -c viterbi -a normal -n char -s iterative-band | $PROJECT_HOME/bin/maligna select -c one-to-one | $PROJECT_HOME/bin/maligna format -c txt poznan-pl-align.txt poznan-de-align.txt + diff --git a/examples/script/example1.bat b/examples/script/example1.bat new file mode 100755 index 0000000..575480a --- /dev/null +++ b/examples/script/example1.bat @@ -0,0 +1,8 @@ +@echo off + +set SCRIPT_DIR=%~d0%~p0 +set PROJECT_HOME=%SCRIPT_DIR%..\.. +set BIN_DIR="%PROJECT_HOME%\bin" +set EXAMPLE_DIR="%PROJECT_HOME%\example" + +%BIN_DIR%\maligna parse -c txt %EXAMPLE_DIR%/txt/poznan-pl.txt %EXAMPLE_DIR%/txt/poznan-de.txt | %BIN_DIR%\maligna modify -c split-sentence | %BIN_DIR%\maligna modify -c trim | %BIN_DIR%\maligna align -c viterbi -a normal -n char -s iterative-band | %BIN_DIR%\maligna select -c one-to-one | %BIN_DIR%\maligna format -c txt poznan-pl-align.txt poznan-de-align.txt diff --git a/examples/script/example2 b/examples/script/example2 new file mode 100755 index 0000000..52f4e8e --- /dev/null +++ b/examples/script/example2 @@ -0,0 +1,10 @@ +#!/bin/bash + +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. + +$PROJECT_HOME/bin/maligna parse -c txt $PROJECT_HOME/example/txt/poznan-pl.txt $PROJECT_HOME/example/txt/poznan-de.txt | $PROJECT_HOME/bin/maligna modify -c split-sentence | $PROJECT_HOME/bin/maligna modify -c trim > poznan-split.al + +cat poznan-split.al | $PROJECT_HOME/bin/maligna align -c fb -a poisson -n word -s iterative-band | $PROJECT_HOME/bin/maligna select -c one-to-one | $PROJECT_HOME/bin/maligna select -c fraction -f 0.85 > poznan-align-length.al + +cat poznan-split.al | $PROJECT_HOME/bin/maligna align -c fb -a poisson,translation -n word -s iterative-band -t poznan-align-length.al > poznan-align.al diff --git a/examples/script/example2.bat b/examples/script/example2.bat new file mode 100755 index 0000000..74f50d1 --- /dev/null +++ b/examples/script/example2.bat @@ -0,0 +1,12 @@ +@echo off + +set SCRIPT_DIR=%~d0%~p0 +set PROJECT_HOME=%SCRIPT_DIR%..\.. +set BIN_DIR="%PROJECT_HOME%\bin" +set EXAMPLE_DIR="%PROJECT_HOME%\example" + +%BIN_DIR%\maligna parse -c txt %EXAMPLE_DIR%\txt\poznan-pl.txt %EXAMPLE_DIR%\txt\poznan-de.txt | %BIN_DIR%\maligna modify -c split-sentence | %BIN_DIR%\maligna modify -c trim > poznan-split.al + +type poznan-split.al | %BIN_DIR%\maligna align -c fb -a poisson -n word -s iterative-band | %BIN_DIR%\maligna select -c one-to-one | %BIN_DIR%\maligna select -c fraction -f 0.85 > poznan-align-length.al + +type poznan-split.al | %BIN_DIR%\maligna align -c fb -a poisson,translation -n word -s iterative-band -t poznan-align-length.al > poznan-align.al diff --git a/examples/script/example3 b/examples/script/example3 new file mode 100755 index 0000000..1412925 --- /dev/null +++ b/examples/script/example3 @@ -0,0 +1,6 @@ +#!/bin/bash + +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. + +$PROJECT_HOME/bin/maligna parse -c txt $PROJECT_HOME/example/txt/poznan-pl.txt $PROJECT_HOME/example/txt/poznan-de.txt | $PROJECT_HOME/bin/maligna modify -c split-sentence | $PROJECT_HOME/bin/maligna modify -c trim | $PROJECT_HOME/bin/maligna align -c viterbi -a oracle,normal -d $PROJECT_HOME/example/align/human/poznan-oracle.al -n char -s iterative-band > poznan-oracle.al diff --git a/examples/script/example3.bat b/examples/script/example3.bat new file mode 100755 index 0000000..d230c91 --- /dev/null +++ b/examples/script/example3.bat @@ -0,0 +1,8 @@ +@echo off + +set SCRIPT_DIR=%~d0%~p0 +set PROJECT_HOME=%SCRIPT_DIR%..\.. +set BIN_DIR="%PROJECT_HOME%\bin" +set EXAMPLE_DIR="%PROJECT_HOME%\example" + +%BIN_DIR%\maligna parse -c txt %EXAMPLE_DIR%/txt/poznan-pl.txt %EXAMPLE_DIR%/txt/poznan-de.txt | %BIN_DIR%\maligna modify -c split-sentence | %BIN_DIR%\maligna modify -c trim | %BIN_DIR%\maligna align -c viterbi -a oracle,normal -d %EXAMPLE_DIR%/align/human/poznan-oracle.al -n char -s iterative-band > poznan-oracle.al diff --git a/examples/split/.svn/all-wcprops b/examples/split/.svn/all-wcprops new file mode 100644 index 0000000..cf1873f --- /dev/null +++ b/examples/split/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 54 +/svnroot/align/!svn/ver/16/trunk/maligna/example/split +END +stallman-ch1.al +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/align/!svn/ver/16/trunk/maligna/example/split/stallman-ch1.al +END +gpl.al +K 25 +svn:wc:ra_dav:version-url +V 61 +/svnroot/align/!svn/ver/16/trunk/maligna/example/split/gpl.al +END +poznan.al +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/16/trunk/maligna/example/split/poznan.al +END diff --git a/examples/split/.svn/entries b/examples/split/.svn/entries new file mode 100644 index 0000000..125be2e --- /dev/null +++ b/examples/split/.svn/entries @@ -0,0 +1,64 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/example/split +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +gpl.al +file + + + + +2008-07-29T22:11:38.000000Z +a5c73b3e7e36af118fc0f5a47f763514 +2008-08-20T23:12:34.302965Z +16 +jarekl + +poznan.al +file + + + + +2007-04-17T11:33:56.000000Z +f8ebf2dcd0170565885df27d890f0fb0 +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-ch1.al +file + + + + +2008-07-27T21:16:17.000000Z +3ffc36aa242d9e8f7712846b5983789e +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/examples/split/.svn/text-base/gpl.al.svn-base b/examples/split/.svn/text-base/gpl.al.svn-base new file mode 100755 index 0000000..ae59318 --- /dev/null +++ b/examples/split/.svn/text-base/gpl.al.svn-base @@ -0,0 +1,466 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + Wersja 3, 29 czerwca 2007 r. + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + Preambuła + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + Ty także możesz ją stosować do swoich programów. + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + ZASADY I WARUNKI + 0. + Definicje + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + 1. + Kod źródłowy + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + 2. + Podstawowe zezwolenia + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + 3. + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + 4. + Przekazywanie wiernych kopii + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + 5. + Przekazywanie zmodyfikowanych wersji Źródła + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + 6. + Przekazywanie form niebędących źródłem + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + 7. + Warunki dodatkowe + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + 8. + Wygaśnięcie + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + 9. + Brak wymogu akceptacji przy otrzymaniu kopii + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + 10. + Automatyczne udzielenie licencji kolejnym odbiorcom + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + 11. + Patenty + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + 12. + Zakaz ograniczania praw (wolności) osób trzecich + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + 13. + Używanie z Powszechną Licencją Publiczną GNU Affero + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + 14. + Poprawione wersje niniejszej Licencji + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + Każdej wersji nadaje się wyróżniający ją numer. + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + 15. + Zastrzeżenia dotyczące gwarancji + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + 16. + Ograniczenie odpowiedzialności + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + 17. + Interpretacja punktów 15 i 16 + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + KONIEC ZASAD I WARUNKÓW + Jak stosować niniejsze warunki do twoich nowych programów + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + W tym celu do programu dołącz poniższe informacje. + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + Copyright (C) <rok> <imię i nazwisko twórcy> + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + Preamble + The GNU General Public License is a free, copyleft license for software and other kinds of works. + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + You can apply it to your programs, too. + When we speak of free software, we are referring to freedom, not price. + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + You must make sure that they, too, receive or can get the source code. + And you must show them these terms so they know their rights. + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + Finally, every program is threatened constantly by software patents. + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + The precise terms and conditions for copying, distribution and modification follow. + TERMS AND CONDITIONS + 0. + Definitions. + “This License” refers to version 3 of the GNU General Public License. + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + “The Program” refers to any copyrightable work licensed under this License. + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + A “covered work” means either the unmodified Program or a work based on the Program. + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + 1. + Source Code. + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + The Corresponding Source for a work in source code form is that same work. + 2. + Basic Permissions. + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + This License explicitly affirms your unlimited permission to run the unmodified Program. + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + Conveying under any other circumstances is permitted solely under the conditions stated below. + Sublicensing is not allowed; section 10 makes it unnecessary. + 3. + Protecting Users' Legal Rights From Anti-Circumvention Law. + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + 4. + Conveying Verbatim Copies. + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + 5. + Conveying Modified Source Versions. + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + This requirement modifies the requirement in section 4 to “keep intact all notices”. + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + 6. + Conveying Non-Source Forms. + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + You need not require recipients to copy the Corresponding Source along with the object code. + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + 7. + Additional Terms. + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + 8. + Termination. + You may not propagate or modify a covered work except as expressly provided under this License. + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + 9. + Acceptance Not Required for Having Copies. + You are not required to accept this License in order to receive or run a copy of the Program. + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + However, nothing other than this License grants you permission to propagate or modify any covered work. + These actions infringe copyright if you do not accept this License. + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + 10. + Automatic Licensing of Downstream Recipients. + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + You are not responsible for enforcing compliance by third parties with this License. + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + 11. + Patents. + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + The work thus licensed is called the contributor's “contributor version”. + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + 12. + No Surrender of Others' Freedom. + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + 13. + Use with the GNU Affero General Public License. + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + 14. + Revised Versions of this License. + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + Each version is given a distinguishing version number. + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + Later license versions may give you additional or different permissions. + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + 15. + Disclaimer of Warranty. + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. + Limitation of Liability. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + 17. + Interpretation of Sections 15 and 16. + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + END OF TERMS AND CONDITIONS + How to Apply These Terms to Your New Programs + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + To do so, attach the following notices to the program. + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along with this program. + If not, see <http://www.gnu.org/licenses/>. + Also add information on how to contact you by electronic and paper mail. + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + The GNU General Public License does not permit incorporating your program into proprietary programs. + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/examples/split/.svn/text-base/poznan.al.svn-base b/examples/split/.svn/text-base/poznan.al.svn-base new file mode 100755 index 0000000..0c4b085 --- /dev/null +++ b/examples/split/.svn/text-base/poznan.al.svn-base @@ -0,0 +1,87 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + Jego powierzchnia wynosi 285 ha. + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + Wędkować można zarówno z brzegu, jak i łodzi. + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + Jezioro Malta jest zbiornikiem sztucznym. + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + Akwen zajmuje powierzchnię 36,7 ha. + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + Długość linii brzegowej wynosi 3300 m. + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + Ośrodek może przyjąć ok. 10 tys.osób. + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + Powierzchnia akwenu wynosi 34,9 ha. + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + Jezioro zaliczane jest do typu sielawowego. + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + Seine Fläche beträgt 285 ha. + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + Der Rusałka - See ist ein künstliches Wasserreservoir. + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + Der See hat eine Fläche von 36,7 ha. + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + Die Länge der Uferlinie beträgt 3300 m. + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + Die Fläche des Sees beträgt 34,9 ha. + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + Der See wird vom Polnischen Angelverein in Poznań genutzt. + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + In dem See überwiegt die Kleine Maräne. + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/examples/split/.svn/text-base/stallman-ch1.al.svn-base b/examples/split/.svn/text-base/stallman-ch1.al.svn-base new file mode 100755 index 0000000..b2b940c --- /dev/null +++ b/examples/split/.svn/text-base/stallman-ch1.al.svn-base @@ -0,0 +1,385 @@ + + + + + Rozdział 1. + Gdy potrzebna drukarka + Obawiam się Greków, nawet gdy przynoszą dary + - Wergiliusz + Eneida + Nowa drukarka znowu się zacięła. + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + Urządzenie było darem Xerox Corporation. + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + Natychmiast osiągnięto zadawalające rezultaty. + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + Był to ze pod każdym względem dar, który należało docenić. + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + W ich założeniach czujna obecność użytkownika było częścią systemu. + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + Jednakże jako haker miał do dyspozycji inne źródła informacji. + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + Dla Reida była to procedura doskonała. + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + Nie musiał długo czekać. + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + Pamięć jest ciekawą rzeczą. + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + Na początku uznał odmowę za skierowaną przeciwko sobie. + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + Być może nawet trzasnąłem drzwiami. + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + Teraz nowa drukarka stała się oznaką zmian, które nastały. + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + Pojawiło się w postaci daru. + Stallman musiał przełknąć dwie gorzkie pigułki. + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + Dla Stallmana był to początek staczania się po równi pochyłej. + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + Chapter 1 + For Want of a Printer + I fear the Greeks. + Even when they bring gifts. + ---Virgil + The Aeneid + The new printer was jammed, again. + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + Upon arrival, he found only four pages in the printer's tray. + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + Stallman wondered. + The machine had been a donation from the Xerox Corporation. + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + The results had been immediately pleasing. + Unlike the lab's old laser printer, the new Xerox machine was fast. + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + The new machine was also more precise. + Circles came out looking like circles, not ovals. + Straight lines came out looking like straight lines, not low-amplitude sine waves. + It was, for all intents and purposes, a gift too good to refuse. + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + Engineering-minded programmers quickly understood the reason behind the flaw. + As a photocopier, the machine generally required the direct oversight of a human operator. + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + In engineering terms, user diligence was built into the system. + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + As fixes go, Stallman's was oblique but elegant. + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + Of those two or three people, one of them, at least, would usually know how to fix the problem." + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + Improving a program was the true test of a hacker's skills.1 + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + He simply looked for a way to update the old fix or " hack" for the new system. + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + Xerox, in this instance, had provided software files in precompiled, or binary, form. + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + As a hacker, however, he had other resources at his disposal. + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + Why not share it out of a simple desire for good karma? + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + When the desired files failed to surface, however, Stallman began to grow suspicious. + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + For Reid, the deal was a win-win. + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + He didn't have to wait long. + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + During that visit, he made sure to stop by the computer-science department. + Department employees directed him to the office of the faculty member leading the Xerox project. + When Stallman reached the office, he found the professor working there. + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + To his surprise, the professor refused to grant his request. + "He told me that he had promised not to give me a copy," Stallman says. + Memory is a funny thing. + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + When asked directly about the request, however, Sproull draws a blank. + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + "They would have been insane to give away the source code." + For Stallman, however, the NDA was something else entirely. + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + At first, all he could focus on was the personal nature of the refusal. + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + "I might have slammed the door. + Who knows? + All I remember is wanting to get out of there." + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + From the viewpoint of the entire software industry, the printer was a wake-up call. + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + From Stallman's viewpoint, the printer was a Trojan Horse. + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + It had come disguised as a gift. + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + Sooner or later, they reasoned, the software would become public knowledge. + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + For Stallman, however, it was the first step down a slippery slope. + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + Hence the importance of the laser printer and the encounter that resulted from it. + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/examples/split/gpl.al b/examples/split/gpl.al new file mode 100755 index 0000000..ae59318 --- /dev/null +++ b/examples/split/gpl.al @@ -0,0 +1,466 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + Wersja 3, 29 czerwca 2007 r. + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + Preambuła + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + Ty także możesz ją stosować do swoich programów. + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + ZASADY I WARUNKI + 0. + Definicje + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + 1. + Kod źródłowy + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + 2. + Podstawowe zezwolenia + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + 3. + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + 4. + Przekazywanie wiernych kopii + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + 5. + Przekazywanie zmodyfikowanych wersji Źródła + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + 6. + Przekazywanie form niebędących źródłem + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + 7. + Warunki dodatkowe + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + 8. + Wygaśnięcie + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + 9. + Brak wymogu akceptacji przy otrzymaniu kopii + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + 10. + Automatyczne udzielenie licencji kolejnym odbiorcom + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + 11. + Patenty + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + 12. + Zakaz ograniczania praw (wolności) osób trzecich + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + 13. + Używanie z Powszechną Licencją Publiczną GNU Affero + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + 14. + Poprawione wersje niniejszej Licencji + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + Każdej wersji nadaje się wyróżniający ją numer. + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + 15. + Zastrzeżenia dotyczące gwarancji + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + 16. + Ograniczenie odpowiedzialności + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + 17. + Interpretacja punktów 15 i 16 + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + KONIEC ZASAD I WARUNKÓW + Jak stosować niniejsze warunki do twoich nowych programów + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + W tym celu do programu dołącz poniższe informacje. + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + Copyright (C) <rok> <imię i nazwisko twórcy> + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + Preamble + The GNU General Public License is a free, copyleft license for software and other kinds of works. + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + You can apply it to your programs, too. + When we speak of free software, we are referring to freedom, not price. + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + You must make sure that they, too, receive or can get the source code. + And you must show them these terms so they know their rights. + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + Finally, every program is threatened constantly by software patents. + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + The precise terms and conditions for copying, distribution and modification follow. + TERMS AND CONDITIONS + 0. + Definitions. + “This License” refers to version 3 of the GNU General Public License. + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + “The Program” refers to any copyrightable work licensed under this License. + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + A “covered work” means either the unmodified Program or a work based on the Program. + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + 1. + Source Code. + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + The Corresponding Source for a work in source code form is that same work. + 2. + Basic Permissions. + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + This License explicitly affirms your unlimited permission to run the unmodified Program. + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + Conveying under any other circumstances is permitted solely under the conditions stated below. + Sublicensing is not allowed; section 10 makes it unnecessary. + 3. + Protecting Users' Legal Rights From Anti-Circumvention Law. + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + 4. + Conveying Verbatim Copies. + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + 5. + Conveying Modified Source Versions. + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + This requirement modifies the requirement in section 4 to “keep intact all notices”. + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + 6. + Conveying Non-Source Forms. + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + You need not require recipients to copy the Corresponding Source along with the object code. + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + 7. + Additional Terms. + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + 8. + Termination. + You may not propagate or modify a covered work except as expressly provided under this License. + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + 9. + Acceptance Not Required for Having Copies. + You are not required to accept this License in order to receive or run a copy of the Program. + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + However, nothing other than this License grants you permission to propagate or modify any covered work. + These actions infringe copyright if you do not accept this License. + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + 10. + Automatic Licensing of Downstream Recipients. + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + You are not responsible for enforcing compliance by third parties with this License. + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + 11. + Patents. + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + The work thus licensed is called the contributor's “contributor version”. + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + 12. + No Surrender of Others' Freedom. + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + 13. + Use with the GNU Affero General Public License. + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + 14. + Revised Versions of this License. + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + Each version is given a distinguishing version number. + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + Later license versions may give you additional or different permissions. + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + 15. + Disclaimer of Warranty. + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. + Limitation of Liability. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + 17. + Interpretation of Sections 15 and 16. + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + END OF TERMS AND CONDITIONS + How to Apply These Terms to Your New Programs + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + To do so, attach the following notices to the program. + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along with this program. + If not, see <http://www.gnu.org/licenses/>. + Also add information on how to contact you by electronic and paper mail. + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + The GNU General Public License does not permit incorporating your program into proprietary programs. + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/examples/split/poznan.al b/examples/split/poznan.al new file mode 100755 index 0000000..0c4b085 --- /dev/null +++ b/examples/split/poznan.al @@ -0,0 +1,87 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + Jego powierzchnia wynosi 285 ha. + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + Wędkować można zarówno z brzegu, jak i łodzi. + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + Jezioro Malta jest zbiornikiem sztucznym. + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + Akwen zajmuje powierzchnię 36,7 ha. + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + Długość linii brzegowej wynosi 3300 m. + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + Ośrodek może przyjąć ok. 10 tys.osób. + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + Powierzchnia akwenu wynosi 34,9 ha. + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + Jezioro zaliczane jest do typu sielawowego. + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + Seine Fläche beträgt 285 ha. + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + Der Rusałka - See ist ein künstliches Wasserreservoir. + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + Der See hat eine Fläche von 36,7 ha. + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + Die Länge der Uferlinie beträgt 3300 m. + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + Die Fläche des Sees beträgt 34,9 ha. + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + Der See wird vom Polnischen Angelverein in Poznań genutzt. + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + In dem See überwiegt die Kleine Maräne. + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/examples/split/stallman-ch1.al b/examples/split/stallman-ch1.al new file mode 100755 index 0000000..b2b940c --- /dev/null +++ b/examples/split/stallman-ch1.al @@ -0,0 +1,385 @@ + + + + + Rozdział 1. + Gdy potrzebna drukarka + Obawiam się Greków, nawet gdy przynoszą dary + - Wergiliusz + Eneida + Nowa drukarka znowu się zacięła. + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + Urządzenie było darem Xerox Corporation. + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + Natychmiast osiągnięto zadawalające rezultaty. + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + Był to ze pod każdym względem dar, który należało docenić. + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + W ich założeniach czujna obecność użytkownika było częścią systemu. + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + Jednakże jako haker miał do dyspozycji inne źródła informacji. + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + Dla Reida była to procedura doskonała. + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + Nie musiał długo czekać. + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + Pamięć jest ciekawą rzeczą. + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + Na początku uznał odmowę za skierowaną przeciwko sobie. + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + Być może nawet trzasnąłem drzwiami. + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + Teraz nowa drukarka stała się oznaką zmian, które nastały. + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + Pojawiło się w postaci daru. + Stallman musiał przełknąć dwie gorzkie pigułki. + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + Dla Stallmana był to początek staczania się po równi pochyłej. + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + Chapter 1 + For Want of a Printer + I fear the Greeks. + Even when they bring gifts. + ---Virgil + The Aeneid + The new printer was jammed, again. + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + Upon arrival, he found only four pages in the printer's tray. + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + Stallman wondered. + The machine had been a donation from the Xerox Corporation. + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + The results had been immediately pleasing. + Unlike the lab's old laser printer, the new Xerox machine was fast. + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + The new machine was also more precise. + Circles came out looking like circles, not ovals. + Straight lines came out looking like straight lines, not low-amplitude sine waves. + It was, for all intents and purposes, a gift too good to refuse. + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + Engineering-minded programmers quickly understood the reason behind the flaw. + As a photocopier, the machine generally required the direct oversight of a human operator. + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + In engineering terms, user diligence was built into the system. + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + As fixes go, Stallman's was oblique but elegant. + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + Of those two or three people, one of them, at least, would usually know how to fix the problem." + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + Improving a program was the true test of a hacker's skills.1 + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + He simply looked for a way to update the old fix or " hack" for the new system. + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + Xerox, in this instance, had provided software files in precompiled, or binary, form. + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + As a hacker, however, he had other resources at his disposal. + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + Why not share it out of a simple desire for good karma? + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + When the desired files failed to surface, however, Stallman began to grow suspicious. + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + For Reid, the deal was a win-win. + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + He didn't have to wait long. + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + During that visit, he made sure to stop by the computer-science department. + Department employees directed him to the office of the faculty member leading the Xerox project. + When Stallman reached the office, he found the professor working there. + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + To his surprise, the professor refused to grant his request. + "He told me that he had promised not to give me a copy," Stallman says. + Memory is a funny thing. + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + When asked directly about the request, however, Sproull draws a blank. + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + "They would have been insane to give away the source code." + For Stallman, however, the NDA was something else entirely. + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + At first, all he could focus on was the personal nature of the refusal. + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + "I might have slammed the door. + Who knows? + All I remember is wanting to get out of there." + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + From the viewpoint of the entire software industry, the printer was a wake-up call. + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + From Stallman's viewpoint, the printer was a Trojan Horse. + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + It had come disguised as a gift. + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + Sooner or later, they reasoned, the software would become public knowledge. + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + For Stallman, however, it was the first step down a slippery slope. + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + Hence the importance of the laser printer and the encounter that resulted from it. + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/examples/txt/.svn/all-wcprops b/examples/txt/.svn/all-wcprops new file mode 100644 index 0000000..0338e20 --- /dev/null +++ b/examples/txt/.svn/all-wcprops @@ -0,0 +1,77 @@ +K 25 +svn:wc:ra_dav:version-url +V 52 +/svnroot/align/!svn/ver/16/trunk/maligna/example/txt +END +poznan-de.txt +K 25 +svn:wc:ra_dav:version-url +V 65 +/svnroot/align/!svn/ver/8/trunk/maligna/example/txt/poznan-de.txt +END +poznan-small-pl.txt +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/align/!svn/ver/8/trunk/maligna/example/txt/poznan-small-pl.txt +END +stallman-pl.txt +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/align/!svn/ver/16/trunk/maligna/example/txt/stallman-pl.txt +END +stallman-ch1-pl.txt +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/16/trunk/maligna/example/txt/stallman-ch1-pl.txt +END +gpl-en.txt +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/16/trunk/maligna/example/txt/gpl-en.txt +END +poznan-small-de.txt +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/align/!svn/ver/8/trunk/maligna/example/txt/poznan-small-de.txt +END +help-en.txt +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/8/trunk/maligna/example/txt/help-en.txt +END +gpl-pl.txt +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/16/trunk/maligna/example/txt/gpl-pl.txt +END +help-pl.txt +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/8/trunk/maligna/example/txt/help-pl.txt +END +poznan-pl.txt +K 25 +svn:wc:ra_dav:version-url +V 65 +/svnroot/align/!svn/ver/8/trunk/maligna/example/txt/poznan-pl.txt +END +stallman-en.txt +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/align/!svn/ver/16/trunk/maligna/example/txt/stallman-en.txt +END +stallman-ch1-en.txt +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/16/trunk/maligna/example/txt/stallman-ch1-en.txt +END diff --git a/examples/txt/.svn/entries b/examples/txt/.svn/entries new file mode 100644 index 0000000..cb6b971 --- /dev/null +++ b/examples/txt/.svn/entries @@ -0,0 +1,172 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/example/txt +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +gpl-en.txt +file + + + + +2008-07-29T21:07:54.000000Z +4651d3fd373932dcc2541ec75d762951 +2008-08-20T23:12:34.302965Z +16 +jarekl + +gpl-pl.txt +file + + + + +2008-07-29T21:07:39.000000Z +211e90d57a72f84bd4ba9ed74b703843 +2008-08-20T23:12:34.302965Z +16 +jarekl + +help-en.txt +file + + + + +2008-08-20T22:32:36.847000Z +30fbea6e71de7813398d25ca4ceed234 +2008-01-14T15:11:50.564431Z +6 +jarekl + +help-pl.txt +file + + + + +2008-08-20T22:32:36.890000Z +408494d93ccf94a2ee19eb573dcfd67c +2008-01-14T15:11:50.564431Z +6 +jarekl + +poznan-de.txt +file + + + + +2006-06-14T01:41:49.000000Z +1ffca4067070c473bf1680c9f99d8e4b +2008-01-14T15:11:50.564431Z +6 +jarekl + +poznan-pl.txt +file + + + + +2006-06-14T02:02:42.000000Z +c0df2fff64627754f89228900cb784cf +2008-01-14T15:11:50.564431Z +6 +jarekl + +poznan-small-de.txt +file + + + + +2006-05-30T02:40:58.000000Z +88d25b14d3f2a768dce74680e31fed6c +2008-01-14T15:11:50.564431Z +6 +jarekl + +poznan-small-pl.txt +file + + + + +2006-05-30T02:41:08.000000Z +d5cc1e5aa2524eafa7c6e36850959aa1 +2008-01-14T15:11:50.564431Z +6 +jarekl + +stallman-ch1-en.txt +file + + + + +2008-07-27T19:52:46.000000Z +5efb4478260ace3f1d479f4e029449e1 +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-ch1-pl.txt +file + + + + +2008-07-27T19:51:51.000000Z +c4b9d9f923948f6e46166e152a0dcf3c +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-en.txt +file + + + + +2006-11-11T21:46:00.000000Z +c0f520a46f00613d707064541994c6d8 +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-pl.txt +file + + + + +2008-07-27T00:44:34.000000Z +fdebf4c1a5f1028370d85f431c04f99d +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/examples/txt/.svn/text-base/gpl-en.txt.svn-base b/examples/txt/.svn/text-base/gpl-en.txt.svn-base new file mode 100755 index 0000000..96ac7bf --- /dev/null +++ b/examples/txt/.svn/text-base/gpl-en.txt.svn-base @@ -0,0 +1,226 @@ +GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright © 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +Preamble + +The GNU General Public License is a free, copyleft license for software and other kinds of works. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. +TERMS AND CONDITIONS +0. Definitions. + +“This License” refers to version 3 of the GNU General Public License. + +“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + +To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + +A “covered work” means either the unmodified Program or a work based on the Program. + +To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + +To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. +1. Source Code. + +The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + +A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. +2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. +7. Additional Terms. + +“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. +11. Patents. + +A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. + +A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + +You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . + +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . + diff --git a/examples/txt/.svn/text-base/gpl-pl.txt.svn-base b/examples/txt/.svn/text-base/gpl-pl.txt.svn-base new file mode 100755 index 0000000..edcd198 --- /dev/null +++ b/examples/txt/.svn/text-base/gpl-pl.txt.svn-base @@ -0,0 +1,254 @@ +POWSZECHNA LICENCJA PUBLICZNA GNU + +Wersja 3, 29 czerwca 2007 r. + +Copyright (C) 2007 Free Software Foundation, Inc. + +Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + +Preambuła + +Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + +Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. Ty także możesz ją stosować do swoich programów. + +Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + +Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + +Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + +Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + +Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + +Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + +Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + +Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + +ZASADY I WARUNKI + +0. Definicje + +„Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + +„Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + +„Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + +„Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + +„Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + +„Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + +„Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + +Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + +1. Kod źródłowy + +„Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + +„Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + +„Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + +„Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + +Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + +Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + +2. Podstawowe zezwolenia + +Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + +Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + +Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + +3. Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + +Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + +Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + +4. Przekazywanie wiernych kopii + +Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + +Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + +5. Przekazywanie zmodyfikowanych wersji Źródła + +Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + +a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + +b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + +c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + +d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + +Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + +6. Przekazywanie form niebędących źródłem + +Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + +a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + +b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + +c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + +d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + +e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + +Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + +„Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + +„Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + +Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + +Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + +Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + +7. Warunki dodatkowe + +„Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + +Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + +Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + +a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + +b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + +c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + +d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + +e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + +f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + +Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + +Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + +Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + +8. Wygaśnięcie + +Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + +Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + +Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + +Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + +9. Brak wymogu akceptacji przy otrzymaniu kopii + +Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + +10. Automatyczne udzielenie licencji kolejnym odbiorcom + +Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + +„Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + +Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + +11. Patenty + +„Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + +„Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + +Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + +W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + +Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + +Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + +Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + +Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + +12. Zakaz ograniczania praw (wolności) osób trzecich + +Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + +13. Używanie z Powszechną Licencją Publiczną GNU Affero + +Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + +14. Poprawione wersje niniejszej Licencji + +W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + +Każdej wersji nadaje się wyróżniający ją numer. Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + +Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + +Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + +15. Zastrzeżenia dotyczące gwarancji + +W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + +16. Ograniczenie odpowiedzialności + +O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + +17. Interpretacja punktów 15 i 16 + +Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + +KONIEC ZASAD I WARUNKÓW + +Jak stosować niniejsze warunki do twoich nowych programów + +Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + +W tym celu do programu dołącz poniższe informacje. Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + +Copyright (C) + +Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + +Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + +Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. Jeżeli nie została dostarczona, odwiedź . + +Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + +Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + Copyright (C) + +Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + +To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + +Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + +Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie . + +Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. Najpierw jednak przeczytaj . + diff --git a/examples/txt/.svn/text-base/help-en.txt.svn-base b/examples/txt/.svn/text-base/help-en.txt.svn-base new file mode 100755 index 0000000..f90bb26 --- /dev/null +++ b/examples/txt/.svn/text-base/help-en.txt.svn-base @@ -0,0 +1,1156 @@ +#$ +A Few Words About Automatic Translation + +The idea of translating texts from one language to another using a computer is almost as old as the computer itself. In the course of the cold war Allied secret service workers hoped the computer to replace qualified spies in translating secret Russian documents into English. Even though translation of documents becomes a reality today, the vision of an international conference without human translators seems as distant as it was half a century ago. + +With years, linguists, philologists, and computer scientists verified their expectations from an automatic translator and simultaneously tried to alter the attitude of users. Both parties came to the conclusion that the computer cannot translate Shakespeare, Joyce, nor Wharton. It is not able to translate even a simple joke. Automatic translation is not applicable in the case of translation of literary texts, it is, however, adequate when dealing with professional texts from specific, preferably narrowed, domains. + +In the case of texts from general domain the computer may only help man establish the subject matter of a text, or do the hard work that boils down to the specification of most appropriate equivalents in particular contexts. It can also order them in the most probable linguistic units. Nevertheless, the task of the ultimate establishment of meaning still depends on man. + + +Direct Translation + +The easiest fashion of translating texts is the substitution of a words of a source language with respective equivalents from a target language. Setting aside the fact that as early as in '60 it was acknowledged that the method is unreliable, systems of automatic translation that rely on it are still being developed. This method is applied in the majority of translating systems available on the Polish market. + +Test +djshusf + + +Transfer-Based Translation + +The most widespread method incorporated in the automatic translation systems around the world is the transfer method. It comprises the following: +• dictionary; +• text representation; +• grammar; +• syntax analysis. + + +Dictionary + +The most laborious part in the process of developing an automatic translation system is the compilation of its dictionary. The description of a dictionary data should meet the following requirements: +• the description must be compatible with the translation algorithm, +• the coverage of dictionary should be as complete as possible, +• entries of the dictionary should be elaborated in as much detail as possible; +The simultaneous fulfilment of the conditions mentioned above is not straightforward, and the compilation of a 'decent' dictionary is time-consuming. That is why automatic translation systems most of the times rely heavily on a vocabulary from a limited domain only. + + +Text Representation + +A pivotal stage in a translation is the manner of presenting an analysed section (most frequently a sentence) in the form that can be then transferred to a representation of a target sentence. The Phrase Structure and the Relation Tree are the two most commonly found representation methods. +The former is the traditional fashion of presenting the structure of a sentence. The Polish sentence 'Zły wilk goni słabą owieczkę' is structured as follows: + + +The tree represents the following organizational pattern: The sentence comprises the nominal and the verb phrase. The nominal phrase comprises the adjective 'zły' and the noun 'wilk'. The verb phrase comprises the verb 'goni' and the sub-structure: the nominal phrase. The sub-structure of the nominal phrase is constituted by the adjective 'słabą' and the noun 'owieczkę'. + +In the tree structure approach it is assumed that every word (with the exception of the predicate verb) in a sentence is dependent on another one. The tree represents this dependence. An example of a sentence represented by the means of a relation tree structure is shown below: + +Figure 3. An example of the relation tree + +The subject of the activity ('pies') and the object of the activity ('mysz') depend on the verb. Adjectives determining the noun ('duży' and 'wściekłą') depend on the respective nouns ('pies' and 'mysz'). It is not always easy to determine relationship between individual components -- related words do not have to be adjacent. The sentence 'Słabą goni wilk zły owieczkę', for instance, may be presented using the tree structure from Figure 3. The dependence between the adjective 'słabą' and the noun 'owieczkę' is established on the premises of case, gender, and number agreement of both words. + + +Grammar + +Having determined the manner of representation of a text it becomes necessary to establish a method of such a representation. Most often this task comprises of grammar description and syntax analysis of a text. By the notion of grammar a number of rules that specify how correct sentence structures can be formed is understood. Additionally, grammar may contain information about the structure of sentences formed on the basis of those rules. + +Grammar is a mathematical attempt to delineate linguistic processes that are reluctant to subdue to mathematical formalisation. As for now, no formal representation of a language have been developed that would encompass all possible constructions. In other words, no matter the level of advancement of a grammar description, man can produce a sentence the structure of which has not been included in this description. + + +Syntax Analysis + +The process of verification of compatibility between a text and a grammar description is called syntax analysis. Its outcome is both to affirm whether a particular sentence agrees with the grammar description (a sentence that meets such requirements is correct) and to yield a sentence structure in a given representational method (e.g. in a tree structure). In the case of automatic translation it is vital that the syntax analysis yields representational schemata also for sentences that do not agree with the grammar description. + + +Transfer + +A text representation that has been syntactically analysed then undergoes transfer. In TRANSLATICA this stage entails transformation of a syntactical structure of a source language into a respective tree structure in a target language. Both representations can be compared by using the option of translating with the display of tree structure (button ) + + +Generating Translation + +The last stage of the transfer-based method of translation is generating a translated text on the basis of the previously obtained representation. At this stage one has to be mindful of a specific word order in a given language and of the manner of inflecting words. + +#$ +Main Features of TRANSLATICA + +The History of Development + +The TRANSLATICA system was developed between 1996 and 2002 as the POLENG system that translated only from Polish into English. It originated at Adam Mickiewicz University in Poznan at the Faculty of Mathematics and Computer Science, with the help of The State Committee for Scientific Research (between 1999 and 2000), Polish Phonetic Association (between 1996 and 2001), and Allied Irish Bank (2002). + +The TRANSLATICA system originated in the year 2004, when, on the basis of the previously developed translation techniques on the one hand and the lexicon based on the PWN-Oxford English-Polish Dictionary, the function of translating from English into Polish was added. +In 2005 the new edition of TRANSLATICA was published. It included a broader dictionary of words and phrases, larger sets of transfer rules and integration with a wider range of office application. + + +TRANSLATICA Dictionary + +A dictionary used in a machine translation system has to be compatible with a computer algorithm. + +As the development of entries in such a dictionary is laborious, a very careful selection of the words to be included in the dictionary becomes a prerequisite. In the course of the development of Polish-English translation by the POLENG team a number of computer, legal, economic and internet texts was assembled, from which the most frequent words and phrases were selected. Afterwards, the phrases were carefully annotated according to the rules of the translation system and incorporated in the TRANSLATICA dictionary. The source of vocabulary used in the English-Polish translation is the PWN-Oxford English-Polish Dictionary (a Polish abbreviation for the name is WSAP). The following versions of TRANSLATICA are to be based on the Polish-English PWN-Oxford dictionary (currently under construction - 2004). The WSAP dictionary was also used (after being reverseA +d) to supplement Polish-English dictionary in TRANSLATICA, the result being the greater accuracy of Polish-English entries. However, the greater accuracy of the dictionary does not entail a better quality of translation. In the authors' opinion, the quality of Polish-English translation is higher than the English-Polish one. + + +Grammar, Representation, and Syntax Analysis + +The authors have developed their own formalism for the description of both grammar and transfer rules. The same formalism is used for both Polish-English and English-Polish translation, but the rules themselves differ. As a result, the translation process is irreversible: e.g. an attempt to translate a Polish text to English and then back to Polish will usually result in the original and the resulting Polish texts being different. The idea of reversible translation is tempting, but given the differences between languages it has not yet been implemented even for closely related languages. + +In TRANSLATICA, the text is processed to the form of a phrase structure (see Text Representation in the section A few words about automatic translationIDH_ABOUT_MT). Syntactic analysis allows structures incongruent with the grammatical description (including language errors), and for each such construction a text representation is generated and transferred. + + +Some Interesting Issues in Translation + +As Polish and English belong to different language families (Slavonic and Germanic respectively) even the simplest sentence constructions may differ. + + +Syntax Differences + +Polish allows a relatively unrestrained variation in the order of sentence components (e.g. the verb often precedes the subject). English syntax is much more restrictive. Moreover, it is sometimes the case that the subject in a Polish sentence becomes the object in the English equivalent of that sentence, or the other way round. Additionally, a dummy subject may operate in Polish, whereas it does not occur in English. Let us consider a few examples: + +Ty mi się wcale nie podobasz. +Ty nie podobasz się mi wcale. +Ty wcale nie podobasz się mi. +Ty wcale mi się nie podobasz. +Wcale mi się nie podobasz. +Mi się wcale nie podobasz. +Mi się nie podobasz wcale. +Nie podobasz się mi wcale. + +The English equivalent for all of those sentences is: I don't like you at all. And that is the translation produced by TRANSLATICA for any of the Polish sentences listed above. + + +Differences in the Meanings of Words + +A Polish word may have a number of equivalents in English, and vice versa. The task of a machine translation system is to choose the most appropriate equivalent in a given context and in a given sentence. For instance, in TRANSLATICA dictionary the verb stop has 20 different equivalents (nothing to say about noun meanings of the word). TRANSLATICA translation algorithm finds the most appropriate equivalent on the basis of a sentence structure analysis and the context of translation, as in: +The car stopped at lights. Samochód zatrzymał się na światłach. +The pain stopped when she had a cup of coffee. Ból ustał, gdy wypiła filiżankę kawy. +He stopped the hole with wax. Zatkał dziurę woskiem. +He wondered if the wind would stop. Zastanawiał się czy wiatr ustanie. +How to stop violence in the family? Jak powstrzymać przemoc w rodzinie? +The strike will stop the production. Strajk spowoduje przerwę w produkcji. +The judge has unfortunately stopped the trial. Sędzia niestety nie dopuścił do rozprawy. +In the southern regions of the country the electricity has been stopped. W południowych regionach kraju elektryczność została odcięta. +When he enters the room, the music will stop. Gdy on wejdzie do pokoju, muzyka ucichnie. +After 10 minutes he stopped smoking. Po 10 minutach przestał palić. +They stopped for a lunch in a nice restaurant. Zatrzymali się na lunch w ładnej restauracji. + + +#$ +Local Installation + +To install the TRANSLATICA software launch TRANSLATICA_Setup.exe file. The installation program copies the files to the user's computer and then initiates the Integrator. The role of the Integrator is to add the functionality of TRANSLATICA to the applications chosen by the user (see IntegratorIDH_VERSIONS). The program can be uninstalled by clicking the Start menu and selecting: Programs -> Translatica Enterprise/Office+ > Uninstall. + + +#$ +Installation in the Local Area Network + +In case of local networks that run under Microsoft Windows it is possible to install TRANSLATICA for specific users or computers. This requires that the services: Active Directory, DNS, DHCP are configured correctly on the server. +The installation file (Translatica-Enterprise.msi) should be copied into a chosen folder (e.g. Msi_Pack) on any partition that does not store the operating system or boots the computer. +The folder should be shared in the network. + + + +Choose Start ->ProgramS -> Administrative Tools -> Active Directory Users and Computers. From the pop-up menu of the domain click New -> Organizational Unit. + + + +When the organization unit is created, add new users to the organizational unit. + + + +Next, set the properties of the unit: Choose Properties from the pop-up menu. Add a new Group Policy in the Group Policy tab. Edit the policy according to the required configuration. + +Installation dedicated for the User + +The aim of such an installation is to enable the chosen user to run TRANSLATICA on any computer of the network. +To do that, click the icon UserConfiguration, next choose Software Settings. + + + +Right-click Software installation, choose New -> Package, and point to the msi file, located in the installtion folder. Choose the method of installation in the Deployment Software window. Choose Assigned if the installation should be executed automatically directly after the user logs in. Choose Published if you wish the user to install the software on his/her demand (this is done via Control Panel -> Add or Remove Programs -> Add New Programs). + + + +Installation dedicated for the Computer + +This aims to enable any user to run TRANSLATICA on a specific computer. +To do that, click Computer Configuration, next Software Settings. + + + +Right-click Software installation, choose New -> Package, and point to the msi file located in the installation folder. The installation will be started on the computer directly after the re-start. + +#$ +Versions of TRANSLATICA + +The TRANSLATICA translation program comes in two basic versions: Premium and Office, and two other versions dedicated for corporations: Office+ and Enterprise. + +The Premium version is intended for fast processing of documents connected with Internet - web pages or Outlook Express documents. + +Versions: Office, Office+ and Enterprise add the functions of translating documents within MS Office programs: MS Word, MS Excel, MS PowerPoint, MS Outlook and two Open Office programs: Writer and Calc. + +Office+ and Enterprise versions include Batcher, the program that allows for translation of a number of documents in the batch mode. The Enterprise version is additionally equipped with functions that allow the system to be adjusted to the requirements of a particular company. These functions include: Domain Dictionaries, Translation Memory and Company Dictionary. + +In all versions, the user can apply the translation text editor. Translation Editor allows the user to use the translation function in a user-friendly editing environment. + + +#$ K +Integrator + +You can launch the Integrator by clicking the Start menu and selecting: Programs -> Translatica X -> Integrator. The Integrator verifies which of the programs that can work with TRANSLATICA are installed on the computer and then it allows the user to choose the ones that should be integrated. + +The Integrator displays the following dialogue box: + + +By checking appropriate check boxes, the user can choose applications he or she would like to integrate with TRANSLATICA. + +At any time, the user can turn on or turn off the translation functionality within any of the applications mentioned above. To do this, launch the Integrator application (Start-> Programs -> Translatica Enterprise/Office+ -> Integrator) and click on the applications of your choice. + + +#$ +Language Versions + +The default language version of the application is Polish, but you can choose English from the pull-down menu displayed in the Tools -> Application Language dialogue box of the Translation Editor + + +This dialogue box, apart from giving you the option to choose the language version of the application, allows you to choose the appropriate code page. For the Polish edition of Microsoft Windows the default code page is Window-1250. The remaining code pages may be useful in non-Polish versions of Microsoft Windows. + + +#$ K +Translating in Internet Explorer + +Having integrated TRANSLATICA with Internet Explorer (by means of the Integrator), four additional icons appear on the toolbar: + + +Clicking on initiates translation from Polish to English, whereas clicking on initiates translation from English to Polish. The third icon enables the user to save a translated page on the computer (NOTE: using Internet Explorer function: File > Save would save the page before translation). +Click the button to display the Settings window. The window allows for choosing the options of translation (see SettingsIDH_MENU_TRANSLATION_SETTINGS). +The translation process may take place both on-line (when the user is connected to the Internet) and off-line (when the user is disconnected from the Internet and the page is saved on the computer). In the translation mode, the screen is divided into two windows: the upper one contains the source of translation and the lower one contains the translated page. Every page that the user visits when following hyperlinks is translated. To quit the translation mode, toggle the translation button on the toolbar. Translation of a single page takes from a few seconds to over a minute (for complex pages). + + +#$ K K +Translating in Mozilla and Mozilla Firefox +When Mozilla is integrated with TRANSLATICA, the Mozilla toollbar contains three additional buttons: + +Translation process is identical to that in Internet Explorer (see +Translation in Internet ExplorerIDH_MS_INTERNET_EXPLORER). Mozilla allows for browsing a few documents by means of tabs (Ctrl-t opens a new tab). If Mozilla is integrated with TRANSLATICA, this feature makes it possible to browse a few pages together with their translations. +Mozilla is freely downloadable from: http://www.mozilla.org/start/1.7/*!EF(‘http://www.mozilla.org/start/1.7/’)) + +#$ K +Translating in Outlook Express +If Outlook Express is integrated with TRANSLATICA, it is possible to translate both the received and composed messages. When a message is opened, three buttons are added: + + () start translation into English or Polish respectively, opens the Settings window (see SettingsIDH_MENU_TRANSLATION_SETTINGS). +The translated text appears as a new message. + +#$ K K +Translating in Microsoft Excel and Microsoft Word + +With the integration of TRANSLATICA with MS Excel additional buttons appear in the toolbar and a Translatica option is added to the Tools menu. TRANSLATICA toolbar looks like this: + + + +The buttons are linked to the following actions: + + - change the direction of translation; + - Translate to a new document. This button creates a new document containing the translated text. If the user has not made any selection in the document the whole of it will be translated; + - Translate within the original document. This button replaces the selected fragment with the translation. If the user has not made any selection the whole document will be translated. + +In MS Excel, the user can also use the following options: clicking on one of the above two buttons while pressing Shift causes the translation of the current worksheet only; clicking on one of the above two buttons while pressing Ctrl initiates the translation of the current cell only. + - Export to Translation Editor; + - Import from Translation Editor; + +Clicking on the button Export to Translation Editor will launch the TRANSLATICA Dic and feed the selection (or the whole) of the document to its source window. After that, the document can be translated and post-edited in the target window (e.g. variant equivalents may be adjusted). To retrieve the translated text back in the source application, click Import button in the source application. + + Options The button opens the Settings window (SettingsIDH_MENU_TRANSLATION_SETTINGS). + +Translation in MS Word is analogous to the translation in MS Excel with the difference that the translation of individual worksheets or cells is not possible. + + +#$ K +Translating in Microsoft PowerPoint + +Translation in MS PowerPoint is analogous to the translation in MS Excel with the difference that in Microsoft PowerPoint the user can translate individual slides. To do this, select View -> Slide Sorter from the menu bar, choose slides you want to translate and press the translation button. It is worth noting that objects embedded in MS Office documents are also translated, e.g. Excel charts in PowerPoint documents. + + + +#$ K +Translating in Microsoft Outlook + +In MS Outlook two new buttons are added, each corresponding to one direction of translation. You can translate one or more letters (to translate a group of letters select them from the appropriate folder and press the Translate button). You can find the translated letters in the Translated folder. + + +#$ K K +Translating in Writer and Calc + +If TRANSLATICA is integrated with Writer or Calc, then the following icons appear at the Writer Toolbar: + - translate into English + - translate into Polish + - open the Settings window (see SettingsIDH_MENU_TRANSLATION_SETTINGS). +These actions are also available from Translatica menu in the main menu. + +The TRANSLATICA function integrated in the Calc program allows for translating only complete documents - in contrast to MS Excel where single cells or sheets may be selected for translation. + +#$ K +Translating in Translation Editor + +The Translation Editor is initiated after running TRANSLATICA (Start > Programs > TRANSLATICA ENTERPRISE/OFFICE+ > TRANSLATICA). + +#$K +Main Menu + +FileIDH_MENU_FILE The File menu enables performing actions on files. +EditIDH_MENU_EDIT Choose the Edit menu to edit files. +ViewIDH_MENU_VIEW Choose the View menu to define display parameters. +TranslateIDH_MENU_TRANSLATION Choose the Translate menu to translate the source text or to set the translation parameters. +ToolsIDH_MENU_TOOLS Choose the Tools menu to access additional program tools. +HelpIDH_MENU_HELP Choose the Help menu to obtain more information about the program. + + +#$K +File Menu + +Choose the File menu to open or save the content of the source/target window or to exit the program. + +NewIDH_MENU_FILE_NEW New +Open source textIDH_MENU_FILE_OPEN Open source +ReopenIDH_MENU_FILE_REOPEN Reopen +Save source textIDH_MENU_FILE_SAVE_SOURCE Save source +Save source text asIDH_MENU_FILE_SAVE_SOURCE_AS Save source as +Save target textIDH_MENU_FILE_SAVE_DESTINATION Save target +Save target text asIDH_MENU_FILE_SAVE_DESTINATION_AS Save target as +Save bothIDH_MENU_FILE_SAVE_BOTH Save both +Save allIDH_MENU_FILE_SAVE_ALL Save all +CloseIDH_MENU_FILE_CLOSE Close +Close allIDH_MENU_FILE_CLOSE_ALL Close all +ExitIDH_MENU_FILE_EXIT Exit + + +#$K +File|New + +Choose File|New to start a new translation. The content of the source window will be deleted. + +#$K +File|Open source text + +Choose File|Open source text to open the source language text. Open source text dialogue box allows the user to choose a source language file and feed its content into the source editing window. + +Open source text dialogue box + +Look in Lists the current directory. Use the drop down list to select a different drive or directory. + +Files Displays the files in the current directory that match the wildcards in File Name or the file type in Files Of Type. You can display a list of files or you can show details for each file. + +File name Enter the name of the file you want to load or type wildcards to use as filters in the Files list box. + +Files of Type Choose the type of file you want to open. + +Back Click this button to go back from the current directory to the last visited directory. + +Up one level Click this button to move up one directory level from the current directory. + +Create new folder Click this button to create a new subdirectory in the current directory. + +View menu Click this to change the way in which files are displayed. + + +#$K +File|Reopen + +Choose File|Reopen to open one of last opened source files. + +#$K +File|Save source text + +Choose File|Save source text to save changes in the source window text. If the file has not yet been saved, there will appear a new dialogue box Save asIDH_MENU_FILE_SAVE_SOURCE_AS, enabling the user to enter a filename. + + +#$K +File|Save source text as + +Choose File|Save source text as to save the source window content to a text file. Save source text asIDH_MENU_FILE_SAVE_SOURCE_AS dialogue box allows the user to enter or select the name of the file to which the content of the source window is saved. + +Save source text dialogue box + +Look in Lists the current directory. Use the drop down list to select a different drive or directory. + +Files Displays the files in the current directory that match the wildcards in File Name or the file type in Files Of Type. You can display a list of files or you can show details for each file. + +File name Enter the name of the file you want to load or type wildcards to use as filters in the Files list box. + +Files of Type Choose the type of file you want to open. + +Back Click this button to go back from the current directory to the last visited directory. + +Up one level Click this button to move up one directory level from the current directory. + +Create new folder Click this button to create a new subdirectory in the current directory. + +View menu Click this button to select the type of information to be displayed. + + +#$K +File|Save target text + +Choose File|Save target text to save the changes in the target window content. +If the file has not yet been saved, a new dialogue box will appear Save target text asIDH_MENU_FILE_SAVE_DESTINATION_AS, that enables to user to enter a filename. + +#$K +File|Save target text as + +Choose File|Save target text as to save the target window content to a text file. Save target text asIDH_MENU_FILE_SAVE_DESTINATION_AS dialogue box allows the user to enter or select the name of the file to which the content of the target window is saved. + +Save target text dialogue box + +Look in Lists the current directory. Use the drop down list to select a different drive or directory. + +Files Displays the files in the current directory that match the wildcards in File Name or the file type in Files Of Type. You can display a list of files or you can show details for each file. + +File name Enter the name of the file you want to load or type wildcards to use as filters in the Files list box. + +Files of Type Choose the type of file you want to open. + +Back Click this button to go back from the current directory to the last visited directory. + +Up one level Click this button to move up one directory level from the current directory. + +Create new folder Click this button to create a new subdirectory in the current directory. + +View menu Click this button to change the way in which files are displayed. + + +#$K +File|Save both +Choose File|Save both to save both the source and the target window contents to text files. If either of the files has not yet been saved, a dialogue box Save source textIDH_MENU_FILE_SAVE_SOURCE_AS or/and Save target textIDH_MENU_FILE_SAVE_DESTINATION_AS will appear, which enables the user to enter a filename for the source/target file. + + +#$K +File|Save all + +Choose File|Save all to save all tabs contents to text files. If either of the files has not yet been saved, a dialogue box Save source textIDH_MENU_FILE_SAVE_SOURCE_AS or/and Save target textIDH_MENU_FILE_SAVE_DESTINATION_AS will appear, which enables the user to enter a filename for the source/target file. + + +#$K +File|Close +Choose File|Close to close the current tab. + +#$K +File|Close all +Choose File|Close all to close all tabs. + +#$K +File|Exit + +Choose File|Exit to quit the translation editor. + +#$K +Edit Menu + +Choose the Edit menu to execute basic editing actions that allow copying, pasting and cutting of text selections. + +UndoIDH_MENU_EDIT_UNDO Undo +RedoIDH_MENU_EDIT_REDO Redo +CutIDH_MENU_EDIT_CUT Cut +CopyIDH_MENU_EDIT_COPY Copy +PasteIDH_MENU_EDIT_PASTE Paste +DeleteIDH_MENU_EDIT_DELETE Delete +Select allIDH_MENU_EDIT_SELECT_ALL Select all +FindIDH_MENU_EDIT_FIND Find +ReplaceIDH_MENU_EDIT_REPLACE Replace +Find nextIDH_MENU_EDIT_FIND_NEXT Find next + + +#$K +Edit|Undo + +Choose Edit|Undo to undo the last text editing operation performed in the source or target window. + + +#$K +Edit|Redo + +Choose Edit|Redo to redo the last text editing operation performed in the source or target window. + + +#$K +Edit|Cut + +Choose Edit|Cut to remove the selected text from the editing window and store it in the clipboard. + + +#$K +Edit|Copy + +Choose Edit|Copy to copy the selected text to the clipboard. + + + +#$K +Edit|Paste + +Choose Edit|Paste to paste the text from the clipboard at an insertion point in either of the text editing windows. + +#$K +Edit|Delete + +Choose Edit|Delete to delete the selected text. + +#$K +Edit|Select all + +Choose Edit|Select all to select the whole text in the active editing window. + + +#$K +Edit|Find +Choose Edit|Find to find text in the current window. + +Find dialogue box + +Text to find Type text to find. + +Options | Case +sensitive Check if matching is to be case-sensitive + +Direction | Forward/Backward Check the right options to process searching forward/backward current position of the cursor + + +#$K +Edit|Replace +Choose Edit|Find to replace one text with another. + +Replace dialogue box + +Text to find Type the text to be found and replaced. + +Replace with Type the text to replace the searched text. + +Options | Case +sensitive Check if matching is to be case-sensitive + +Direction | Forward/Backward Check the right options to process searching forward/backward current position of the cursor + +Skip Click the button if the text should be skipped + +Replace all Click the button if replace all occurrences of the text. + + +#$K +Edit|Find next +In order to find the text, choose Edit|Find next to find next occurrence of the text + + +#$K +View Menu + +Choose the View menu to modify the interface display options. + +Source word boundariesIDH_MENU_VIEW_SOURCE_TOKENS Toggle display of source word boundaries +Source unknown wordsIDH_MENU_VIEW_SOURCE_UNKNOWN Toggle underlining of source unknown words +Target word boundariesIDH_MENU_VIEW_TARGET_TOKENS Toggle display of target word boundaries +Target unknown wordsIDH_MENU_VIEW_TARGET_UNKNOWN Toggle underlining of target unknown words +Source editorIDH_MENU_VIEW _SOURCE Toggle display of source editing window +Target editorIDH_MENU_VIEW_DESTINATION Toggle display of target editing window +Horizontal layoutIDH_MENU_VIEW_HORIZONTAL Horizontal layout +Vertical layoutIDH_MENU_VIEW_VERTICAL Vertical layout +Tool barIDH_MENU_VIEW_TOOLBAR Toggle display of tool bar +Status barIDH_MENU_VIEW_STATUSBAR Toggle display of status bar +FontIDH_MENU_VIEW_FONT Font selection + +#$K +View|Source word boundaries + +Choose View|Source word boundaries to show/hide word boundaries in the source text window. The boundaries are highlighted by blue markers. Markers at sentence boundaries are highlighted by dots. + + +#$K +View|Target word boundaries + +Choose View|Target word boundaries to show/hide word boundaries in the target text window. The boundaries are highlighted by blue markers. Markers at sentence boundaries are highlighted by dots. + + +#$K +View|Source unknown words + +Select View|Source unknown words to mark words that have not been recognized in the source text analysis. Such words are underlined with a yellow line. During translation these words are transferred in their original form. + + +#$K +View| Target unknown words + +Select View|Target unknown words to mark words that have not been recognized in the target text analysis. Such words are underlined with a yellow line. + + +#$K +View|Horizontal layout + +Select View|Horizontal layout to set the horizontal layout of editing windows (one below the other). + + +#$K +View|Vertical layout + +Select View|Vertical layout to set the vertical layout of editing windows (one next to the other). The layout makes it easy to compare the source and target texts. + + +#$K +View|Source editor +Select View|Source editor to show/hide the window that contains the source text. If the user wants to hide the source window when the target window is also hidden, the target window will show (at least one window must be visible). + + +#$K +View|Target editor +Select View|Target editor to show/hide the window that contains the target text. If the user wants to hide the target window when the source window is also hidden, the source window will show (at least one window must be visible). + +#$K +View|Tool bar + +Select View|Tool bar to show/hide the tool bar (at the top of the application) + + +#$K +View|Status bar + +Select View|Status bar to show/hide the status bar (at the bottom of the application). +The status bar provides basic information about the edited text: the cursor position and the current context. + + +#$K +View|Font + +Select View|Font to change the type or the size of the font in the editing windows. + + +#$K +Translate Menu + +Choose the Translate menu to run the commands related to translation. + +TranslateIDH_MENU_TRANSLATION_TRANSLATE Translate +Polish-EnglishIDH_MENU_TRANSLATION_PLEN Polish-English +English-PolishIDH_MENU_TRANSLATION_ENPL English-Polish +SettingsIDH_MENU_TRANSLATION_SETTINGS Settings + +#$K +Translate|Translate + +Select Translate|Translate to translate the text. If a text fragment is selected in the source window, only the fragment is translated; otherwise the whole content of the window is translated. +The translated text is pasted into a target window. The previous content of the target window is removed. + +If a longer chunk of text is translated, the progress window is displayed during the process of translation. The translation can then be cancelled by pressing the Cancel button. + +The progress window contains the following information: +Sentences shows the number of translated sentences in a text; + +Words shows the number of processed words in the source text; + +Translated shows the number of translated words; + +Copied shows the number of words that have been copied untranslated from the source text to the target text; + +Close the window +when finished if this box is checked, the progress window will be automatically closed when the translation is finished. Otherwise the window should be closed by the user. + + +#$K +Translate|Polish-English + +Select Translate|Polish-English to set the direction of translation: from Polish into English. +If the direction has been changed while the text analysisIDH_MENU_TOOLS_ANALYSE is on, the source text will be re-analysed. + + +#$K +Translate|English-Polish + +Select Translate|English-Polish to set the direction of translation: from English into Polish. +If the direction has been changed while the text analysisIDH_MENU_TOOLS_ANALYSE is on, the source text will be re-analysed. + + +#$K +Translate|Settings + +Choose the command Translate settings from the menu in order to set the translation option. The options include: context, dictionaries and untranslated words. + + +Context tab + +Select Contex tab to set the context of translation. The context affects the choice of the translation equivalents. +Once the command has been selected, a window shows up that allows for choosing the context in the following categories: +• Domains – thematic contexts that correspond to domains of knowledge +• Styles – stylistic contexts +• Dialects – dialect variants of English + + +Dictionaries tab + +Choose Dictionaries to set what dictionaries should be used by the system: +• Company – company’s dictionary +• Domain – domain dictionaries +• System – system (general) dictionary + +Non-translated words tab + +Choose Non-translated Words to browse and edit lists of words that should not be translated. + +Remove button Click Remove button to remove the word from the list of non-translated words + +Check/Uncheck button Click the button to toggle the translation of the word + +Show local/global window Check if local/global window should be displayed while adding word to the non-translated words + + +#$K +Tools Menu + +Choose the Tools menu to use additional functions of TRANSLATICA. + +Analyse source textIDH_MENU_TOOLS_ANALYSE Analyse text +Spell checkingIDH_MENU_TOOLS_SPELLCHECKING Spell checking +Generate variantsIDH_MENU_TOOLS_VARIANTS Toggle display of variant equivalents +Generate syntax treesIDH_MENU_TOOLS_SYNTAX_TREE Generate syntax trees +DictionaryIDH_MENU_TOOLS_DICTIONARY Dictionary +SpeakIDH_MENU_TOOLS_SPEAK Speak text +ListenIDH_MENU_TOOLS_DICTATE Listen +Enterprise Data CompilerIDH_DATA_COMPILER Enterprise Data Compiler +PWN-Oxford DictionaryIDH_PWN_DICTIONARY PWN-Oxford Dictionary +Application languageIDH_MENU_TOOLS_APPLICATION_LANGUAGE Application language + + +#$K +Tools|Analyse source text + +Select Analyse source text to toggle the pre-processing of the text. +During analysis single words, translation units and sentences are recognized. Moreover, if the Spell checkingIDH_MENU_TOOLS_SPELLCHECKING option is on, the spelling correctness is verified. +If a longer chunk of text is being analysed, the progress window appears. The analysis process can then be cancelled by pressing the Cancel button. The progress dialogue box contains the following information: +Sentences shows the number of analysed sentences. + +Words shows the number of analysed words. + +Corrections shows the number of unknown words, to which lists of hints are available. + +Unknown shows the number of unknown words, to which lists of hints are not available. + +Close the window +when finished if this field is checked, the progress dialogue window will be automatically closed when the analysis has finished. Otherwise the window should be closed by the user. + + +#$K +Tools|Spell checking + +SelectTools|Spell checking to toggle spell checking. Words underlined in red are not included in the TRANSLATICA dictionary. Right-clicking on one of them displays the menu of dictionary words similar to the queried one. From these, the user can select a word to substitute the unrecognized word. Words underlined in yellow are not included in the TRANSLATICA dictionary and no dictionary hints are available for them (in the translation process they will be left untranslated). + + +#$K +Tools|Generate variants + +Select Tools|Generate variants to acquire the selection of alternative translations. Words that have alternative translations are underlined with a grey dotted line in the target window. + + +#$K +Tools|Generate syntax trees + +SelectTools|Generate syntax trees to translate a selected text or the whole text and see the syntax trees generated by the program. +After the translation has been completed, the syntax tree window is displayed. The window makes it possible to see the syntactical structures of sentences both in source and target languages. +The progress window is shown while translating long texts. + + +#$K +Tools|Dictionary + +SelectTools|Dictionary to run the dictionary viewer. + + +#$K +Tools|Speak +Choose Tools|Speak to generate speaking text in English + +#$K +Tools|Listen +Choose Tools|Listen to dictate to the system text in English. + + +#$K +Tools|Company Translation Compiler + +Choose Tools|Company Translation Compiler to run the compiler of Company Translation DatabaseIDH_CORP_DATA. The compiler builds an msi file. Run the msi file to install Company Translation DatabaseIDH_CORP_DATA for selected users or computers in the domain. + +The Company Translation Compiler window contains the fields: +Input file Enter the name of the Company Translation Database file. + +Output path Enter the output path for the msi file to be located in. + +Version Enter the version number of the new msi file. + +Compile button Click the button to run the compilation of the Company Translation Database. + +Build MSI button Click the button to build the msi file after the compilation. + +Messages The window displays information on the result of compilation and creation of the msi file. + +Warning: In order to create an MSI it is necessary to have the Net Framework installed on the server. The framework is delivered with the latest versions of MS Windows. If required, the installation file for the framework may be found at the microsoft.com*!EF(‘www.microsoft.com’). web page. + + +#$K +Tools|PWN-Oxford Dictionary + +Choose Tools|PWN-Oxford Dictionary to run the PWN-Oxford dictionary if it is installed on your computer. + + +#$K +Tools|Application language + +Select Tools|Application language to change the language of the application. + + +#$K +Help Menu + +Choose the Help menu to display program help or to display the information about Translatica. + +Translatica HelpIDH_MENU_HELP_TRANSLATICA_HELP Translatica Help +AboutIDH_MENU_HELP_ABOUT About + + +#$K +Help|Help + +Select Help|Help to run Translatica Help. + + +#$K +Help|About Command + +Select Help|About to display the information about TRANSLATICA. + + +#$ +Translation Memory and Company Dictionary + +Translation Memory stores a set of sentences that should be translated in a specific way – skipping the TRANSLATICA procedures. An exemplary application may be translation of forms where the names of the fields and some comments should be translated in the way required by the institution. Translation Memory may include practically unlimited number of sentences. If a text to be translated includes a sentences from the Translation Memory, the process of automatic translation for this sentence is suspended, and the translation taken from Translation Memory is taken instead. It should be noted though, that the system does not browse Translation Memory in search of sentences similar to the one given – it searches only for exact matches. +Company Dictionary includes words and multiword phrases, which should be translated in a uniform way within the company, when they appear in any inflected form. For example, if a bank wishes to have the phrase pożyczka długoterminowa translated as long-period loan (rather than long-term loan as suggested by TRANSLATICA), all occurrences of any inflected form of this phrase in any sentence will be translated in that way. + +To make it easier, sentences in Translation Memory and phrases in Company Dictionary are kept in one file, called Company Translation Database. +Company Translation Database consists of words, phrases and sentences in a source language together with their equivalents and the direction of translation. The file may be created in two formats: simple format, and XML format. + +Simple format assumes subsequent lines to consist of the following elements separated by tab +keys: +IsPhrase describes the entry as either a phrase which should be searched for in all inflected forms within the sentences (such an entry is the element of the Company Dictionary), or a sentence (the element of the Translation Memory). Possible values: + yes (or tak or 1) for a phrase + no (or nie or 1) for a sentence. + +Direction describes the direction of the translation for the entry. Possible values: + “>” – translation only from Polish into English + “<” – translation only from English into Polish + “<>” (or empty string) – translation in both directions + +Phrase1 text in Polish + +Phrase2 text in English + +Simple format can be easily obtained from an .xls file. If the elements of the entry description are given in consecutive columns, Simple is arrived at by using the Save as Text (separated by tab keys). + +An exemplary file in Simple format: + +no < Być, albo nie być – oto jest pytanie. To be, or not to be: that is the question. +no <> Drogi Kliencie. Dear customer. +yes > Biały Dom White House + +Company Traslation Database file in the XML format should be unified with the pattern included in the bin/win/enterprise_data.xsd file. + +An exemplary file in XML file: + + + + To be, or not to be: that is the question. + Być, albo nie być – oto jest pytanie. + + + Drogi Kliencie. + Dear customer. + + Biały Dom + White House + + + + +#$K +Batcher + +TRANSLATICA allows for the use of batch processing of a number of MS Office files. To do that use the Batcher program, opened from the Start menu: Start -> Translatica Enterprise/Office+ -> Batcher. + + + +The buttons have the following functions: +Add Opens a dialog window for the selection of one or more files to be translated. + +Remove Removes files from the list of files to be translated. + +Remove All Removes all files from the list of files to be translated. + +Options Opens a window for the translation settings for each file (see Settings).IDH_MENU_TRANSLATION_SETTINGS + + or Changes the direction of translation, the flag symbol stands for the target language. + +Translate Begins the translation process. + +Cancel Shuts down the program. + +A tree showing the list of files to be translated is displayed in the main window of the Batcher program. Each of the files is associated with a application that opens it. Three types of documents are allowed: MS Word, MS Excel, MS PowerPoint. If an application of the MS Office package is not installed or has not been integrated, it is indicated by the symbol next to the document. + +After new files have been added, each one is displayed with a or icon, which represent the source language of the file. + +Before the translation process is launched, a dialog window appears in which the user selects the destination folder for the translated files to be placed in. +After the translation process has been completed a symbol of the target language should appear next to each of the translated files. If a two-language symbol or has been displayed instead, it means that the translation of the file has failed. + +After the completion of the translation process, the location of each translated file is shown on the status bar. + + +#$K +Updater + +TRANSLATICA system is equipped with the Updater program for automatic updates via the Internet. To run the program, the menu Start command should be chosen: Start -> Translatica -> Updater. If the relevant update is available, the message box will appear. The user should confirm downloading the update: + + + +The buttons have the following functions: +Yes Start downloading and installing the update. + +No Ignore this version of the update. + +Options Show/hide the options of the update. + +Update automatically Automatically start the update when starting TRANSLATICA. + +Inform about updates Show the information about new updates and confirm installing them. + +Disable automatic update Updates should be started only by the user. + +Apply Apply the changes made in the options. + +# IDH_ABOUT_MT +$ A Few Words About Automatic Translation +# IDH_CHARACTERIZATION +$ Main Features of TRANSLATICA +# IDH_LOCAL_INSTALLATION +$ Local Installation +# IDH_NET_INSTALLATION +$ Installation in Local Net +# IDH_VERSIONS +$ Versions of TRANSLATICA +# IDH_INTEGRATOR +$ Integrator +K Integrator, program +# IDH_LANGUAGE_VERSIONS +$ Language Versions +# IDH_MS_INTERNET_EXPLORER +$ Translating in Microsoft Internet Explorer +K Integrator, Internet Explorer +# IDH_MOZILLA +$ Translating in Mozilla +K Integrator, Mozilla +K Integrator, Mozilla Firefox +# IDH_OUTLOOK_EXPRESS +$ Translating in Outlook Express +K Integrator, Outlook Express +# IDH_MS_WORD_AND_EXCEL +$ Translating in Microsoft Excel and in Microsoft Word +K Integrator, Microsoft Word +K Integrator, Microsoft Excel +# IDH_MS_POWERPOINT +$ Translating in Microsoft PowerPoint +K Integrator, Microsoft PwerPoint +# IDH_MS_OUTLOOK +$ Translating in Microsoft Outlook +K Integrator, Microsoft Outlook +# IDH_OO_WRITER +$ Translating in Writer +K Integrator, Writer +K Integrator, Calc +# IDH_EDITOR +$ Translating in Translation Editor +K Translation Editor +# IDH_MENU +$ Main Menu +K main menu +# IDH_MENU_FILE +$ File Menu +K File, menu +# IDH_MENU_FILE_NEW +$ File|New +K New, command +# IDH_MENU_FILE_OPEN +$ File|Open +K Open, command +# IDH_MENU_FILE_REOPEN +$ File|Reopen +K Reopen, command +# IDH_MENU_FILE_SAVE_SOURCE +$ File|Save source +K Save source, command +# IDH_MENU_FILE_SAVE_SOURCE_AS +$ File|Save source as +K Save source as, command +# IDH_MENU_FILE_SAVE_DESTINATION +$ File|Save target +K Save target, command +# IDH_MENU_FILE_SAVE_DESTINATION_AS +$ File|Save target as +K Save target as, command +# IDH_MENU_FILE_SAVE_BOTH +$ File|Save both +K Save both, command +# IDH_MENU_FILE_SAVE_ALL +$ File|Save all +K Save all, command +# IDH_MENU_FILE_CLOSE +$ File|Close +K Close, command +# IDH_MENU_FILE_CLOSE_ALL +$ File|Close all +K Close all, command +# IDH_MENU_FILE_EXIT +$ File|Exit +K Exit, command +# IDH_MENU_EDIT +$ Edit Menu +K Edit, menu +# IDH_MENU_EDIT_UNDO +$ Edit|Undo +K Undo, command +# IDH_MENU_EDIT_REDO +$ Edit|Redo +K Redo, command +# IDH_MENU_EDIT_CUT +$ Edit|Cut +K Cut, command +# IDH_MENU_EDIT_COPY +$ Edit|Copy +K Copy, command +# IDH_MENU_EDIT_PASTE +$ Edit|Paste +K Paste, command +# IDH_MENU_EDIT_DELETE +$ Edit|Delete +K Delete, command +# IDH_MENU_EDIT_SELECT_ALL +$ Edit|Select all +K Select all, command +# IDH_MENU_EDIT_FIND +$ Edit|Find +K Find, command +# IDH_MENU_EDIT_REPLACE +$ Edit|Replace +K Replace, command +# IDH_MENU_EDIT_FIND_NEXT +$ Edit|Find next +K Find next, command +# IDH_MENU_VIEW +$ View Menu +K View, menu +# IDH_MENU_VIEW_SOURCE_TOKENS +$ View|Source word boundaries +K Source word boundaries, command +# IDH_MENU_VIEW_TARGET_TOKENS +$ View|Target word boundaries +K Target word boundaries, command +# IDH_MENU_VIEW_SOURCE_UNKNOWN +$ View|Source unknown words +K Source unknown words, command +# IDH_MENU_VIEW_TARGET_UNKNOWN +$ View|Target unknown words +K Target unknown words, command +# IDH_MENU_VIEW_HORIZONTAL +$ View|Horizontal layout command +K Horizontal layout, command +# IDH_MENU_VIEW_VERTICAL +$ View|Vertical layout command +K Vertical layout, command +# IDH_MENU_VIEW_SOURCE +$ View|Source editor command +K Source editor, command +# IDH_MENU_VIEW_DESTINATION +$ View|Target editor command +K Target editor, command +# IDH_MENU_VIEW_TOOLBAR +$ View|Tool bar command +K Tool bar, command +# IDH_MENU_VIEW_STATUSBAR +$ Status bar command +K Status bar, command +# IDH_MENU_VIEW_FONT +$ View|Font command +K Font, command +# IDH_MENU_TRANSLATION +$ Translate menu +K Translate, menu +# IDH_MENU_TRANSLATION_TRANSLATE +$ Translate|Translate command +K Translate, command +# IDH_MENU_TRANSLATION_PLEN +$ Translate|Polish-English command +K Polish-English, command +# IDH_MENU_TRANSLATION_ENPL +$ Translate|English-Polish command +K English-Polish, command +# IDH_MENU_TRANSLATION_SETTINGS +$ Translate|Settings +K Settings, command +# IDH_MENU_TOOLS +$ Tools menu +K Tools, menu +# IDH_MENU_TOOLS_ANALYSE +$ Tools|Analyse text command +K Analyse text, command +# IDH_MENU_TOOLS_SPELLCHECKING +$ Options|Spell checking command +K Spell checking, command +# IDH_MENU_TOOLS_VARIANTS +$ Tools|Generate variants command +K Generate variants, command +# IDH_MENU_TOOLS_SYNTAX_TREE +$ Tools|Generate syntax trees command +K Generate syntax trees, command +# IDH_MENU_TOOLS_DICTIONARY +$ Tools|Dictionary command +K Dictionary, command +# IDH_MENU_TOOLS_SPEAK +$ Tools|Speak +K Speak, command +# IDH_MENU_TOOLS_DICTATE +$ Tools|Listen +K Listen, command +# IDH_DATA_COMPILER +$ Tools|Enterprise Data Compiler command +K Enterprise Data Compiler, command +# IDH_PWN_DICTIONARY +$ Tools|PWN-Oxford Dictionary command +K PWN-Oxford Dictionary, command +# IDH_MENU_TOOLS_APPLICATION_LANGUAGE +$ Tools|Application language command +K Application language, command +# IDH_MENU_HELP +$ Help menu +K Help, menu +# IDH_MENU_HELP_TRANSLATICA_HELP +$ Help|Help command +KTranslatica help, command +# IDH_MENU_HELP_ABOUT +$ Help|About command +K About, command +# IDH_CORP_DATA +$ Translation Memory and Company Dictionary +# IDH_BATCHER +$ Batcher +K Batch Processing +# IDH_UPDATER +$ Updater +K Automatic update +?? + +?? + +?? + +?? + diff --git a/examples/txt/.svn/text-base/help-pl.txt.svn-base b/examples/txt/.svn/text-base/help-pl.txt.svn-base new file mode 100755 index 0000000..19448ec --- /dev/null +++ b/examples/txt/.svn/text-base/help-pl.txt.svn-base @@ -0,0 +1,1227 @@ +#$ +Kilka słów o tłumaczeniu automatycznym + +Idea tłumaczenia tekstów z jednego języka na drugi przy pomocy komputera jest prawie tak samo stara jak idea samego komputera. Już w czasach zimnej wojny wywiadowcy aliantów oczekiwali, że komputer zastąpi wykwalifikowanych szpiegów w tłumaczeniu tajnych rosyjskich tekstów na język angielski, oszczędzając zapracowanym agentom wiele czasu i zachodu. Minęło wiele lat, a wizja międzynarodowej konferencji czy rozmowy bez udziału ludzkiego tłumaczenia mieści się wciąż w sferze marzeń. + +Z czasem językoznawcy, filologowie i informatycy zweryfikowali swoje oczekiwania w stosunku do automatycznego komputerowego tłumacza i postarali się zmienić nastawienie użytkowników. Obie strony doszły zgodnie do wniosku, że komputer nie przetłumaczy Szekspira, Joyce’a, czy Whartona; ba! nie przetłumaczy dobrze nawet krótkiego dowcipu. Tłumaczenie komputerowe nie ma zupełnie zastosowania przy przekładach literackich, świetnie sprawdza się natomiast do tłumaczenia tekstów fachowych z określonej, najlepiej +jak najwęższej dziedziny. + +W tekstach ogólnych komputer może pomóc człowiekowi jedynie w zorientowaniu się w tematyce tekstu lub wykonać za niego „czarną robotę”, polegającą na odnalezieniu najwłaściwszych odpowiedników w danych kontekstach i ułożenie ich w najbardziej prawdopodobne konstrukcje językowe; ale to profesjonalnemu tłumaczowi pozostaje wygładzenie językowe przetłumaczonego tekstu. + + +Tłumaczenie bezpośrednie + +Zastępowanie wyrazów języka źródłowego odpowiednimi wyrazami języka docelowego to najprostszy sposób dokonania tłumaczenia. Pomimo tego, że już w latach 60-tych wyciągnięto wniosek, że metoda ta daje nieakceptowalne wyniki, do dzisiaj rozwijane są systemy automatycznego tłumaczenia, w których jest ona stosowana. + + +Tłumaczenie metodą transferu + +Najbardziej powszechną metodą w działających obecnie systemach tłumaczenia automatycznego jest metoda transferu. W jej skład wchodzą następujące części: +• słownik, +• reprezentacja tekstu, +• gramatyka, +• analiza składniowa. + + +Słownik + +Słownik jest najbardziej pracochłonną częścią systemu tłumaczenia automatycznego metodą transferu. Opis danych w słowniku musi spełniać następujące kryteria: +• opis musi być czytelny dla komputera, czyli na tyle uporządkowany, aby przy pomocy określonego algorytmu można było odczytać niezbędne informacje, +• słownik powinien zawierać możliwie największą liczbę haseł, +• hasła w słowniku powinny być opisane możliwie jak najdokładniej. +Spełnienie powyższych trzech warunków równocześnie nie jest łatwe, a utworzenie “dobrego” słownika jest pracochłonne – dlatego też systemy tłumaczenia nierzadko opierają się na ograniczonym słownictwie. + + +Reprezentacja tekstu + +Istotnym etapem tłumaczenia jest przedstawienie analizowanego fragmentu tekstu – najczęściej zdania – w pewnej postaci, którą można następnie przenieść na reprezentację zdania docelowego. Dwa najbardziej popularne sposoby reprezentowania zdania to struktura frazowa i drzewo zależności. +Struktura frazowa jest najbardziej tradycyjnym sposobem przestawiania budowy zdania. Strukturę frazową zdania Zły wilk goni słabą owieczkę można przedstawić następująco: + + +Powyższe drzewo reprezentuje budowę zdania rozumianą następująco: Zdanie składa się z frazy rzeczownikowej i frazy czasownikowej. Pierwsza z tych fraz składa się z przymiotnika zły i rzeczownika wilk, natomiast druga składa się z czasownika goni i podstruktury: frazy rzeczownikowej. Podstruktura frazy rzeczownikowej realizowana jest przez przymiotnik słabą i rzeczownik owieczkę. +W reprezentacji przy użyciu drzewa zależności zakłada się, że w zdaniu każdy wyraz – za wyjątkiem najważniejszego, tj. czasownika głównego orzeczenia – jest zależny od innego wyrazu. Drzewo zależności obrazuje zestaw tych zależności. Reprezentacja przykładowego zdania w postaci drzewa zależności pokazuje następujący rysunek: + + + +Od czasownika goni zależne są: podmiot czynności, tj. pies oraz obiekt czynności, tj. mysz. Od rzeczowników zależne są określające je przymiotniki: duży od rzeczownika pies i wściekłą od rzeczownika mysz. + +Ustalenie zestawu zależności nie zawsze jest rzeczą oczywistą – wyrazy zależne od siebie nie muszą ze sobą sąsiadować. Na przykład drzewo zależności zdania Biedną goni wilk zły owieczkę będzie identyczne z drzewem z rys. 3. Zależność pomiędzy przymiotnikiem słabą i rzeczownikiem owieczkę zostanie ustalona na wskutek zgodności przypadku, rodzaju oraz liczby obu wyrazów. + + +Gramatyka + +Ustaliwszy sposób reprezentacji tekstu w systemie tłumaczenia należy wypracować metodę wyznaczania takiej reprezentacji. Najczęściej zadanie to dzielone jest na dwa zagadnienia: opis gramatyki i analizę składniową tekstu. + +Gramatyka rozumiana jest jako zestaw reguł, które określają w jaki sposób można tworzyć poprawne konstrukcje językowe. W opisie gramatyki można zawrzeć oprócz reguł tworzenia także informacje o budowie zdań konstruowanych na bazie gramatyki. + +Gramatyka jest próbą matematycznego opisu zjawisk lingwistycznych, które łatwo nie poddają się matematycznemu sformalizowaniu. Dotychczas nie udało się stworzyć formalnego opisu żadnego języka mówionego, który by obejmował wszystkie możliwe konstrukcje. Innymi słowy, obojętnie jak bardzo skomplikowany byłby opis gramatyki, człowiekowi i tak uda się stworzyć zdanie, wychodzące poza taki opis. + + +Analiza składniowa + +Proces sprawdzania, czy wybrany fragment tekstu (np. zdanie) zgodny jest z opisem gramatyki nazywany jest analizą składniową. Wynikiem analizy jest stwierdzenie, czy dane zdanie zgodne jest z opisem gramatyki (takie zdanie uznawane jest jako poprawne) oraz podanie budowy zdania w wybranej reprezentacji (np. w postaci struktury składniowej czy drzewa zależności). Dla celów tłumaczenia automatycznego istotne jest to, by analiza składniowa podawała jakąś reprezentację również dla zdań, które nie są zgodne z opisem gramatyki. + + +#$ +Charakterystyka systemu TRANSLATICA + +Historia rozwoju + +System TRANSLATICA rozwijany był w latach 1996 - 2002 jako system POLENG, tłumaczący wyłącznie w kierunku polsko-angielskim, na Wydziale Matematyki i Informatyki Uniwersytetu im. Adama Mickiewicza w Poznaniu, między innymi dzięki przychylności ze strony Komitetu Badań Naukowych (w latach 1999-2000), Polskiego Towarzystwa Fonetycznego (w latach 1996-2001) oraz Allied Irish Bank (2002). + +W roku 2004 powstały pierwsze wersje systemu TRANSLATICA (TRANSLATICA STANDARD i TRANSLATICA PRO), w których w oparciu o wytworzone techniki tłumaczenia oraz słownictwo zaczerpnięte z Wielkiego Słownika Angielsko-Polskiego PWN dodano funkcję tłumaczenia w kierunku angielsko-polskim. + +TRANSLATICA PREMIUM i TRANSLATICA OFFICE zostały wydane w roku 2005. W stosunku do swoich poprzedników znacznie poszerzono słownictwo systemu – na wielkich słownikach PWN opiera się teraz tłumaczenie w obu kierunkach. Wprowadzono dziesiątki tysięcy nowych idiomów. Poszerzono i poprawiono zestaw reguł tłumaczenia, zastosowano nowe techniki analizy tekstu (np. statystyczne metody oznaczania części mowy dla tekstu angielskiego). Działania te owocują wyraźną poprawą jakości tłumaczenia. Wiele uwagi poświęcono polepszeniu szybkości działania, np. słownik systemu (pomimo znacznie zwiększonej objętości) jest obecnie wczytywany mniej więcej trzy razy szybciej. + +Dodano możliwość integracji z nowymi programami: Outlook Express, Mozilla, Writer. Tak szerokich możliwości współpracy z aplikacjami zewnętrznymi nie umożliwia żaden system translacji na świecie. + + +Słownik systemu TRANSLATICA + +Jak wspomniano, słownik systemu tłumaczenia automatycznego musi spełniać kryterium czytelności dla algorytmu komputerowego. Opracowanie haseł w takim słowniku jest pracochłonne, dlatego niezbędne jest odpowiednie ich wyselekcjonowanie. Podczas prac nad kierunkiem z polskiego na angielski zebrano zbiór tekstów komputerowych, prawniczych, ekonomicznych i internetowych (taki wyselekcjonowany zbiór nazywany jest korpusem) i wyznaczono hasła najczęściej się w nim pojawiające. Hasła te zostały następnie opisane zgodnie z formalizmem systemu tłumaczenia i włączone do słownika systemu. + +Źródłem słownictwa w kierunku angielsko-polskim jest Wielki Słownik Angielsko-Polski PWN – w skrócie WSAP (w kolejnych wersjach systemu planowane jest włączenie tworzonego obecnie słownika PWN w odwrotnym kierunku). Słownik WSAP został również wykorzystany (poprzez odwrócenie) do częściowego uzupełnienia haseł w polsko-angielskim słowniku systemu. Efekt tych działań jest taki, że opis haseł w kierunku angielsko-polskim jest bardziej dokładny (jedno hasło ma zazwyczaj więcej odpowiedników). Okazuje się, że większa dokładność jakość słownika nie przekłada się automatycznie na lepszą jakość tłumaczenia. Autorzy oceniają, że w obecnej wersji systemu lepsze jakościowo jest tłumaczenie w kierunku polsko-angielskim. + + +Gramatyka, reprezentacja i analiza składniowa + +Autorzy stworzyli własny formalizm opis reguł gramatyki oraz reguł transferu (czyli przeniesienia reprezentacji jednego języka do innego). Ten sam formalizm stosowany jest do obu kierunków tłumaczenia, ale same reguły nie są swoim lustrzanym odbiciem. Innymi słowy, proces tłumaczenia nie jest odwracalny: przetłumaczenie tekstu w jednym kierunku i z powrotem najczęściej skutkuje innym tekstem niż wyjściowy (idea odwracalności tłumaczenia jest kusząca, ale ze względu na różnice między budową języków nie udało jej się dotychczas zastosować dla żadnej, nawet najbliższej, pary języków). + +W systemie TRANSLATICA tekst przetwarzany jest do postaci struktury frazowej. Analiza składniowa dopuszcza istnienie konstrukcji niezgodnych z opisem gramatyki (także tych, które są całkowicie niepoprawne językowo) i dla każdej konstrukcji tworzona (a następnie transferowana) jest jakaś reprezentacja tekstu. + + +Niektóre ciekawe zagadnienia tłumaczenia + +Języki polski i angielski należą do różnych rodzin języków (odpowiednio do słowiańskiej i germańskiej) i dlatego konstrukcje nawet prostych zdań mogą się od siebie znacznie różnić. + + +Różnice w składni + +W języku polskim dopuszczana jest znacznie większa swoboda kolejności składników (np. orzeczenie często poprzedza podmiot), w języku angielskim składnia zdania podlega znacznie większym ograniczeniom. Zdarza się i tak, że podmiot w zdaniu polskim pełni funkcję dopełnienia w odpowiadającym zdaniu angielskim i na odwrót. Ponadto w języku polskim funkcjonuje pojęcie podmiotu domyślnego - nieobecne z zasady w języku angielskim. Przyjrzyjmy się przykładom zdań, które obrazują wspomniane problemy. + +Ty mi się wcale nie podobasz. +Ty nie podobasz się mi wcale. +Ty wcale nie podobasz się mi. +Ty wcale mi się nie podobasz. +Wcale mi się nie podobasz. +Mi się wcale nie podobasz. +Mi się nie podobasz wcale. +Nie podobasz się mi wcale. + +Wszystkim tym zdaniom odpowiada w języku angielskim to samo zdanie: + +I don't like you at all. + +Właśnie w ten jednakowy sposób powyższe różne zdania polskie są tłumaczone na język angielski w systemie TRANSLATICA. + + +Różnice w znaczeniu wyrazów + +Ten sam wyraz w języku polskim może mieć wiele odpowiedników w języku angielskim i na odwrót. Zadaniem sytemu tłumaczenia jest wyszukanie najlepszego odpowiednika w danym kontekście, w danym zdaniu. Na przykład w słowniku systemu POLENG czasownik take ma 41 różnych odpowiedników a może mieć jeszcze inne znaczenia w połączeniu ze specyficznymi przyimkami (np. take in - nabrać kogoś), czy też rzeczownikami (np. take part – wziąć udział). Algorytm tłumaczenia systemu TRANSLATICA stara się dopasować najlepszy odpowiednik dzięki analizie struktury zdania i kontekstu tłumaczenia, jak na przykład w poniższych zdaniach: + +I took a shower. +Wziąłem prysznic. + +We shall take a taxi. +Weźmiemy taksówkę. + +We shall take a bus. +Pojedziemy autobusem. + +My horse took a fence. +Mój koń przeskoczył ogrodzenie. + +He has never taken a bribe. +Nigdy nie przyjął łapówki. + +Such a jump takes courage. +Taki skok wymaga odwagi. + +I am going to take tea. +Zamierzam wypić herbatę. + +Tomorrow I will be taking a difficult exam. +Jutro będę zdawać trudny egzamin. + +Take a seat. +Usiądź. + +Will you take part in the meeting? +Weźmiesz udział w spotkaniu? + + + +#$ +Instalacja lokalna + +W celu zainstalowania programu TRANSLATICA należy uruchomić program Setup.exe. Program instalacyjny kopiuje pliki do komputera użytkownika, a następnie wywołuje program Integrator. Zadaniem Integratora jest połączenie systemu TRANSLATICA z wybranymi przez użytkownika aplikacjami (patrz rozdział Integrator). System można odinstalować z menu Start: Start->Programy->Translatica X ->Uninstall. + + +#$ +Instalacja przez sieć + +W przypadku sieci lokalnych zarządzanych przez systemy Microsoft Windows z dostępnymi usługami Active Directory, DNS, DHCP możliwe jest również uruchomienie programu instalacyjnego w taki sposób, aby program TRANSLATICA został zainstalowany na wybranych końcówkach lub dla wybranych użytkowników. Aby móc zastosować instalację sieciową, usługi Active Directory, DNS, DHCP powinny być poprawnie skonfigurowane. + +Na dowolnej partycji (nie będącej partycją systemową ani rozruchową) należy założyć folder (np. Msi_Pack), do którego kopiujemy plik instalacyjny Translatica-Enterprise.msi. Następnie folder ten udostępniamy w sieci. + + + + + +Z menu Start wybieramy opcję Programy -> Narzędzia administracyjne -> Użytkownicy i komputery usługi Active Directory. Z menu podręcznego interesującej nas domeny wybieramy opcję Nowy -> Jednostka organizacyjna. + + + +Do utworzonej jednostki organizacyjnej dodajemy istniejących użytkowników i/lub komputery. + + + +Następnie ustalamy właściwości jednostki organizacyjnej. W tym celu z menu podręcznego wybieramy opcję Właściwości. W zakładce Zasady grupy dodajemy nową zasadę grupy, po czym ją edytujemy. Po ukazaniu się okna Edytora obiektów zasad grupy dokonujemy konfiguracji użytkownika lub komputera w zależności od rodzaju instalacji, jaką chcemy przeprowadzić. + + +Instalacja przez sieć dla użytkownika + +Celem takiej instalacji jest umożliwienie korzystania z programu TRANSLATICA wybranemu użytkownikowi na dowolnym komputerze domeny. +Aby zainstalować program dla użytkownika, należy kliknąć ikonę Konfiguracja użytkownika a następnie Ustawienia oprogramowania. + + + +Klikamy prawym przyciskiem myszy na folderze Instalacja oprogramowania i wybieramy z menu opcję Nowy -> Pakiet, a następnie wskazujemy plik msi, który umieściliśmy w udostępnionym folderze instalacyjnym. Po wyświetleniu okna Rozmieszczenie oprogramowania wybieramy sposób instalacji. Jeżeli chcemy, aby instalacja przebiegła automatycznie bezpośrednio po zalogowaniu się użytkownika, wybieramy metodę Przypisany. Jeśli natomiast instalację chcemy pozostawić użytkownikowi, wybieramy metodę Opublikowany. Wtedy użytkownik będzie mógł uruchomić pakiet instalacyjny na komputerze klienckim poprzez Panel sterowania -> Dodaj/Usuń programy -> Dodaj nowe programy. + + + +Aby zmienić metodę rozmieszczania, należy kliknąć prawym przyciskiem myszy na ikonie pakietu instalacyjnego i wybrać opcję Właściwości. W zakładce Rozmieszczanie zaznaczamy odpowiednią metodę. + + +Instalacja przez sieć na wybranym komputerze + +Celem takiej instalacji jest umożliwienie korzystania z programu Translatica dowolnemu użytkownikowi na wybranym komputerze. + +Aby zainstalować program na wybranym komputerze, należy kliknąć ikonę Konfiguracja komputera a następnie Ustawienia oprogramowania. +Klikamy prawym przyciskiem myszy na folderze Instalacja oprogramowania i wybieramy z menu opcję Nowy -> Pakiet, a następnie wskazujemy plik msi, który umieściliśmy w udostępnionym folderze instalacyjnym. W tym przypadku instalacja programu na komputerze zostanie przeprowadzona bezpośrednio po restarcie bądź uruchomieniu komputera. + +Uwaga: Szczegóły kolejnych kroków instalacji przez sieć mogą się różnić w zależności od systemu operacyjnego. + +#$ +Wersje programu + +System tłumaczący TRANSLATICA jest dostępny w dwóch wersjach podstawowych: Premium i Office, oraz dwóch wersjach dedykowanych dla firm: Office+ i Enterprise. + +Wersja Premium przeznaczona jest do szybkiego przetwarzania dokumentów prostych językowo, lecz o złożonym formacie – właśnie takich jak strony internetowe czy dokumenty (maile) klienta pocztowego Outlook Express. + +Wersje Office, Office+ i Enterprise rozszerzają te możliwości o funkcje tłumaczenia dokumentów z programów pakietu MS Office: MS Word, MS Excel, MS PowerPoint i MS Outlook oraz programów Writer i Calc (dwie ostatnie aplikacja należą do pakietu Open Office). + +Wersje Office+ i Enterprise dają ponadto możliwość tłumaczenia wielu dokumentów w trybie wsadowym. Wersja Enterprise jest dodatkowo wyposażona w funkcje pomagające dostosować system do potrzeb konkretnej firmy. Do funkcji tych należą: możliwość korzystania ze słowników dziedzinowych, budowanie i stosowanie pamięci tłumaczeń oraz korzystanie ze słownika firmy. + +#$ +Integrator + +Program Integrator uruchamia się z menu Start: Start -> Programy -> Translatica X -> Integrator. Aplikacja sprawdza, które z programów umożliwiających integrację z systemem TRANSLATICA są zainstalowane na komputerze, a następnie pozwala użytkownikowi dodać funkcję tłumaczenia do wybranych programów. + +Uruchomienie Integratora powoduje ukazanie się następującego okna: + + + +Dla programów niezainstalowanych na komputerze odpowiednia kratka jest nieaktywna (przyciemniona). +Użytkownik ma możliwość wybrania jednej lub kilku aplikacji poprzez zaznaczenie odpowiednich kratek. + +W każdym momencie użytkownik może odłączyć lub ponownie dołączyć funkcję tłumaczenia do wybranych programów. W tym celu należy uruchomić program Integrator (Start -> Programy -> Translatica X -> Integrator) i odpowiednio odznaczyć lub zaznaczyć wybrane aplikacje. + + +#$ +Wersje językowe + +Program uruchamiany jest domyślnie w polskiej wersji językowej, ale możliwa jest zmiana języka obsługi na język angielski. W tym celu należy w oknie Edytora Translacji z menu Narzędzia wybrać polecenie Język programu. Pojawi się wówczas okno dialogowe Wybór języka programu. + + + +Okno to oprócz wyboru języka umożliwia wybór strony kodowej dla języka polskiego. Dla systemu Microsoft Windows w wersji polskiej domyślnie ustawiona jest strona kodowa Windows-1250. Pozostałe strony kodowe mogą być użyteczne w niepolskojęzycznych wersjach systemu Microsoft Windows. + +#$ +Tłumaczenie w programie Microsoft Internet Explorer + +Po włączeniu funkcji tłumaczenia do programu Internet Explorer (przy pomocy INTEGRATORaIDH_INTEGRATOR) na pasku zadań programu Internet Explorer pojawiają się cztery dodatkowe ikony: + + +Naciśnięcie ikony rozpoczyna proces tłumaczenia z języka polskiego na język angielski, a naciśnięcie ikony rozpoczyna tłumaczenie w odwrotnym kierunku. Trzecia ikona umożliwia zapis przetłumaczonej strony na komputerze (wykonanie zapisu przy pomocy funkcji programu Internet Explorer: Plik -> Zapisz spowodowałoby zapis strony przed tłumaczeniem). + +Przycisk służy do uruchomienia okna Ustawienia, za pomocą którego można dokonać wyboru kontekstów i słowników używanych przez system (patrz UstawieniaIDH_MENU_TRANSLATION_SETTINGS). + +Tłumaczenie może odbywać się zarówno on-line (gdy użytkownik połączony jest z Internetem) jak i off-line (gdy połączenia nie ma, a przeznaczona do tłumaczenia strona internetowa zapisana jest w komputerze). Podczas tłumaczenia ekran podzielony zostaje na dwa okna: górne dla strony tłumaczonej (w języku źródłowym) i dolne dla strony przetłumaczonej. W trybie translacji automatycznie tłumaczone są wszystkie strony, do których użytkownik przemieszcza się przy pomocy odsyłaczy (hiperlinków). Aby wyjść z trybu translacji należy ponownie kliknąć wciśniętą ikonę tłumaczenia. Tłumaczenie jednej strony trwa od kilkunastu sekund do ponad minuty (dla złożonych stron). + + +#$ +Tłumaczenie w programie Mozilla + +Po włączeniu funkcji tłumaczenia do programu Mozilla (przy pomocy INTEGRATORaIDH_INTEGRATOR) na pasku zadań programu Mozilla pojawiają się trzy dodatkowe przyciski: + + +W programie Mozilla nie ma potrzeby dołączania przycisku zapisu, gdyż zapis przetłumaczonej strony możliwy jest z menu programu Mozilla. + +Proces tłumaczenia odbywa się jak w przypadku programu Internet Explorer (patrz Tłumaczenie w programie Internet ExplorerIDH_MS_INTERNET_EXPLORER). + +Można podać przynajmniej dwa argumenty za korzystaniem z programu Mozilla (można go ściągnąć bezpłatnie ze strony (http://www.mozilla.org/start/1.7/*!EF(‘http://www.mozilla.org/start/1.7/’)) nawet w przypadku posiadania programu Internet Explorer. Po pierwsze, program ten jest znacznie bardziej bezpieczny, jeśli chodzi o możliwość ataku z Internetu na nasz komputer, po drugie umożliwia przeglądanie kilku dokumentów jednocześnie przy pomocy zakładek. W połączeniu z systemem TRANSLATICA daje to możliwość jednoczesnego przeglądania kilku przetłumaczonych stron. + +Otwarcie nowej zakładki w programie Mozilla dokonuje się poprzez wciśnięcie kombinacji klawiszy Ctrl-t. W otwartej zakładce można otworzyć nową stronę i przetłumaczyć ją (poprzez wciśnięcie przycisku translacji). Przetłumaczona strona jest pamiętana nawet po przejściu do innej zakładki. Powrót do zakładki z przetłumaczoną stroną umożliwia przeglądanie obu okien: z tekstem źródłowym i docelowym. + + +#$ +Tłumaczenie w programie Outlook Express + +Po zintegrowaniu TRANSLATICA z Outlook Express, możliwe jest korzystanie z systemu tłumaczenia w trybie edycji lub odczytu poszczególnych wiadomości. Po otwarciu wybranej (lub nowej) wiadomości, na pasku narzędzi pojawiają się trzy dodatkowe przyciski: + +Naciśnięcie przycisków lub powoduje rozpoczęcie procesu tłumaczenia odpowiednio z języka polskiego na język angielski lub języka angielskiego na język polski. Przycisk służy do wyboru kontekstów i słowników systemu tłumaczenia (patrz UstawieniaIDH_MENU_TRANSLATION_SETTINGS). +Przetłumaczony tekst wiadomości pojawia się w osobnym oknie jako nowa wiadomość, przy czym tłumaczeniu podlegają zarówno treść jak i tytuł wiadomości. + + +#$ +Tłumaczenie w programie Microsoft Word i Microsoft Excel + +Włączenie funkcji tłumaczenia do programu MS-Excel powoduje dodanie dodatkowego paska narzędzi (umieszczony on jest w górnym obszarze ekranu) oraz dodatkowej opcji w Menu Narzędzia. +Pasek narzędzi systemu TRANSLATICA ma następujący wygląd: + +Pierwsza ikona umożliwia zmianę kierunku tłumaczenia. Kolejne przyciski mają następujące znaczenie: +Przycisk Tłumacz do nowego powoduje otwarcie nowego dokumentu i umieszczenie w nim przetłumaczonego tekstu. Jeśli nie zaznaczono fragmentu, naciśnięcie przycisku powoduje tłumaczenie całego dokumentu. +Przycisk Tłumacz w oryginale powoduje zamianę zaznaczonego uprzednio fragmentu przetłumaczonym tekstem. Jeśli nie zaznaczono fragmentu, naciśnięcie przycisku powoduje tłumaczenie całego dokumentu. +W programie MS-Excel dodano do powyższych dwóch przycisków dodatkowe funkcje: równoczesne wciśnięcie klawisz Shift powoduje tłumaczenie tylko bieżącego arkusza (a nie całego skoroszytu), zaś wciśnięcie klawisz Ctrl powoduje tłumaczenie tylko bieżącej komórki. + +Przyciski Eksportuj do Edytora Translacji i Importuj z Edytora Translacji umożliwiają współpracę aplikacji MS-Office z edytorem programu TRANSLATICA. Kliknięcie przycisku Eksportuj powoduje wysłanie zaznaczonego fragmentu (lub całego dokumentu) do Edytora Translacji. Uruchomiony zostaje program-edytor systemu TRANSLATICA, a wyeksportowany tekst umieszczany zostaje w oknie tekstu źródłowego. Użytkownik może przetłumaczyć tekst, a po przetłumaczeniu dokonać post-edycji w oknie tekst docelowego (np. poprzez wybranie wariantów tłumaczenia). Aby przetłumaczony tekst powrócił do aplikacji wysyłającej trzeba kliknąć przycisk Importuj w aplikacji MS-Excel. Wyeksportowany uprzednio tekst zostanie podmieniony przetłumaczonym tekstem z Edytora Translacji. + + Opcje. Naciśnięcie przycisku powoduje wyświetlenie okna wyboru kontekstów i słowników używanych przez system (UstawieniaIDH_MENU_TRANSLATION_SETTINGS). + +Obsługa funkcji tłumaczenia w programie MS-Word jest analogiczna do obsługi w programie MS-Excel. Z oczywistych względów nie ma możliwości tłumaczenia pojedynczego arkusza, czy też komórki. + + +#$ +Tłumaczenie w programie Microsoft PowerPoint + +W programie MS-PowerPoint możliwe jest dodatkowo tłumaczenie wybranych slajdów. W tym celu należy przejść do widoku sortowania slajdów (Widok -> Sortowanie slajdów), zaznaczyć interesujące slajdy i nacisnąć ikonę tłumaczenia. + +Warto zauważyć, że system dokonuje tłumaczenia obiektów osadzonych w dokumentach MS-Office (np. wykresu Excela w dokumencie PowerPoint). + + +#$ +Tłumaczenie w programie Microsoft Outlook + +W programie tym system TRANSLATICA dodaje dwa nowe przyciski, odpowiadające kierunkom tłumaczenia. Tłumaczyć można jeden lub więcej listów (w celu przetłumaczenia grupy listów należy je zaznaczyć w wybranym folderze przed wciśnięciem ikony tłumaczenia). Przetłumaczone dokumenty przechowywane są w folderze Przetłumaczone (Translated w wersji angielskojęzycznej). + + +#$ +Tłumaczenie w programach Writer i Calc + +Po integracji systemu TRANSLATICA z programem Writer lub Calc, do paska narzędzi dodawane są ikony pozwalające na uruchomienie tłumaczenia w obu kierunkach: + - tłumaczenie na język angielski + - tłumaczenie na język polski +Dostępne jest również ustawianie opcji tłumaczenia (ikona ). +Wszystkie powyższe akcje można również uruchomić, wybierając odpowiednie elementy z menu Translatica, dodanego do menu głównego programu. + +W przypadku programu Calc możliwe jest tłumaczenie jedynie całego skoroszytu a nie, jak w programie MS ExcelIDH_MS_WORD_AND_EXCEL, pojedynczych arkuszy czy komórek. + + +#$ +Tłumaczenie za pomocą Edytora Translacji + +Edytor Translacji pojawia się na ekranie po uruchomieniu systemu TRANSLATICA (Start -> Programy -> Translatica X -> Translatica). + + +#$K +Menu programu + +PlikIDH_MENU_FILE Wybierz menu Plik w celu wykonania operacji na plikach. +EdycjaIDH_MENU_EDIT Wybierz menu Edycja w celu wykonania poleceń edycyjnych. +WidokIDH_MENU_VIEW Wybierz menu Widok w celu określenia parametrów wyświetlania. +TłumaczIDH_MENU_TRANSLATION Wybierz menu Tłumacz w celu przetłumaczenia tekstu lub ustawienia parametrów tłumaczenia. +NarzędziaIDH_MENU_TOOLS Wybierz menu Narzędzia w celu wykorzystania dodatkowych narzędzi programu. +PomocIDH_MENU_HELP Wybierz menu Pomoc w celu uzyskania pomocy o programie. + + +#$K +Menu Plik + +Wybierz menu Plik w celu otwarcia lub zapisania tekstów okien źródłowego i docelowego lub w celu wyjścia z programu TRANSLATICA. + +NowyIDH_MENU_FILE_NEW Nowy +Otwórz tekst źródłowyIDH_MENU_FILE_OPEN Otwórz +Otwórz ponownieIDH_MENU_FILE_REOPEN Otwórz ponownie +Zapisz tekst źródłowyIDH_MENU_FILE_SAVE_SOURCE Zapisz źródłowy +Zapisz tekst źródłowy jakoIDH_MENU_FILE_SAVE_SOURCE_AS Zapisz źródłowy jako +Zapisz tekst docelowyIDH_MENU_FILE_SAVE_DESTINATION Zapisz docelowy +Zapisz tekst docelowy jakoIDH_MENU_FILE_SAVE_DESTINATION_AS Zapisz docelowy jako +Zapisz obaIDH_MENU_FILE_SAVE_BOTH Zapisz oba +Zapisz wszystkoIDH_MENU_FILE_SAVE_ALL Zapisz wszystko +ZamknijIDH_MENU_FILE_CLOSE Zamknij +Zamknij wszystkoIDH_MENU_FILE_CLOSE_ALL Zamknij wszystko +ZakończIDH_MENU_FILE_EXIT Zakończ + + +#$K +Polecenie Plik|Nowy + +Wybierz z menu polecenie Plik|Nowy w celu rozpoczęcia nowego tłumaczenia. Okno tekstu źródłowego zostanie wyczyszczone. + + +#$K +Polecenie Plik|Otwórz tekst źródłowy + +Wybierz z menu polecenie Plik|Otwórz tekst źródłowy w celu otwarcia okna dialogowego Otwórz tekst źródłowy. +Okno dialogowe Otwórz tekst źródłowy pozwala na wybór pliku i wczytanie go do okna źródłowego. + +Okno dialogowe Otwórz plik źródłowy + +Szukaj w Wyświetla katalog bieżący. Użyj listy rozwijalnej, aby wybrać inny dysk lub katalog. + +Pliki Wyświetla pliki z katalogu bieżącego, które pasują do wzorca z pola Nazwa pliku lub Pliki typu. + +Nazwa pliku Wpisz nazwę pliku, który chcesz wczytać lub wpisz wzorzec, żeby wyświetlić pliki o nazwie zgodnej z wzorcem. + +Pliki typu Wybierz wzorzec plików, które mają być wyświetlane w liście plików. + +Przejdź do ostatnio +odwiedzanego +katalogu Naciśnij ten przycisk, by wrócić do poprzedniego katalogu bieżącego. + +Do góry o jeden +poziom Naciśnij ten przycisk, żeby przejść do katalogu nadrzędnego. + +Utwórz nowy folder Naciśnij ten przycisk, żeby utworzyć nowy katalog jako katalog podrzędny do bieżącego. + +Menu Widok Naciśnij ten przycisk, żeby zmienić sposób wyświetlania plików. + + +#$K +Polecenie Plik|Otwórz ponownie + +Wybierz z menu polecenie Plik|Otwórz ponownie w celu otwarcia jednego z ostatnio otwieranych plików tekstu źródłowego. + + +#$K +Polecenie Plik|Zapisz tekst źródłowy + +Wybierz z menu polecenie Plik|Zapisz tekst źródłowy w celu zapisania zmian dokonanych w tekście w oknie źródłowym. +Jeżeli plik nie był jeszcze zapisywany, to otworzy się okienko dialogowe Zapisywanie jakoIDH_MENU_FILE_SAVE_SOURCE_AS, które pozwoli na wprowadzenie nazwy pliku. + + +#$K +Polecenie Plik|Zapisz tekst źródłowy jako + +Wybierz z menu polecenie Plik|Zapisz tekst źródłowy jako w celu zapisania tekstu zawartego w oknie źródłowym do pliku. +Okno dialogowe Zapisz tekst źródłowy pozwala na wpisanie lub wybór nazwy pliku, do którego ma zostać zapisany tekst. + +Okno dialogowe Zapisz tekst źródłowy + +Zapisz w Wyświetla katalog bieżący. Użyj listy rozwijalnej, aby wybrać inny dysk lub katalog. + +Pliki Wyświetla pliki z katalogu bieżącego, które pasują do wzorca z pola Nazwa pliku lub Zapisz jako typ. + +Nazwa pliku Wpisz nazwę pliku, który chcesz wczytać lub wpisz wzorzec, żeby wyświetlić według niego pliki. + +Zapisz jako typ Wybierz wzorzec plików, które mają być wyświetlane w liście plików. + +Przejdź do ostatnio +odwiedzanego +katalogu Naciśnij ten przycisk, by wrócić do poprzedniego katalogu bieżącego. + +Do góry o jeden +poziom Naciśnij ten przycisk, żeby przejść do katalogu nadrzędnego. + +Utwórz nowy folder Naciśnij ten przycisk, żeby utworzyć nowy katalog jako katalog podrzędny do bieżącego. + +Menu Widok Naciśnij ten przycisk, żeby zmienić sposób wyświetlania plików. + + +#$K +Polecenie Plik|Zapisz tekst docelowy + +Wybierz z menu polecenie Plik|Zapisz tekst docelowy w celu zapisania zmian dokonanych w tekście w oknie docelowym. +Jeżeli plik nie był jeszcze zapisywany, to otworzy się okienko dialogowe Zapisywanie jakoIDH_MENU_FILE_SAVE_DESTINATION_AS, które pozwoli na wprowadzenie nazwy pliku. + + +#$K +Polecenie Plik|Zapisz tekst docelowy jako + +Wybierz z menu polecenie Plik|Zapisz tekst docelowy jako w celu zapisania tekstu zawartego w oknie docelowym do pliku. +Okno dialogowe Zapisz tekst docelowy jako pozwala na wpisanie lub wybór nazwy pliku, do którego ma zostać zapisany tekst. + +Okno dialogowe Zapisz tekst docelowy + +Zapisz w Wyświetla katalog bieżący. Użyj listy rozwijalnej, aby wybrać inny dysk lub katalog. + +Pliki Wyświetla pliki z katalogu bieżącego, które pasują do wzorca z pola Nazwa pliku lub Zapisz jako typ. + +Nazwa pliku Wpisz nazwę pliku, który chcesz wczytać lub wpisz wzorzec, żeby wyświetlić pliki o nazwie zgodnej z wzorcem. + +Zapisz jako typ Wybierz wzorzec plików, które mają być wyświetlane w liście plików. + +Przejdź do ostatnio +odwiedzanego +katalogu Naciśnij ten przycisk, by wrócić do poprzedniego katalogu bieżącego. + +Do góry o jeden +poziom Naciśnij ten przycisk, żeby przejść do katalogu nadrzędnego. + +Utwórz nowy folder Naciśnij ten przycisk, żeby utworzyć nowy katalog jako katalog podrzędny do bieżącego. + +Menu Widok Naciśnij ten przycisk, żeby zmienić sposób wyświetlania plików. + + +#$K +Polecenie Plik|Zapisz oba +Wybierz z menu polecenie Plik|Zapisz oba w celu zapisania tekstów z okien źródłowego i docelowego. Jeżeli któryś tekst nie był jeszcze zapisywany, otworzy się okno dialogowe Zapisz odpowiednio dla tekstu źródłowegoIDH_MENU_FILE_SAVE_SOURCE_AS lub/i docelowegoIDH_MENU_FILE_SAVE_DESTINATION_AS. + + +#$K +Polecenie Plik|Zapisz wszystko + +Wybierz z menu polecenie Plik|Zapisz wszystko w celu zapisania tekstów wszystkich zakładek z okien źródłowego i docelowego. Jeżeli któryś tekst nie był jeszcze zapisywany, otworzy się okno dialogowe Zapisz odpowiednio dla tekstu źródłowegoIDH_MENU_FILE_SAVE_SOURCE_AS lub/i docelowegoIDH_MENU_FILE_SAVE_DESTINATION_AS. + + +#$K +Polecenie Plik|Zamknij +Wybierz z menu polecenie Plik|Zamknij, aby zamknąć aktywną zakładkę edytora. + + +#$K +Polecenie Plik|Zamknij wszystko +Wybierz z menu polecenie Plik|Zamknij wszystko, aby zamknąć wszystkie zakładki edytora. + +#$K +Polecenie Plik|Zakończ + +Wybierz z menu polecenie Plik|Zakończ w celu zakończenia pracy z edytorem programu TRANSLATICA. + + +#$K +Menu Edycja + +Wybierz menu Edycja w celu wykonania podstawowych operacji edycyjnych pozwalających na kopiowanie, wklejanie i wycinanie zaznaczonych fragmentów tekstów. + +CofnijIDH_MENU_EDIT_UNDO Cofnij +PonówIDH_MENU_EDIT_REDO Ponów +WytnijIDH_MENU_EDIT_CUT Wytnij +KopiujIDH_MENU_EDIT_COPY Kopiuj +WklejIDH_MENU_EDIT_PASTE Wklej +UsuńIDH_MENU_EDIT_DELETE Usuń +Zaznacz wszystkoIDH_MENU_EDIT_SELECT_ALL Zaznacz wszystko +ZnajdźIDH_MENU_EDIT_FIND Znajdź +ZamieńIDH_MENU_EDIT_REPLACE Zamień +Znajdź następnyIDH_MENU_EDIT_FIND_NEXT Znajdź następny + + +#$K +Polecenie Edycja|Cofnij + +Wybierz z menu polecenie Edycja|Cofnij w celu cofnięcia ostatnio dokonanej operacji edycyjnej w oknie źródłowym lub docelowym. + + +#$K +Polecenie Edycja|Ponów + +Wybierz z menu polecenie Edycja|Ponów w celu ponownego wykonania ostatnio użytej operacji edycyjnej w oknie źródłowym lub docelowym. + + +#$K +Polecenie Edycja|Wytnij + +Wybierz z menu polecenie Edycja|Wytnij w celu przeniesienia do schowka zaznaczonego fragmentu tekstu. + + +#$K +Polecenie Edycja|Kopiuj + +Wybierz z menu polecenie Edycja|Kopiuj w celu skopiowania zaznaczonego fragmentu tekstu do schowka. + + +#$K +Polecenie Edycja|Wklej + +Wybierz z menu polecenie Edycja|Wklej w celu wklejenia tekstu zawartego w schowku.na pozycji, w której ustawiony jest kursor edycyjny. + + +#$K +Polecenie Edycja|Usuń + +Wybierz z menu polecenie Edycja|Usuń w celu usunięcia zaznaczonego fragmentu tekstu. + + +#$K +Polecenie Edycja|Zaznacz wszystko + +Wybierz z menu polecenie Edycja|Zaznacz wszystko w celu zaznaczenia całego tekstu. + + +#$K +Polecenie Edycja|Znajdź +W celu znalezienia w bieżącym oknie Edytora określonego wyraz lub frazy, wybierz polecenie Edycja|Znajdź. +Okno dialogowe Znajdź pozwala na wpisanie szukanego wyrazu lub frazy wyrazowej oraz określenie opcji wyszukiwania. + +Okno dialogowe Znajdź + +Szukany tekst Wpisz tekst do wyszukania. + +Opcje | Uwzględniaj +wielkość liter Zaznacz opcję, jeżeli dopasowanie tekstu ma uwzględniać wielkość liter. + +Kierunek | W przód/W tył Zaznacz odpowiednią opcję, jeżeli wyszukiwanie ma się odbywać na tekście znajdującym się przed/za bieżącą pozycją kursora. + +#$K +Polecenie Edycja|Zamień +W celu zamiany określonego tekstu na inny, wybierz polecenie Edycja|Zamień. +Okno dialogowe Zamień pozwala na wpisanie tekstu do zastąpienia oraz tekstu, który ma być wpisany. + +Okno dialogowe Zamień + +Szukany tekst Wpisz tekst, który ma być wyszukany i zastąpiony. + +Zamień na Wpisz tekst, którym ma być zastąpiony tekst szukany. + +Opcje | Uwzględniaj +wielkość liter Zaznacz opcję, jeżeli dopasowanie tekstu ma uwzględniać wielkość liter. + +Kierunek | W przód/W tył Zaznacz odpowiednią opcję, jeżeli wyszukiwanie ma się odbywać na tekście znajdującym się przed/za bieżącą pozycją kursora. + +Pomiń Kliknij przycisk, jeżeli dane wystąpienie tekstu ma być pominięte. + +Zamień wszystko Kliknij przycisk, jeżeli wszystkie znalezione wystąpienia tekstu mają być zamienione + + +#$K +Polecenie Edycja|Znajdź następny +Po włączeniu procesu wyszukiwania tekstu wybierz polecenie Edycja|Znajdź następny, żeby wyszukać kolejne wystąpienie podanego tekstu. + + +#$K +Menu Widok + +Wybierz menu Widok w celu dostosowania wyglądu programu. + +Granice wyrazówIDH_MENU_VIEW_SOURCE_TOKENS +tekstu źródłowegoIDH_MENU_VIEW_SOURCE_TOKENS Pokaż/Ukryj granice wyrazów tekstu źródłowego + +Wyrazy nieznaneIDH_MENU_VIEW_SOURCE_UNKNOWN +tekstu źródłowegoIDH_MENU_VIEW_SOURCE_UNKNOWN Włącz/wyłącz zaznaczenie wyrazów nieznanych w tekście źródłowym + +Granice wyrazówIDH_MENU_VIEW_TARGET_TOKENS +tekstu docelowegoIDH_MENU_VIEW_TARGET_TOKENS Pokaż/Ukryj granice wyrazów tekstu docelowego + +Wyrazy nieznaneIDH_MENU_VIEW_TARGET_UNKNOWN +tekstu docelowegoIDH_MENU_VIEW_TARGET_UNKNOWN Włącz/wyłącz zaznaczenie wyrazów nieznanych w tekście źródłowym + +Okno źródłoweIDH_MENU_VIEW_SOURCE Okno źródłowe + +Okno doceloweIDH_MENU_VIEW_DESTINATION Okno docelowe + +Ustawienie poziomeIDH_MENU_VIEW_HORIZONTAL Ustawienie poziome + +Ustawienie pionoweIDH_MENU_VIEW_VERTICAL Ustawienie pionowe + +Pasek narzędziIDH_MENU_VIEW_TOOLBAR Pasek narzędzi + +Pasek stanuIDH_MENU_VIEW_STATUSBAR Pasek stanu + +CzcionkaIDH_MENU_VIEW_FONT Wybór czcionki + + +#$K +Polecenie Widok|Granice wyrazów tekstu źródłowego + +Wybierz z menu polecenie Widok|Granice wyrazów tekstu źródłowego w celu pokazania lub ukrycia granic wyrazów w tekście źródłowym. Granice te są oznaczone znacznikami w kolorze niebieskim. Znaczniki kończące zdanie są dodatkowo oznaczane kropką. + + +#$K +Polecenie Widok|Granice wyrazów tekstu docelowego + +Wybierz z menu polecenie Widok|Granice wyrazów tekstu docelowego w celu pokazania lub ukrycia granic wyrazów w tekście przetłumaczonym. Granice te są oznaczone znacznikami w kolorze niebieskim. Znaczniki kończące zdanie są dodatkowo oznaczane kropką. + + +#$K +Polecenie Widok|Wyrazy nieznane tekstu źródłowego + +Wybierz z menu polecenie Widok|Wyrazy nieznane tekstu źródłowego w celu oznaczenia wyrazów w tekście źródłowym, które nie zostały rozpoznane przez Analizator tekstu. Wyrazy te są podkreślone żółtą linią. Wyrazy oznaczone w ten sposób nie są tłumaczone, lecz przenoszone do tekstu docelowego. + + +#$K +Polecenie Widok|Wyrazy nieznane tekstu docelowego + +Wybierz z menu polecenie Widok|Wyrazy nieznane tekstu docelowego w celu oznaczenia wyrazów w przetłumaczonym tekście, które nie zostały rozpoznane przez Analizator tekstu. Wyrazy te są podkreślone żółtą linią. + + +#$K +Polecenie Widok|Ustawienie poziome + +Wybierz z menu polecenie Widok|Ustawienie poziome w celu poziomego (jedno nad drugim) ustawienia okien źródłowego i docelowego. + + +#$K +Polecenie Widok|Ustawienie pionowe + +Wybierz z menu polecenie Widok|Ustawienie pionowe w celu pionowego (jedno obok drugiego) ustawienia okien źródłowego i docelowego. Ustawienie to pozwala na łatwiejsze porównywanie tekstu źródłowego i docelowego. + + +#$K +Polecenie Widok|Okno źródłowe + +Wybierz z menu polecenie Widok|Okno źródłowe w celu pokazania lub ukrycia okna z tekstem źródłowym. W przypadku, gdy chcemy ukryć okno źródłowe, a okno docelowe jest także ukryte, pokaże się okno docelowe (co najmniej jedno okno musi być widoczne). + + +#$K +Polecenie Widok|Okno docelowe + +Wybierz z menu polecenie Widok|Okno docelowe w celu pokazania lub ukrycia okna z tekstem docelowym. W przypadku, gdy chcemy ukryć okno docelowe, a okno źródłowe jest także ukryte, pokaże się okno źródłowe (co najmniej jedno okno musi być widoczne). + + +#$K +Polecenie Widok|Pasek narzędzi + +Wybierz z menu polecenie Widok|Pasek narzędzi w celu pokazania lub ukrycia paska narzędzi (u góry okna aplikacji). + + +#$K +Polecenie Widok|Pasek stanu + +Wybierz z menu polecenie Widok|Pasek stanu w celu pokazania lub ukrycia paska stanu (u dołu okna programu). +Pasek stanu podaje podstawowe informacje o edytowanym tekście: pozycję kursora i aktualny kontekst. + + +#$K +Polecenie Widok|Czcionka + +Wybierz z menu polecenie Widok|Czcionka w celu zmiany kroju i wielkości czcionki w oknach edycyjnych. + + +#$K +Menu Tłumacz + +Wybierz menu Tłumacz w celu uruchomienia poleceń związanych z tłumaczeniem. + +TłumaczIDH_MENU_TRANSLATION_TRANSLATE Tłumacz +Polsko-AngielskieIDH_MENU_TRANSLATION_PLEN Polsko-Angielskie +Angielsko-PolskieIDH_MENU_TRANSLATION_ENPL Angielsko-Polskie +UstawieniaIDH_MENU_TRANSLATION_SETTINGS Ustawienia + + +#$K +Polecenie Tłumacz|Tłumacz + +Wybierz z menu polecenie Tłumacz|Tłumacz w celu przetłumaczenia tekstu. + +Jeżeli pewien fragment tekstu w oknie źródłowym jest zaznaczony, wówczas tłumaczony jest tylko zaznaczony fragment. W przeciwnym przypadku tłumaczony jest cały tekst z okna źródłowego. +Przetłumaczony tekst umieszczany jest w oknie docelowym. Poprzednia zawartość okna docelowego jest usuwana. + +Jeżeli tłumaczony jest dłuższy fragment tekstu, to podczas tłumaczenia pokazywane jest okno postępu tłumaczenia. Tłumaczenie można wówczas przerwać wciskając przycisk Anuluj w oknie postępu tłumaczenia. + +Okno postępu tłumaczenia zawiera następujące pola: + +Zdania Podaje ilość przetłumaczonych zdań tekstu. + +Wyrazy Podaje ilość przetłumaczonych wyrazów. + +Tłumaczonych Podaje ilość zdań, które zostały przetłumaczone. + +Skopiowanych Podaje ilość zdań, które zostały przeniesione z tekstu źródłowego do docelowego. + +Kontekst Podaje aktualny kontekst tłumaczonego tekstu. + +Zamknij okno po +zakończeniu Jeśli pole jest zaznaczone, okno postępu tłumaczenia zostanie zamknięte po zakończeniu tłumaczenia. W przeciwnym przypadku okno należy zamknąć wciskając przycisk Zamknij. + + +#$K +Polecenie Tłumacz|Polsko-Angielskie + +Wybierz z menu polecenie Tłumacz|Polsko-Angielskie w celu ustawienia kierunku tłumaczenia na kierunek z języka polskiego na język angielski. +Po zmianie kierunku tłumaczenia, jeżeli włączona jest analizaIDH_MENU_TOOLS_ANALYSE tekstu, tekst w oknie źródłowym zostanie ponownie przeanalizowany. + + +#$K +Polecenie Tłumacz|Angielsko-Polskie + +Wybierz z menu polecenie Tłumacz|Angielsko-Polskie w celu ustawienia kierunku tłumaczenia na kierunek z języka angielskiego na język polski. +Po zmianie kierunku tłumaczenia, jeżeli włączona jest analizaIDH_MENU_TOOLS_ANALYSE tekstu, tekst w oknie źródłowym zostanie ponownie przeanalizowany. + + +#$K +Polecenie Tłumaczenie|Ustawienia + +Wybierz z menu polecenie Tłumaczenie|Ustawienia w celu ustawienia opcji tłumaczenia. Do opcji tych należą: konteksty, słowniki oraz wyrazy nietłumaczone. + + +Zakładka Konteksty + +Wybierz zakładkę Konteksty w celu ustawienia kontekstu tłumaczenia. Ustawienie kontekstu wpływa na sposób tłumaczenia wyrazu. + +W wyniku wybrania polecenia pojawi się okno pozwalające na wybór kontekstu w następujących kategoriach: +• Dziedziny – zawiera konteksty tematyczne opisujące dziedziny wiedzy +• Style – zawiera konteksty określające styl tłumaczonego tekstu +• Dialekty – zawiera konteksty określające wariant języka angielskiego + + +Zakładka Słowniki + +Wybierz zakładkę Słowniki w celu określenia, z jakich słowników system ma pobierać informacje o tłumaczeniu poszczególnych wyrazów i fraz. Dostępne są następujące słowniki: +• Lokalny użytkownika – budowany w trakcie użytkowania systemu +• Systemowy – dołączany do systemu + + +Zakładka Wyrazy nietłumaczone + +Wybierz zakładkę Wyrazy nietłumaczone, aby przeglądać i edytować listę wyrazów i form wyrazowych wyjętych z tłumaczenia. + +Przycisk Usuń Kliknij przycisk usuń, aby usunąć wybrany wyraz z listy wyrazów nietłumaczonych + +Przycisk Zaznacz/Odznacz Kliknij przycisk, aby zaznaczyć/odznaczyć wybrany wyraz jako wyraz nietłumaczony + +Wyświetlaj okno wyboru +lokalnie/globalnie Zaznacz opcję, jeżeli przy dodawaniu wyrazu do listy wyrazów nietłumaczonych ma być wyświetlane okno globalnego lub lokalnego wyłączenia wyrazu z tłumaczenia + + +#$K +Menu Narzędzia + +Wybierz menu Narzędzia w celu uaktywnienia dodatkowych możliwości programu TRANSLATICA. + +Analizuj tekst źródłowyIDH_MENU_TOOLS_ANALYSE Analizuj tekst +Sprawdzaj pisownięIDH_MENU_TOOLS_SPELLCHECKING Sprawdzaj pisownię +Generuj wariantyIDH_MENU_TOOLS_VARIANTS Pokaż/Ukryj warianty +Generuj drzewa składnioweIDH_MENU_TOOLS_SYNTAX_TREE Generuj drzewa składniowe +SłownikIDH_MENU_TOOLS_DICTIONARY Słownik +WypowiedzIDH_MENU_TOOLS_SPEAK Wypowiedz tekst +SłuchajIDH_MENU_TOOLS_DICTATE Słuchaj +Kompilator danych korporacyjnychIDH_DATA_COMPILER Kompilator danych korporacyjnych +Słownik PWN-OxfordIDH_PWN_DICTIONARY Słownik PWN-Oxford +Język programuIDH_MENU_TOOLS_APPLICATION_LANGUAGE Język programu + + +#$K +Polecenie Narzędzia|Analizuj tekst źródłowy + +Wybierz z menu polecenie Narzędzia|Analizuj tekst źródłowy w celu włączenia lub wyłączenia automatycznej analizy tekstu źródłowego. + +Podczas analizy rozpoznawane są pojedyncze wyrazy, wyrazy złożone oraz zdania. Ponadto przy włączonej opcji Sprawdzaj pisownięIDH_MENU_TOOLS_SPELLCHECKING sprawdzana jest poprawność wyrazów. + +Podczas analizy dłuższych fragmentów tekstu pojawia się okno Analiza tekstu zawierające następujące pola: + +Zdania Podaje liczbę przeanalizowanych zdań. + +Wyrazy Podaje liczbę rozpoznanych wyrazów. + +Błędy Podaje liczbę wyrazów błędnych. + +Nieznane Podaje liczbę wyrazów nieznanych. + +Zamknij po +zakończeniu Jeśli pole jest zaznaczone, okno analizy zostanie zamknięte po zakończeniu analizy. W przeciwnym przypadku okno należy zamknąć wciskając przycisk Zamknij. + +Anuluj Przycisk pozwala na przerwanie analizy tekstu źródłowego. + + +#$K +Polecenie Narzędzia|Sprawdzaj pisownię + +Wybierz z menu polecenie Narzędzia|Sprawdzaj pisownię w celu włączenia lub wyłączenia sprawdzania poprawności ortograficznej wyrazów w tekście źródłowym. Wyrazy błędne są podkreślone czerwoną linią falistą. Jeżeli wyraz zostanie uznany przez system za błędny, wówczas możliwy jest wybór wyrazu spośród podpowiedzi wygenerowanych przez system. Podpowiedzi pojawiają się po kliknięciu na wyrazie prawym przyciskiem myszy. + + +#$K +Polecenie Narzędzia|Generuj warianty + +Wybierz z menu polecenie Narzędzia|Generuj warianty w celu tłumaczenia z możliwością wyboru wariantów (alternatywnych tłumaczeń). Wyrazy, dla których istnieje możliwość wyboru wariantów, są w oknie docelowym podkreślone szarą przerywaną linią. + + +#$K +Polecenie Narzędzia|Generuj drzewa składniowe + +Wybierz z menu polecenie Narzędzia|Generuj drzewa składniowe w celu przetłumaczenia zaznaczonego fragmentu tekstu lub całego tekstu z włączoną opcją pokazywania drzew składniowych. +Po zakończeniu tłumaczenia zostaje wyświetlone okno struktury składniowej pozwalające na obejrzenie struktury zdań w języku źródłowym i docelowym. +Podczas tłumaczenia dłuższego tekstu wyświetlane jest okno postępu tłumaczenia. + + +#$K +Polecenie Narzędzia|Słownik + +Wybierz z menu polecenie Narzędzia|Słownik w celu uruchomienia przeglądarki słownika. + + +#$K +Polecenie Narzędzia|Wypowiedz +Wybierz z menu polecenie Narzędzia|Wypowiedz w celu odczytania tekstu w języku angielskim. + + +#$K +Polecenie Narzędzia|Słuchaj +Wybierz z menu polecenie Narzędzia|Słuchaj w celu podyktowania tekstu w języku angielskim. + + +#$K +Polecenie Narzędzia|Kompilator danych korporacyjnych + +Wybierz z menu polecenie Narzędzia|Kompilator danych korporacyjnych aby uruchomić kompilator Bazy tłumaczeń firmyIDH_CORP_DATA. W wyniku jego działania powstaje plik msi, uruchomienie którego powoduje zainstalowanie Bazy tłumaczeń firmyIDH_CORP_DATA. + +Okno kompilatora danych korporacyjnych ma następujące pola: +Plik wejściowy Wpisz nazwę pliku Bazy tłumaczeń firmy. + +Ścieżka wyjściowa Wpisz lokalizację istniejącego katalogu, w którym tworzone będą plik wynikowy msi oraz wszystkie inne pliki potrzebne do jego utworzenia. + +Wersja Wpisz wersję pliku instalacyjnego msi. + +Przycisk Kompilacja Wciśnij przycisk, aby uruchomić proces kompilacji podanego pliku Bazy tłumaczeń firmy. + +Przycisk Tworzenie MSI Wciśnij przycisk, aby uruchomić proces tworzenia pliku instalacyjnego z plików powstałych podczas kompilacji. + +Komunikaty Okno wyświetlające komunikaty kompilacji i tworzenia pliku msi + +Uwaga: Do utworzenia MSI niezbędne jest zainstalowanie .Net Framework (w wersji 1.1. lub nowszej). W razie potrzeby plik instalacyjny można znaleźć na stronie microsoft.com*!EF(‘www.microsoft.com’). + + +#$K +Polecenie Narzędzia|Słownik PWN-Oxford + +Wybierz z menu polecenie Narzędzia|Słownik PWN-Oxford aby uruchomić słownik PWN-Oxford, jeżeli jest zainstalowany na komputerze. + + +#$K +Polecenie Narzędzia|Język programu + +Wybierz z menu polecenie Narzędzia|Język programu w celu zmiany języka interfejsu użytkownika. + + +#$K +Menu Pomoc + +Wybierz menu Pomoc w celu wyświetlenia pomocy programu lub wyświetlenia informacji o programie Translatica. + +Pomoc programu TranslaticaIDH_MENU_HELP_TRANSLATICA_HELP Pomoc programu Translatica +O programieIDH_MENU_HELP_ABOUT O programie + + +#$K +Polecenie Pomoc|Pomoc programu Translatica + +Wybierz z menu polecenie Pomoc|Pomoc programu Translatica w celu uruchomienia systemu pomocy programu. + + +#$K +Polecenie Pomoc|O programie + +Wybierz z menu polecenie Pomoc|O programie w celu wyświetlenia informacji o programie TRANSLATICA. + + +#$ +Pamięć tłumaczeń i słownik firmy + +Tłumaczenie zdań w sposób zadany przez użytkowników systemu jest realizowane przy pomocy Pamięci tłumaczeń. Pamięć tłumaczeń może zawierać praktycznie nieograniczoną liczbę zdań, które w obrębie danej instytucji powinny być zawsze tłumaczone w jeden określony sposób (przykładem zastosowania mogą być teksty na wszelkiego rodzaju formularzach). Gdy w zadanym do tłumaczenia tekście system napotka na zdanie, które znajduje się w Pamięci tłumaczeń, to proces automatycznego tłumaczenia zostanie zaniechany, a pobrany zostanie tekst tłumaczenia z Pamięci tłumaczeń. Należy zauważyć, że system nie szuka w Pamięci tłumaczeń zdań podobnych do danego lecz identycznych. +Słownik firmy może zawierać wyrazy oraz frazy kilkuwyrazowe, które mają być w obrębie firmy tłumaczone w pewien określony sposób, niezależnie od formy w jakiej występują. Jeśli na przykład pewien bank zażyczy sobie, aby w swoich dokumentach tłumaczeniem frazy pożyczka długoterminowa było long-period loan (a nie jak w słowniku systemu TRANSLATICA long-term loan), to w taki sposób tłumaczone będą wszelkie wystąpienia tej frazy we wszystkich odmianach (np. pożyczki długoterminowej) – również wewnątrz + +Dla ułatwienia, zdania z Pamięci tłumaczeń i frazy ze Słownika firmy są przechowywane w jednym pliku, zwanym dalej Bazą tłumaczeń firmy. +Baza tłumaczeń firmy powinna zawierać wyrazy, frazy lub zdania w języku źródłowym i docelowym z określeniem sposobu i kierunku tłumaczenia. Plik ten może być stosowany w dwóch formatach: tzw. prostym oraz w formacie XML. + +Format prosty zakłada, że kolejne wiersze składają się z następujących elementów rozdzielonych znakami tabulacji: +Czy fraza wartość logiczna określająca, czy podane hasło jest frazą, która ma być odmieniana i odszukiwana wewnątrz zdań (czyli elementem Słownika firmy), czy też zdaniem (elementem Pamięci tłumaczeń). Dopuszczalne wartości: + yes (lub tak lub1) dla frazy + no (lub nie lub 0) dla zdania. + +Kierunek określa kierunek tłumaczenia, który ma być stosowany dla podanej pary fraz. Możliwe wartości to: + “>” – tłumaczenie tylko w kierunku polsko-angielskim + “<” – tłumaczenie tylko w kierunku angielsko-polskim + “<>” (lub napis pusty) – tłumaczenie w obu kierunkach + +Fraza 1 tekst w języku polskim + +Fraza 2 tekst w języku angielskim. + +Plik pamięci tłumaczeń w formacie prostym można łatwo uzyskać z pliku formatu .xls . Jeśli kolejne elementy opisu hasła podane są w kolejnych kolumnach, to format prosty uzyskuje się poprzez Zapisz jako Tekst (rozdzielany znakami tabulacji). + +Przykład pliku w formacie prostym: + +no < Być, albo nie być – oto jest pytanie. To be, or not to be: that is the question. +no <> Drogi Kliencie. Dear customer. +yes > Biały Dom White House + +Plik pamięci tłumaczeń w formacie XML powinien być zgodny ze schematem zawartym w pliku bin/win/enterprise_data.xsd. + +Przykład pliku formacie XML: + + + + To be, or not to be: that is the question. + Być, albo nie być – oto jest pytanie. + + + Drogi Kliencie. + Dear customer. + + Biały Dom + White House + + + + +#$K +Batcher + +System TRANSLATICA daje możliwość przetwarzania wsadowego dokumentów aplikacji MS Word, MS Excel oraz MS PowerPoint, czyli tłumaczenia wielu plików bez konieczności uprzedniego otwierania ich przez użytkownika. Do przetwarzania wsadowego służy program Batcher uruchamiany z menu Start: Start -> Translatica Enterprise/Office+ -> Batcher. + + + +Kolejne przyciski mają następujące funkcje: +Dodaj Wyświetla okno dialogowe służące do wybrania jednego lub wielu plików, które mają być przetłumaczone. + +Usuń Usuwa zaznaczony plik z listy plików do tłumaczenia. + +Resetuj Usuwa wszystkie pliki z listy plików do tłumaczenia. + +Opcje Wyświetla okno ustawień tłumaczenia dla danego pliku (patrz UstawieniaIDH_MENU_TRANSLATION_SETTINGS). + + lub Zmienia kierunek tłumaczenia; symbol flagi określa język docelowy tłumaczenia. + +Tłumacz Rozpoczyna proces tłumaczenia. + +Anuluj Kończy pracę programu. + +W oknie głównym programu Batcher wyświetlane jest drzewo z listą plików przeznaczonych do tłumaczenia, przy czym każdy z nich wyświetlany jest pod nazwą aplikacji, z którą jest skojarzony. Jeżeli któryś ze składników pakietu MS Office nie jest zainstalowany lub nie został zintegrowany, wówczas przy jego nazwie pojawia się symbol . + +Po dodaniu nowych plików, przy każdym z nich wyświetlony zostaje symbol lub określający język źródłowy pliku. + +Bezpośrednio po uruchomieniu procesu tłumaczenia wyświetlone zostaje okno dialogowe służące do określenia katalogu docelowego, w którym mają być umiejscowione przetłumaczone dokumenty. + +Po ukończeniu tłumaczenia przy nazwie każdego z tłumaczonych plików powinien pojawić się symbol flagi języka określonego jako docelowy. Wyświetlenie symbolu lub oznacza, że tłumaczenie danego pliku zakończyło się niepowodzeniem. + +Po skończonym procesie tłumaczenia, po zaznaczeniu nazwy tłumaczonego dokumentu, na pasku stanu wypisywana jest ścieżka dostępu do odpowiadającego mu dokumentu już przetłumaczonego. + + +#$K +Updater + +System TRANSLATICA wyposażony jest w program Updater umożliwiający automatyczną aktualizację przez Internet. Program ten można uruchomić wybierając polecenie z menu Start: Start -> Translatica X -> Updater. Jeżeli jest dostępna aktualizacja dla używanej wersji systemu, wówczas pojawi się okienko powiadamiające. Jednocześnie użytkownik proszony jest o potwierdzenie przeprowadzenia aktualizacji: + + + +Kolejne przyciski mają następujące funkcje: +Tak Rozpocznij pobieranie i instalację aktualizacji. + +Nie Pomiń tę wersję aktualizacji. + +Opcje Pokaż/ukryj opcje aktualizacji. + +Aktualizuj automatycznie Uruchamiaj aktualizację przy starcie systemu TRANSLATICA. + +Informuj o aktualizacjach Wyświetlaj informację o nowej aktualizacji i pytaj o jej zainstalowanie. + +Wyłącz automatyczną aktualizację Pozwól na uruchamianie aktualizacji tylko przez użytkownika. + +Zastosuj Zastosuj zmiany dokonane w opcjach. + +# IDH_ABOUT_MT +$ Kilka słów o tłumaczeniu automatycznym +# IDH_CHARACTERIZATION +$ Charakterystyka systemu TRANSLATICA +# IDH_LOCAL_INSTALLATION +$ Instalacja lokalna +# IDH_NET_INSTALLATION +$ Instalacja przez sieć +# IDH_VERSIONS +$ Wersje programu +# IDH_INTEGRATOR +$ Integrator +# IDH_LANGUAGE_VERSIONS +$ Wersje językowe +# IDH_MS_INTERNET_EXPLORER +$ Tłumaczenie w programie Microsoft Internet Explorer +# IDH_MOZILLA +$ Tłumaczenie w programie Mozilla +# IDH_OUTLOOK_EXPRESS +$ Tłumaczenie w programie Outlook Express +# IDH_MS_WORD_AND_EXCEL +$ Tłumaczenie w programach Microsoft Word i Microsoft Excel +# IDH_MS_POWERPOINT +$ Tłumaczenie w programie Microsoft PowerPoint +# IDH_MS_OUTLOOK +$ Tłumaczenie w programie Microsoft Outlook +# IDH_OO_WRITER +$ Tłumaczenie w programie Writer +# IDH_EDITOR +$ Tłumaczenie w edytorze translacji +# IDH_MENU +$ Menu programu TRANSLATICA +K menu programu +# IDH_MENU_FILE +$ Menu Plik +K Plik, menu +# IDH_MENU_FILE_NEW +$ Polecenie Plik|Nowy +K Nowy, polecenie +# IDH_MENU_FILE_OPEN +$ Polecenie Plik|Otwórz +K Otwórz, polecenie +# IDH_MENU_FILE_REOPEN +$ Polecenie Plik|Otwórz ponownie +K Otwórz ponownie, polecenie +# IDH_MENU_FILE_SAVE_SOURCE +$ Polecenie Plik|Zapisz źródłowy +K Zapisz źródłowy, polecenie +# IDH_MENU_FILE_SAVE_SOURCE_AS +$ Polecenie Plik|Zapisz źródłowy jako +K Zapisz źródłowy jako, polecenie +# IDH_MENU_FILE_SAVE_DESTINATION +$ Polecenie Plik|Zapisz docelowy +K Zapisz docelowy, polecenie +# IDH_MENU_FILE_SAVE_DESTINATION_AS +$ Polecenie Plik|Zapisz docelowy jako +K Zapisz docelowy jako, polecenie +# IDH_MENU_FILE_SAVE_BOTH +$ Polecenie Plik|Zapisz oba +K Zapisz oba, polecenie +# IDH_MENU_FILE_SAVE_ALL +$ Polecenie Plik|Zapisz wszystko +K Zapisz wszystko, polecenie +# IDH_MENU_FILE_CLOSE +$ Polecenie Plik|Zamknij +K Zamknij, polecenie +# IDH_MENU_FILE_CLOSE_ALL +$ Polecenie Plik|Zamknij wszystko +K Zamknij wszystko, polecenie +# IDH_MENU_FILE_EXIT +$ Polecenie Plik|Zakończ +K Zakończ, polecenie +# IDH_MENU_EDIT +$ Menu Edycja +K Edycja, menu +# IDH_MENU_EDIT_UNDO +$ Polecenie Edycja|Cofnij +K Cofnij, polecenie +# IDH_MENU_EDIT_REDO +$ Polecenie Edycja|Ponów +K Ponów, polecenie +# IDH_MENU_EDIT_CUT +$ Polecenie Edycja|Wytnij +K Wytnij, polecenie +# IDH_MENU_EDIT_COPY +$ Polecenie Edycja|Kopiuj +K Kopiuj, polecenie +# IDH_MENU_EDIT_PASTE +$ Polecenie Edycja|Wklej +K Wklej, polecenie +# IDH_MENU_EDIT_DELETE +$ Polecenie Edycja|Usuń +K Usuń, polecenie +# IDH_MENU_EDIT_SELECT_ALL +$ Polecenie Edycja|Zaznacz wszystko +K Zaznacz wszystko, polecenie +# IDH_MENU_EDIT_FIND +$ Polecenie Edycja|Znajdź +K Znajdź, polecenie +# IDH_MENU_EDIT_REPLACE +$ Polecenie Edycja|Zamień +K Zamień, polecenie +# IDH_MENU_EDIT_FIND_NEXT +$ Polecenie Edycja|Znajdź następny +K Znajdź następny, polecenie +# IDH_MENU_VIEW +$ Menu Widok +K Widok, menu +# IDH_MENU_VIEW_SOURCE_TOKENS +$ Polecenie Widok|Granice wyrazów tekstu źródłowego +K Granice wyrazów tekstu źródłowego, polecenie +# IDH_MENU_VIEW_TARGET_TOKENS +$ Polecenie Widok|Granice wyrazów tekstu docelowego +K Granice wyrazów tekstu docelowego, polecenie +# IDH_MENU_VIEW_SOURCE_UNKNOWN +$ Polecenie Widok|Wyrazy nieznane tekstu źródłowego +K Wyrazy nieznane tekstu źródłowego, polecenie +# IDH_MENU_VIEW_TARGET_UNKNOWN +$ Polecenie Widok|Wyrazy nieznane tekstu docelowego +K Wyrazy nieznane tekstu docelowego, polecenie +# IDH_MENU_VIEW_HORIZONTAL +$ Polecenie Widok|Ustawienie poziome +K Ustawienie poziome, polecenie +# IDH_MENU_VIEW_VERTICAL +$ Polecenie Widok|Ustawienie pionowe +K Ustawienie pionowe, polecenie +# IDH_MENU_VIEW_SOURCE +$ Polecenie Widok|Okno źródłowe +K Okno źródłowe, polecenie +# IDH_MENU_VIEW_DESTINATION +$ Polecenie Widok|Okno docelowe +K Okno docelowe, polecenie +# IDH_MENU_VIEW_TOOLBAR +$ Polecenie Widok|Pasek narzędzi +K Pasek narzędzi, polecenie +# IDH_MENU_VIEW_STATUSBAR +$ Polecenie Widok|Pasek stanu +K Pasek stanu, polecenie +# IDH_MENU_VIEW_FONT +$ Polecenie Widok|Czcionka +K Czcionka, polecenie +# IDH_MENU_TRANSLATION +$ Menu Tłumacz +K Tłumacz, menu +# IDH_MENU_TRANSLATION_TRANSLATE +$ Polecenie Tłumacz|Tłumacz +K Tłumacz, polecenie +# IDH_MENU_TRANSLATION_PLEN +$ Polecenie Tłumacz|Polsko-Angielskie +K Polsko-Angielskie, polecenie +# IDH_MENU_TRANSLATION_ENPL +$ Polecenie Tłumacz|Angielsko-Polskie +K Angielsko-Polskie, polecenie +# IDH_MENU_TRANSLATION_SETTINGS +$ Polecenie Tłumacz|Ustawienia +K Ustawienia +# IDH_MENU_TOOLS +$ Menu Narzędzia +K Narzędzia, menu +# IDH_MENU_TOOLS_ANALYSE +$ Polecenie Narzędzia|Analizuj tekst +K Analizuj tekst, polecenie +# IDH_MENU_TOOLS_SPELLCHECKING +$ Polecenie Opcje|Sprawdzaj pisownię +K Sprawdzaj pisownię, polecenie +# IDH_MENU_TOOLS_VARIANTS +$ Polecenie Narzędzia|Generuj warianty +K Warianty, Polecenie +# IDH_MENU_TOOLS_SYNTAX_TREE +$ Polecenie Narzędzia|Pokazuj drzewa składniowe +K Pokazuj drzewa składniowe, polecenie +# IDH_MENU_TOOLS_DICTIONARY +$ Polecenie Narzędzia|Słownik +K Słownik, polecenie +# IDH_MENU_TOOLS_SPEAK +$ Polecenie Narzędzia|Wypowiedz +K Wypowiedz, polecenie +# IDH_MENU_TOOLS_DICTATE +$ Polecenie Narzędzia|Słuchaj +K Słuchaj, polecenie +# IDH_DATA_COMPILER +$ Polecenie Narzędzia|Kompilator danych korporacyjnych +K Kompilator danych korporacyjnych, polecenie +# IDH_PWN_DICTIONARY +$ Polecenie Narzędzia|Słownik PWN-Oxford +K Słownik PWN-Oxford, polecenie +# IDH_MENU_TOOLS_APPLICATION_LANGUAGE +$ Polecenie Narzędzia|Język programu +K Język programu, polecenie +# IDH_MENU_HELP +$ Menu Pomoc +K Pomoc, menu +# IDH_MENU_HELP_TRANSLATICA_HELP +$ Polecenie Pomoc|Pomoc programu Translatica +K Pomoc programu Translatica, polecenie +# IDH_MENU_HELP_ABOUT +$ Polecenie Pomoc|O programie +K O programie, polecenie +# IDH_CORP_DATA +$ Pamięć tłumaczeń i słownik firmy +# IDH_BATCHER +$ Batcher +K Przetwarzanie wsadowe +# IDH_UPDATER +$ Updater +K Automatyczna aktualizacja +?? + +?? + +?? + +?? + diff --git a/examples/txt/.svn/text-base/poznan-de.txt.svn-base b/examples/txt/.svn/text-base/poznan-de.txt.svn-base new file mode 100755 index 0000000..a19df81 --- /dev/null +++ b/examples/txt/.svn/text-base/poznan-de.txt.svn-base @@ -0,0 +1,12 @@ +Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. +Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. Seine Fläche beträgt 285 ha. Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. +Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. Angeln kann man sowohl vom Ufer, als auch vom Boot aus. Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. +Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. +Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. +Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). +Der Rusałka - See ist ein künstliches Wasserreservoir. Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. Der See hat eine Fläche von 36,7 ha. Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. Die Länge der Uferlinie beträgt 3300 m. +Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. +Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. +Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. Die Fläche des Sees beträgt 34,9 ha. Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. +Der See wird vom Polnischen Angelverein in Poznań genutzt. In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. In dem See überwiegt die Kleine Maräne. Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. +Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. diff --git a/examples/txt/.svn/text-base/poznan-pl.txt.svn-base b/examples/txt/.svn/text-base/poznan-pl.txt.svn-base new file mode 100755 index 0000000..7f478dd --- /dev/null +++ b/examples/txt/.svn/text-base/poznan-pl.txt.svn-base @@ -0,0 +1,11 @@ +Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. +Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. Jego powierzchnia wynosi 285 ha. Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. +Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. Wędkować można zarówno z brzegu, jak i łodzi. Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. +Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. +Jezioro Malta jest zbiornikiem sztucznym. Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. +Jezioro Rusałka jest sztucznym zbiornikiem wodnym. Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. Akwen zajmuje powierzchnię 36,7 ha. Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. Długość linii brzegowej wynosi 3300 m. +Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. +Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. Ośrodek może przyjąć ok. 10 tys.osób. +Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. Powierzchnia akwenu wynosi 34,9 ha. Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. +Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. Jezioro zaliczane jest do typu sielawowego. Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. +W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. diff --git a/examples/txt/.svn/text-base/poznan-small-de.txt.svn-base b/examples/txt/.svn/text-base/poznan-small-de.txt.svn-base new file mode 100755 index 0000000..025df80 --- /dev/null +++ b/examples/txt/.svn/text-base/poznan-small-de.txt.svn-base @@ -0,0 +1,3 @@ +Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. Angeln kann man sowohl vom Ufer, als auch vom Boot aus. Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. +Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. +Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. Das Stauwehr befindet sich am westlichen Ende des Sees, unweit des Kreisverkehrs Śródka. Der Malta - See ist eine bekannte Regattastrecke; zu Beginn der 90er Jahre entstand an seinen Ufern ein ganzer Komplex von Sport - und Erholungsobjekten. Am westlichen Teil des Nordufers ist das Wohnviertel Komandoria gelegen. \ No newline at end of file diff --git a/examples/txt/.svn/text-base/poznan-small-pl.txt.svn-base b/examples/txt/.svn/text-base/poznan-small-pl.txt.svn-base new file mode 100755 index 0000000..11b560d --- /dev/null +++ b/examples/txt/.svn/text-base/poznan-small-pl.txt.svn-base @@ -0,0 +1,3 @@ +Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. Wędkować można zarówno z brzegu, jak i łodzi. Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. +Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. +Jezioro Malta jest zbiornikiem sztucznym. Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. W latach 1980-1990 niecka zbiornika i jego otoczenie zostało gruntownie zmodernizowane. Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. \ No newline at end of file diff --git a/examples/txt/.svn/text-base/stallman-ch1-en.txt.svn-base b/examples/txt/.svn/text-base/stallman-ch1-en.txt.svn-base new file mode 100755 index 0000000..e70ea7e --- /dev/null +++ b/examples/txt/.svn/text-base/stallman-ch1-en.txt.svn-base @@ -0,0 +1,99 @@ +Chapter 1 +For Want of a Printer + +I fear the Greeks. Even when they bring gifts. +---Virgil +The Aeneid + +The new printer was jammed, again. + +Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. Upon arrival, he found only four pages in the printer's tray. To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + +Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. Still, the difference between waiting for a machine and waiting on a machine is a sizable one. It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + +Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + +How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? Stallman wondered. The machine had been a donation from the Xerox Corporation. A cutting edge prototype, it was a modified version of the popular Xerox photocopier. Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + +Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. The results had been immediately pleasing. Unlike the lab's old laser printer, the new Xerox machine was fast. Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. The new machine was also more precise. Circles came out looking like circles, not ovals. Straight lines came out looking like straight lines, not low-amplitude sine waves. + +It was, for all intents and purposes, a gift too good to refuse. + +It wasn't until a few weeks after its arrival that the machine's flaws began to surface. Chief among the drawbacks was the machine's inherent susceptibility to paper jams. Engineering-minded programmers quickly understood the reason behind the flaw. As a photocopier, the machine generally required the direct oversight of a human operator. Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. In engineering terms, user diligence was built into the system. + +In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + +Stallman himself had been of the first to identify the problem and the first to suggest a remedy. Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + +As fixes go, Stallman's was oblique but elegant. It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + +"If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. Of those two or three people, one of them, at least, would usually know how to fix the problem." + +Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. Improving a program was the true test of a hacker's skills.1 + +Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + +It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. He simply looked for a way to update the old fix or " hack" for the new system. In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. Xerox, in this instance, had provided software files in precompiled, or binary, form. Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + +Although Stallman knew plenty about computers, he was not an expert in translating binary files. As a hacker, however, he had other resources at his disposal. The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + +After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + +Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. He then rewrote the source code to make it more suitable for the AI Lab's operating system. With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + +From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + +"A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. New things would get added on. But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + +Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. Why not share it out of a simple desire for good karma? + +The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + +When the desired files failed to surface, however, Stallman began to grow suspicious. The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + +For Reid, the deal was a win-win. Scribe didn't fall into the public domain, and Unilogic recouped on its investment. For Stallman, it was a betrayal of the programmer ethos, pure and simple. Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + +As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + +Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + +He didn't have to wait long. Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. During that visit, he made sure to stop by the computer-science department. Department employees directed him to the office of the faculty member leading the Xerox project. When Stallman reached the office, he found the professor working there. + +In true engineer-to-engineer fashion, the conversation was cordial but blunt. After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. To his surprise, the professor refused to grant his request. + +"He told me that he had promised not to give me a copy," Stallman says. + +Memory is a funny thing. Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + +"The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + +When asked directly about the request, however, Sproull draws a blank. "I can't make a factual comment," writes Sproull via email. "I have absolutely no recollection of the incident." + +With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. "They would have been insane to give away the source code." + +For Stallman, however, the NDA was something else entirely. It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + +For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. At first, all he could focus on was the personal nature of the refusal. As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. So I just turned away and walked out without another word," Stallman recalls. "I might have slammed the door. Who knows? All I remember is wanting to get out of there." + +Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + +"It encouraged me to think about something that I'd already been thinking about," says Stallman. "I already had an idea that software should be shared, but I wasn't sure how to think about that. My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + +Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + +Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. From the viewpoint of the entire software industry, the printer was a wake-up call. Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. From Stallman's viewpoint, the printer was a Trojan Horse. After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. It had come disguised as a gift. + +That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + +"It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. "In this case I was the victim. [My lab and I] were victims." + +It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. Sooner or later, they reasoned, the software would become public knowledge. In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. For Stallman, however, it was the first step down a slippery slope. + +"When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + +As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + +Hence the importance of the laser printer and the encounter that resulted from it. Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. There would have been no sense of clarity, no urgency to address a problem others weren't addressing. Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + +"From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. "I decided never to make other people victims just like I had been a victim." + diff --git a/examples/txt/.svn/text-base/stallman-ch1-pl.txt.svn-base b/examples/txt/.svn/text-base/stallman-ch1-pl.txt.svn-base new file mode 100755 index 0000000..8b314fe --- /dev/null +++ b/examples/txt/.svn/text-base/stallman-ch1-pl.txt.svn-base @@ -0,0 +1,97 @@ +Rozdział 1. +Gdy potrzebna drukarka + +Obawiam się Greków, nawet gdy przynoszą dary +- Wergiliusz +Eneida + +Nowa drukarka znowu się zacięła. + +Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + +Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + +Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + +Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. Urządzenie było darem Xerox Corporation. Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + +Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. Natychmiast osiągnięto zadawalające rezultaty. Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + +Był to ze pod każdym względem dar, który należało docenić. + +Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. W ich założeniach czujna obecność użytkownika było częścią systemu. + +Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + +Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + +Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + +"Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + +Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + +Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + +Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + +Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. Jednakże jako haker miał do dyspozycji inne źródła informacji. Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + +Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + +Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + +W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + +"Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + +Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + +Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + +Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. Był to zwiastun HTML-a, lingua franca Word Wide Web. W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + +Dla Reida była to procedura doskonała. Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. Natomiast dla Stallmana była to oczywista zdrada etosu programisty. Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + +Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + +Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + +Nie musiał długo czekać. W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + +Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + +"Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + +Pamięć jest ciekawą rzeczą. Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + +"Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. - "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + +Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + +Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + +Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + +Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. Na początku uznał odmowę za skierowaną przeciwko sobie. Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. Być może nawet trzasnąłem drzwiami. Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + +Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + +"Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + +Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + +Teraz nowa drukarka stała się oznaką zmian, które nastały. Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. Z punktu widzenia Stallmana drukarka była koniem trojańskim. W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. Pojawiło się w postaci daru. + +Stallman musiał przełknąć dwie gorzkie pigułki. Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + +"Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + +Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. Dla Stallmana był to początek staczania się po równi pochyłej. + +"Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + +Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + +"Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + diff --git a/examples/txt/.svn/text-base/stallman-en.txt.svn-base b/examples/txt/.svn/text-base/stallman-en.txt.svn-base new file mode 100755 index 0000000..9f8019c --- /dev/null +++ b/examples/txt/.svn/text-base/stallman-en.txt.svn-base @@ -0,0 +1,1838 @@ +Acknowledgments +Special thanks to Henning Gutmann for sticking by this book. Special thanks to Aaron Oas for suggesting the idea to Tracy in the first place. Thanks to Laurie Petrycki, Jeffrey Holcomb, and all the others at O'Reilly & Associates. Thanks to Tim O'Reilly for backing this book. Thanks to all the first-draft reviewers: Bruce Perens, Eric Raymond, Eric Allman, Jon Orwant, Julie and Gerald Jay Sussman, Hal Abelson, and Guy Steele. I hope you enjoy this typo-free version. Thanks to Alice Lippman for the interviews, cookies, and photographs. Thanks to my family, Steve, Jane, Tish, and Dave. And finally, last but not least: thanks to Richard Stallman for having the guts and endurance to "show us the code." + +Sam Williams + + +Preface +The work of Richard M. Stallman literally speaks for itself. From the documented source code to the published papers to the recorded speeches, few people have expressed as much willingness to lay their thoughts and their work on the line. + +Such openness-if one can pardon a momentary un-Stallman adjective-is refreshing. After all, we live in a society that treats information, especially personal information, as a valuable commodity. The question quickly arises. Why would anybody want to part with so much information and yet appear to demand nothing in return? + +As we shall see in later chapters, Stallman does not part with his words or his work altruistically. Every program, speech, and on-the-record bon mot comes with a price, albeit not the kind of price most people are used to paying. + +I bring this up not as a warning, but as an admission. As a person who has spent the last year digging up facts on Stallman's personal history, it's more than a little intimidating going up against the Stallman oeuvre. "Never pick a fight with a man who buys his ink by the barrel," goes the old Mark Twain adage. In the case of Stallman, never attempt the definitive biography of a man who trusts his every thought to the public record. + +For the readers who have decided to trust a few hours of their time to exploring this book, I can confidently state that there are facts and quotes in here that one won't find in any Slashdot story or Google search. Gaining access to these facts involves paying a price, however. In the case of the book version, you can pay for these facts the traditional manner, i.e., by purchasing the book. In the case of the electronic versions, you can pay for these facts in the free software manner. Thanks to the folks at O'Reilly & Associates, this book is being distributed under the GNU Free Documentation License, meaning you can help to improve the work or create a personalized version and release that version under the same license. + +If you are reading an electronic version and prefer to accept the latter payment option, that is, if you want to improve or expand this book for future readers, I welcome your input. Starting in June, 2002, I will be publishing a bare bones HTML version of the book on the web site, http://www.faifzilla.org. My aim is to update it regularly and expand the Free as in Freedom story as events warrant. If you choose to take the latter course, please review Appendix C of this book. It provides a copy of your rights under the GNU Free Documentation License. + +For those who just plan to sit back and read, online or elsewhere, I consider your attention an equally valuable form of payment. Don't be surprised, though, if you, too, find yourself looking for other ways to reward the good will that made this work possible. + +One final note: this is a work of journalism, but it is also a work of technical documentation. In the process of writing and editing this book, the editors and I have weighed the comments and factual input of various participants in the story, including Richard Stallman himself. We realize there are many technical details in this story that may benefit from additional or refined information. As this book is released under the GFDL, we are accepting patches just like we would with any free software program. Accepted changes will be posted electronically and will eventually be incorporated into future printed versions of this work. If you would like to contribute to the further improvement of this book, you can reach me at sam@inow.com. +Comments and Questions +Please address comments and questions concerning this book to the publisher: + + O'Reilly & Associates, Inc. + 1005 Gravenstein Highway North + Sebastopol, CA 95472 + (800) 998-9938 (in the United States or Canada) + (707) 829-0515 (international/local) + (707) 829-0104 (fax) + +There is a web page for this book, which lists errata, examples, or any additional information. The site also includes a link to a forum where you can discuss the book with the author and other readers. You can access this site at: + + http://www.oreilly.com/catalog/freedom/ + +To comment or ask technical questions about this book, send email to: + + bookquestions@oreilly.com + +For more information about books, conferences, Resource Centers, and the O'Reilly Network, see the O'Reilly web site at: + + http://www.oreilly.com + + +Chapter 1 +For Want of a Printer + +I fear the Greeks. Even when they bring gifts. +---Virgil +The Aeneid + +The new printer was jammed, again. + +Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. Upon arrival, he found only four pages in the printer's tray. To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + +Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. Still, the difference between waiting for a machine and waiting on a machine is a sizable one. It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + +Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + +How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? Stallman wondered. The machine had been a donation from the Xerox Corporation. A cutting edge prototype, it was a modified version of the popular Xerox photocopier. Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + +Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. The results had been immediately pleasing. Unlike the lab's old laser printer, the new Xerox machine was fast. Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. The new machine was also more precise. Circles came out looking like circles, not ovals. Straight lines came out looking like straight lines, not low-amplitude sine waves. + +It was, for all intents and purposes, a gift too good to refuse. + +It wasn't until a few weeks after its arrival that the machine's flaws began to surface. Chief among the drawbacks was the machine's inherent susceptibility to paper jams. Engineering-minded programmers quickly understood the reason behind the flaw. As a photocopier, the machine generally required the direct oversight of a human operator. Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. In engineering terms, user diligence was built into the system. + +In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + +Stallman himself had been of the first to identify the problem and the first to suggest a remedy. Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + +As fixes go, Stallman's was oblique but elegant. It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + +"If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. Of those two or three people, one of them, at least, would usually know how to fix the problem." + +Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. Improving a program was the true test of a hacker's skills.1 + +Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + +It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. He simply looked for a way to update the old fix or " hack" for the new system. In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. Xerox, in this instance, had provided software files in precompiled, or binary, form. Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + +Although Stallman knew plenty about computers, he was not an expert in translating binary files. As a hacker, however, he had other resources at his disposal. The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + +After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + +Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. He then rewrote the source code to make it more suitable for the AI Lab's operating system. With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + +From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + +"A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. New things would get added on. But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + +Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. Why not share it out of a simple desire for good karma? + +The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + +When the desired files failed to surface, however, Stallman began to grow suspicious. The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + +For Reid, the deal was a win-win. Scribe didn't fall into the public domain, and Unilogic recouped on its investment. For Stallman, it was a betrayal of the programmer ethos, pure and simple. Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + +As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + +Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + +He didn't have to wait long. Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. During that visit, he made sure to stop by the computer-science department. Department employees directed him to the office of the faculty member leading the Xerox project. When Stallman reached the office, he found the professor working there. + +In true engineer-to-engineer fashion, the conversation was cordial but blunt. After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. To his surprise, the professor refused to grant his request. + +"He told me that he had promised not to give me a copy," Stallman says. + +Memory is a funny thing. Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + +"The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + +When asked directly about the request, however, Sproull draws a blank. "I can't make a factual comment," writes Sproull via email. "I have absolutely no recollection of the incident." + +With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. "They would have been insane to give away the source code." + +For Stallman, however, the NDA was something else entirely. It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + +For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. At first, all he could focus on was the personal nature of the refusal. As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. So I just turned away and walked out without another word," Stallman recalls. "I might have slammed the door. Who knows? All I remember is wanting to get out of there." + +Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + +"It encouraged me to think about something that I'd already been thinking about," says Stallman. "I already had an idea that software should be shared, but I wasn't sure how to think about that. My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + +Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + +Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. From the viewpoint of the entire software industry, the printer was a wake-up call. Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. From Stallman's viewpoint, the printer was a Trojan Horse. After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. It had come disguised as a gift. + +That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + +"It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. "In this case I was the victim. [My lab and I] were victims." + +It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. Sooner or later, they reasoned, the software would become public knowledge. In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. For Stallman, however, it was the first step down a slippery slope. + +"When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + +As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + +Hence the importance of the laser printer and the encounter that resulted from it. Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. There would have been no sense of clarity, no urgency to address a problem others weren't addressing. Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + +"From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. "I decided never to make other people victims just like I had been a victim." + + +Chapter 2 +2001: A Hacker's Odyssey +The New York University computer-science department sits inside Warren Weaver Hall, a fortress-like building located two blocks east of Washington Square Park. Industrial-strength air-conditioning vents create a surrounding moat of hot air, discouraging loiterers and solicitors alike. Visitors who breach the moat encounter another formidable barrier, a security check-in counter immediately inside the building's single entryway. + +Beyond the security checkpoint, the atmosphere relaxes somewhat. Still, numerous signs scattered throughout the first floor preach the dangers of unsecured doors and propped-open fire exits. Taken as a whole, the signs offer a reminder: even in the relatively tranquil confines of pre-September 11, 2001, New York, one can never be too careful or too suspicious. + +The signs offer an interesting thematic counterpoint to the growing number of visitors gathering in the hall's interior atrium. A few look like NYU students. Most look like shaggy-aired concert-goers milling outside a music hall in anticipation of the main act. For one brief morning, the masses have taken over Warren Weaver Hall, leaving the nearby security attendant with nothing better to do but watch Ricki Lake on TV and shrug her shoulders toward the nearby auditorium whenever visitors ask about "the speech." + +Once inside the auditorium, a visitor finds the person who has forced this temporary shutdown of building security procedures. The person is Richard M. Stallman, founder of the GNU Project, original president of the Free Software Foundation, winner of the 1990 MacArthur Fellowship, winner of the Association of Computing Machinery's Grace Murray Hopper Award (also in 1990), corecipient of the Takeda Foundation's 2001 Takeda Award, and former AI Lab hacker. As announced over a host of hacker-related web sites, including the GNU Project's own http://www.gnu.org site, Stallman is in Manhattan, his former hometown, to deliver a much anticipated speech in rebuttal to the Microsoft Corporation's recent campaign against the GNU General Public License. + +The subject of Stallman's speech is the history and future of the free software movement. The location is significant. Less than a month before, Microsoft senior vice president Craig Mundie appeared at the nearby NYU Stern School of Business, delivering a speech blasting the General Public License, or GPL, a legal device originally conceived by Stallman 16 years before. Built to counteract the growing wave of software secrecy overtaking the computer industry-a wave first noticed by Stallman during his 1980 troubles with the Xerox laser printer-the GPL has evolved into a central tool of the free software community. In simplest terms, the GPL locks software programs into a form of communal ownership-what today's legal scholars now call the "digital commons"-through the legal weight of copyright. Once locked, programs remain unremovable. Derivative versions must carry the same copyright protection-even derivative versions that bear only a small snippet of the original source code. For this reason, some within the software industry have taken to calling the GPL a "viral" license, because it spreads itself to every software program it touches.1 + +In an information economy increasingly dependent on software and increasingly beholden to software standards, the GPL has become the proverbial "big stick." Even companies that once laughed it off as software socialism have come around to recognize the benefits. Linux, the Unix-like kernel developed by Finnish college student Linus Torvalds in 1991, is licensed under the GPL, as are many of the world's most popular programming tools: GNU Emacs, the GNU Debugger, the GNU C Compiler, etc. Together, these tools form the components of a free software operating system developed, nurtured, and owned by the worldwide hacker community. Instead of viewing this community as a threat, high-tech companies like IBM, Hewlett Packard, and Sun Microsystems have come to rely upon it, selling software applications and services built to ride atop the ever-growing free software infrastructure. + +They've also come to rely upon it as a strategic weapon in the hacker community's perennial war against Microsoft, the Redmond, Washington-based company that, for better or worse, has dominated the PC-software marketplace since the late 1980s. As owner of the popular Windows operating system, Microsoft stands to lose the most in an industry-wide shift to the GPL license. Almost every line of source code in the Windows colossus is protected by copyrights reaffirming the private nature of the underlying source code or, at the very least, reaffirming Microsoft's legal ability to treat it as such. From the Microsoft viewpoint, incorporating programs protected by the "viral" GPL into the Windows colossus would be the software equivalent of Superman downing a bottle of Kryptonite pills. Rival companies could suddenly copy, modify, and sell improved versions of Windows, rendering the company's indomitable position as the No. 1 provider of consumer-oriented software instantly vulnerable. Hence the company's growing concern over the GPL's rate of adoption. Hence the recent Mundie speech blasting the GPL and the " open source" approach to software development and sales. And hence Stallman's decision to deliver a public rebuttal to that speech on the same campus here today. + +20 years is a long time in the software industry. Consider this: in 1980, when Richard Stallman was cursing the AI Lab's Xerox laser printer, Microsoft, the company modern hackers view as the most powerful force in the worldwide software industry, was still a privately held startup. IBM, the company hackers used to regard as the most powerful force in the worldwide software industry, had yet to to introduce its first personal computer, thereby igniting the current low-cost PC market. Many of the technologies we now take for granted-the World Wide Web, satellite television, 32-bit video-game consoles-didn't even exist. The same goes for many of the companies that now fill the upper echelons of the corporate establishment, companies like AOL, Sun Microsystems, Amazon.com, Compaq, and Dell. The list goes on and on. + +The fact that the high-technology marketplace has come so far in such little time is fuel for both sides of the GPL debate. GPL-proponents point to the short lifespan of most computer hardware platforms. Facing the risk of buying an obsolete product, consumers tend to flock to companies with the best long-term survival. As a result, the software marketplace has become a winner-take-all arena.2 The current, privately owned software environment, GPL-proponents say, leads to monopoly abuse and stagnation. Strong companies suck all the oxygen out of the marketplace for rival competitors and innovative startups. + +GPL-opponents argue just the opposite. Selling software is just as risky, if not more risky, than buying software, they say. Without the legal guarantees provided by private software licenses, not to mention the economic prospects of a privately owned "killer app" (i.e., a breakthrough technology that launches an entirely new market),3 companies lose the incentive to participate. Once again, the market stagnates and innovation declines. As Mundie himself noted in his May 3 address on the same campus, the GPL's "viral" nature "poses a threat" to any company that relies on the uniqueness of its software as a competitive asset. Added Mundie: + + It also fundamentally undermines the independent commercial software sector because it effectively makes it impossible to distribute software on a basis where recipients pay for the product rather than just the cost of distribution.4 + +The mutual success of GNU/ Linux, the amalgamated operating system built around the GPL-protected Linux kernel, and Windows over the last 10 years reveals the wisdom of both perspectives. Nevertheless, the battle for momentum is an important one in the software industry. Even powerful vendors such as Microsoft rely on the support of third-party software developers whose tools, programs, and computer games make an underlying software platform such as Windows more attractive to the mainstream consumer. Citing the rapid evolution of the technology marketplace over the last 20 years, not to mention his own company's admirable track record during that period, Mundie advised listeners to not get too carried away by the free software movement's recent momentum: + + Two decades of experience have shown that an economic model that protects intellectual property and a business model that recoups research and development costs can create impressive economic benefits and distribute them very broadly.4 + +Such admonitions serve as the backdrop for Stallman's speech today. Less than a month after their utterance, Stallman stands with his back to one of the chalk boards at the front of the room, edgy to begin. + +If the last two decades have brought dramatic changes to the software marketplace, they have brought even more dramatic changes to Stallman himself. Gone is the skinny, clean-shaven hacker who once spent his entire days communing with his beloved PDP-10. In his place stands a heavy-set middle-aged man with long hair and rabbinical beard, a man who now spends the bulk of his time writing and answering email, haranguing fellow programmers, and giving speeches like the one today. Dressed in an aqua-colored T-shirt and brown polyester pants, Stallman looks like a desert hermit who just stepped out of a Salvation Army dressing room. + +The crowd is filled with visitors who share Stallman's fashion and grooming tastes. Many come bearing laptop computers and cellular modems, all the better to record and transmit Stallman's words to a waiting Internet audience. The gender ratio is roughly 15 males to 1 female, and 1 of the 7 or 8 females in the room comes in bearing a stuffed penguin, the official Linux mascot, while another carries a stuffed teddy bear. + + +Richard Stallman, circa 2000. "I decided I would develop a free software operating system or die trying . . . of old age of course." Photo courtesy of http://www.stallman.org. + +Agitated, Stallman leaves his post at the front of the room and takes a seat in a front-row chair, tapping a few commands into an already-opened laptop. For the next 10 minutes Stallman is oblivious to the growing number of students, professors, and fans circulating in front of him at the foot of the auditorium stage. + +Before the speech can begin, the baroque rituals of academic formality must be observed. Stallman's appearance merits not one but two introductions. Mike Uretsky, codirector of the Stern School's Center for Advanced Technology, provides the first. + +"The role of a university is to foster debate and to have interesting discussions," Uretsky says. "This particular presentation, this seminar falls right into that mold. I find the discussion of open source particularly interesting." + +Before Uretsky can get another sentence out, Stallman is on his feet waving him down like a stranded motorist. + +"I do free software," Stallman says to rising laughter. "Open source is a different movement." + +The laughter gives way to applause. The room is stocked with Stallman partisans, people who know of his reputation for verbal exactitude, not to mention his much publicized 1998 falling out with the open source software proponents. Most have come to anticipate such outbursts the same way radio fans once waited for Jack Benny's trademark, "Now cut that out!" phrase during each radio program. + +Uretsky hastily finishes his introduction and cedes the stage to Edmond Schonberg, a professor in the NYU computer-science department. As a computer programmer and GNU Project contributor, Schonberg knows which linguistic land mines to avoid. He deftly summarizes Stallman's career from the perspective of a modern-day programmer. + +"Richard is the perfect example of somebody who, by acting locally, started thinking globally [about] problems concerning the unavailability of source code," says Schonberg. "He has developed a coherent philosophy that has forced all of us to reexamine our ideas of how software is produced, of what intellectual property means, and of what the software community actually represents." + +Schonberg welcomes Stallman to more applause. Stallman takes a moment to shut off his laptop, rises out of his chair, and takes the stage. + +At first, Stallman's address seems more Catskills comedy routine than political speech. "I'd like to thank Microsoft for providing me the opportunity to be on this platform," Stallman wisecracks. "For the past few weeks, I have felt like an author whose book was fortuitously banned somewhere." + +For the uninitiated, Stallman dives into a quick free software warm-up analogy. He likens a software program to a cooking recipe. Both provide useful step-by-step instructions on how to complete a desired task and can be easily modified if a user has special desires or circumstances. "You don't have to follow a recipe exactly," Stallman notes. "You can leave out some ingredients. Add some mushrooms, 'cause you like mushrooms. Put in less salt because your doctor said you should cut down on salt-whatever." + +Most importantly, Stallman says, software programs and recipes are both easy to share. In giving a recipe to a dinner guest, a cook loses little more than time and the cost of the paper the recipe was written on. Software programs require even less, usually a few mouse-clicks and a modicum of electricity. In both instances, however, the person giving the information gains two things: increased friendship and the ability to borrow interesting recipes in return. + +"Imagine what it would be like if recipes were packaged inside black boxes," Stallman says, shifting gears. "You couldn't see what ingredients they're using, let alone change them, and imagine if you made a copy for a friend. They would call you a pirate and try to put you in prison for years. That world would create tremendous outrage from all the people who are used to sharing recipes. But that is exactly what the world of proprietary software is like. A world in which common decency towards other people is prohibited or prevented." + +With this introductory analogy out of the way, Stallman launches into a retelling of the Xerox laser-printer episode. Like the recipe analogy, the laser-printer story is a useful rhetorical device. With its parable-like structure, it dramatizes just how quickly things can change in the software world. Drawing listeners back to an era before Amazon.com one-click shopping, Microsoft Windows, and Oracle databases, it asks the listener to examine the notion of software ownership free of its current corporate logos. + +Stallman delivers the story with all the polish and practice of a local district attorney conducting a closing argument. When he gets to the part about the Carnegie Mellon professor refusing to lend him a copy of the printer source code, Stallman pauses. + +"He had betrayed us," Stallman says. "But he didn't just do it to us. Chances are he did it to you." + +On the word "you," Stallman points his index finger accusingly at an unsuspecting member of the audience. The targeted audience member's eyebrows flinch slightly, but Stallman's own eyes have moved on. Slowly and deliberately, Stallman picks out a second listener to nervous titters from the crowd. "And I think, mostly likely, he did it to you, too," he says, pointing at an audience member three rows behind the first. + +By the time Stallman has a third audience member picked out, the titters have given away to general laughter. The gesture seems a bit staged, because it is. Still, when it comes time to wrap up the Xerox laser-printer story, Stallman does so with a showman's flourish. "He probably did it to most of the people here in this room-except a few, maybe, who weren't born yet in 1980," Stallman says, drawing more laughs. "[That's] because he had promised to refuse to cooperate with just about the entire population of the planet Earth." + +Stallman lets the comment sink in for a half-beat. "He had signed a nondisclosure agreement," Stallman adds. + +Richard Matthew Stallman's rise from frustrated academic to political leader over the last 20 years speaks to many things. It speaks to Stallman's stubborn nature and prodigious will. It speaks to the clearly articulated vision and values of the free software movement Stallman helped build. It speaks to the high-quality software programs Stallman has built, programs that have cemented Stallman's reputation as a programming legend. It speaks to the growing momentum of the GPL, a legal innovation that many Stallman observers see as his most momentous accomplishment. + +Most importantly, it speaks to the changing nature of political power in a world increasingly beholden to computer technology and the software programs that power that technology. + +Maybe that's why, even at a time when most high-technology stars are on the wane, Stallman's star has grown. Since launching the GNU Project in 1984,5 Stallman has been at turns ignored, satirized, vilified, and attacked-both from within and without the free software movement. Through it all, the GNU Project has managed to meet its milestones, albeit with a few notorious delays, and stay relevant in a software marketplace several orders of magnitude more complex than the one it entered 18 years ago. So too has the free software ideology, an ideology meticulously groomed by Stallman himself. + +To understand the reasons behind this currency, it helps to examine Richard Stallman both in his own words and in the words of the people who have collaborated and battled with him along the way. The Richard Stallman character sketch is not a complicated one. If any person exemplifies the old adage "what you see is what you get," it's Stallman. + +"I think if you want to understand Richard Stallman the human being, you really need to see all of the parts as a consistent whole," advises Eben Moglen, legal counsel to the Free Software Foundation and professor of law at Columbia University Law School. "All those personal eccentricities that lots of people see as obstacles to getting to know Stallman really are Stallman: Richard's strong sense of personal frustration, his enormous sense of principled ethical commitment, his inability to compromise, especially on issues he considers fundamental. These are all the very reasons Richard did what he did when he did." + +Explaining how a journey that started with a laser printer would eventually lead to a sparring match with the world's richest corporation is no easy task. It requires a thoughtful examination of the forces that have made software ownership so important in today's society. It also requires a thoughtful examination of a man who, like many political leaders before him, understands the malleability of human memory. It requires an ability to interpret the myths and politically laden code words that have built up around Stallman over time. Finally, it requires an understanding of Stallman's genius as a programmer and his failures and successes in translating that genius to other pursuits. + +When it comes to offering his own summary of the journey, Stallman acknowledges the fusion of personality and principle observed by Moglen. "Stubbornness is my strong suit," he says. "Most people who attempt to do anything of any great difficulty eventually get discouraged and give up. I never gave up." + +He also credits blind chance. Had it not been for that run-in over the Xerox laser printer, had it not been for the personal and political conflicts that closed out his career as an MIT employee, had it not been for a half dozen other timely factors, Stallman finds it very easy to picture his life following a different career path. That being said, Stallman gives thanks to the forces and circumstances that put him in the position to make a difference. + +"I had just the right skills," says Stallman, summing up his decision for launching the GNU Project to the audience. "Nobody was there but me, so I felt like, `I'm elected. I have to work on this. If not me , who?'" + + +Chapter 3 +A Portrait of the Hacker as a Young Man +Richard Stallman's mother, Alice Lippman, still remembers the moment she realized her son had a special gift. + +"I think it was when he was eight," Lippman recalls. + +The year was 1961, and Lippman, a recently divorced single mother, was wiling away a weekend afternoon within the family's tiny one-bedroom apartment on Manhattan's Upper West Side. Leafing through a copy of Scientific American, Lippman came upon her favorite section, the Martin Gardner-authored column titled "Mathematical Games." A substitute art teacher, Lippman always enjoyed Gardner's column for the brain-teasers it provided. With her son already ensconced in a book on the nearby sofa, Lippman decided to take a crack at solving the week's feature puzzle. + +"I wasn't the best person when it came to solving the puzzles," she admits. "But as an artist, I found they really helped me work through conceptual barriers." + +Lippman says her attempt to solve the puzzle met an immediate brick wall. About to throw the magazine down in disgust, Lippman was surprised by a gentle tug on her shirt sleeve. + +"It was Richard," she recalls, "He wanted to know if I needed any help." + +Looking back and forth, between the puzzle and her son, Lippman says she initially regarded the offer with skepticism. "I asked Richard if he'd read the magazine," she says. "He told me that, yes, he had and what's more he'd already solved the puzzle. The next thing I know, he starts explaining to me how to solve it." + +Hearing the logic of her son's approach, Lippman's skepticism quickly gave way to incredulity. "I mean, I always knew he was a bright boy," she says, "but this was the first time I'd seen anything that suggested how advanced he really was." + +Thirty years after the fact, Lippman punctuates the memory with a laugh. "To tell you the truth, I don't think I ever figured out how to solve that puzzle," she says. "All I remember is being amazed he knew the answer." + +Seated at the dining-room table of her second Manhattan apartment-the same spacious three-bedroom complex she and her son moved to following her 1967 marriage to Maurice Lippman, now deceased-Alice Lippman exudes a Jewish mother's mixture of pride and bemusement when recalling her son's early years. The nearby dining-room credenza offers an eight-by-ten photo of Stallman glowering in full beard and doctoral robes. The image dwarfs accompanying photos of Lippman's nieces and nephews, but before a visitor can make too much of it, Lippman makes sure to balance its prominent placement with an ironic wisecrack. + +"Richard insisted I have it after he received his honorary doctorate at the University of Glasgow," says Lippman. "He said to me, `Guess what, mom? It's the first graduation I ever attended.'"1 + +Such comments reflect the sense of humor that comes with raising a child prodigy. Make no mistake, for every story Lippman hears and reads about her son's stubbornness and unusual behavior, she can deliver at least a dozen in return. + +"He used to be so conservative," she says, throwing up her hands in mock exasperation. "We used to have the worst arguments right here at this table. I was part of the first group of public city school teachers that struck to form a union, and Richard was very angry with me. He saw unions as corrupt. He was also very opposed to social security. He thought people could make much more money investing it on their own. Who knew that within 10 years he would become so idealistic? All I remember is his stepsister coming to me and saying, `What is he going to be when he grows up? A fascist?'" + +As a single parent for nearly a decade-she and Richard's father, Daniel Stallman, were married in 1948, divorced in 1958, and split custody of their son afterwards-Lippman can attest to her son's aversion to authority. She can also attest to her son's lust for knowledge. It was during the times when the two forces intertwined, Lippman says, that she and her son experienced their biggest battles. + +"It was like he never wanted to eat," says Lippman, recalling the behavior pattern that set in around age eight and didn't let up until her son's high-school graduation in 1970. "I'd call him for dinner, and he'd never hear me. I'd have to call him 9 or 10 times just to get his attention. He was totally immersed." + +Stallman, for his part, remembers things in a similar fashion, albeit with a political twist. + +"I enjoyed reading," he says. "If I wanted to read, and my mother told me to go to the kitchen and eat or go to sleep, I wasn't going to listen. I saw no reason why I couldn't read. No reason why she should be able to tell me what to do, period. Essentially, what I had read about, ideas such as democracy and individual freedom, I applied to myself. I didn't see any reason to exclude children from these principles." + +The belief in individual freedom over arbitrary authority extended to school as well. Two years ahead of his classmates by age 11, Stallman endured all the usual frustrations of a gifted public-school student. It wasn't long after the puzzle incident that his mother attended the first in what would become a long string of parent-teacher conferences. + +"He absolutely refused to write papers," says Lippman, recalling an early controversy. "I think the last paper he wrote before his senior year in high school was an essay on the history of the number system in the west for a fourth-grade teacher." + +Gifted in anything that required analytical thinking, Stallman gravitated toward math and science at the expense of his other studies. What some teachers saw as single-mindedness, however, Lippman saw as impatience. Math and science offered simply too much opportunity to learn, especially in comparison to subjects and pursuits for which her son seemed less naturally inclined. Around age 10 or 11, when the boys in Stallman's class began playing a regular game of touch football, she remembers her son coming home in a rage. "He wanted to play so badly, but he just didn't have the coordination skills," Lippman recalls. "It made him so angry." + +The anger eventually drove her son to focus on math and science all the more. Even in the realm of science, however, her son's impatience could be problematic. Poring through calculus textbooks by age seven, Stallman saw little need to dumb down his discourse for adults. Sometime, during his middle-school years, Lippman hired a student from nearby Columbia University to play big brother to her son. The student left the family's apartment after the first session and never came back. "I think what Richard was talking about went over his head," Lippman speculates. + +Another favorite maternal anecdote dates back to the early 1960s, shortly after the puzzle incident. Around age seven, two years after the divorce and relocation from Queens, Richard took up the hobby of launching model rockets in nearby Riverside Drive Park. What started as aimless fun soon took on an earnest edge as her son began recording the data from each launch. Like the interest in mathematical games, the pursuit drew little attention until one day, just before a major NASA launch, Lippman checked in on her son to see if he wanted to watch. + +"He was fuming," Lippman says. "All he could say to me was, `But I'm not published yet.' Apparently he had something that he really wanted to show NASA." + +Such anecdotes offer early evidence of the intensity that would become Stallman's chief trademark throughout life. When other kids came to the table, Stallman stayed in his room and read. When other kids played Johnny Unitas, Stallman played Werner von Braun. "I was weird," Stallman says, summing up his early years succinctly in a 1999 interview. "After a certain age, the only friends I had were teachers."1 + +Although it meant courting more run-ins at school, Lippman decided to indulge her son's passion. By age 12, Richard was attending science camps during the summer and private school during the school year. When a teacher recommended her son enroll in the Columbia Science Honors Program, a post-Sputnik program designed for gifted middle- and high-school students in New York City, Stallman added to his extracurriculars and was soon commuting uptown to the Columbia University campus on Saturdays. + +Dan Chess, a fellow classmate in the Columbia Science Honors Program, recalls Richard Stallman seeming a bit weird even among the students who shared a similar lust for math and science. "We were all geeks and nerds, but he was unusually poorly adjusted," recalls Chess, now a mathematics professor at Hunter College. "He was also smart as shit. I've known a lot of smart people, but I think he was the smartest person I've ever known." + +Seth Breidbart, a fellow Columbia Science Honors Program alumnus, offers bolstering testimony. A computer programmer who has kept in touch with Stallman thanks to a shared passion for science fiction and science-fiction conventions, he recalls the 15-year-old, buzz-cut-wearing Stallman as "scary," especially to a fellow 15-year-old. + +"It's hard to describe," Breidbart says. "It wasn't like he was unapproachable. He was just very intense. [He was] very knowledgeable but also very hardheaded in some ways." + +Such descriptions give rise to speculation: are judgment-laden adjectives like "intense" and "hardheaded" simply a way to describe traits that today might be categorized under juvenile behavioral disorder? A December, 2001, Wired magazine article titled "The Geek Syndrome" paints the portrait of several scientifically gifted children diagnosed with high-functioning autism or Asperger Syndrome. In many ways, the parental recollections recorded in the Wired article are eerily similar to the ones offered by Lippman. Even Stallman has indulged in psychiatric revisionism from time to time. During a 2000 profile for the Toronto Star, Stallman described himself to an interviewer as "borderline autistic,"2 a description that goes a long way toward explaining a lifelong tendency toward social and emotional isolation and the equally lifelong effort to overcome it. + +Such speculation benefits from the fast and loose nature of most so-called " behavioral disorders" nowadays, of course. As Steve Silberman, author of " The Geek Syndrome," notes, American psychiatrists have only recently come to accept Asperger Syndrome as a valid umbrella term covering a wide set of behavioral traits. The traits range from poor motor skills and poor socialization to high intelligence and an almost obsessive affinity for numbers, computers, and ordered systems.3 Reflecting on the broad nature of this umbrella, Stallman says its possible that, if born 40 years later, he might have merited just such a diagnosis. Then again, so would many of his computer-world colleagues. + +"It's possible I could have had something like that," he says. "On the other hand, one of the aspects of that syndrome is difficulty following rhythms. I can dance. In fact, I love following the most complicated rhythms. It's not clear cut enough to know." + +Chess, for one, rejects such attempts at back-diagnosis. "I never thought of him [as] having that sort of thing," he says. "He was just very unsocialized, but then, we all were." + +Lippman, on the other hand, entertains the possibility. She recalls a few stories from her son's infancy, however, that provide fodder for speculation. A prominent symptom of autism is an oversensitivity to noises and colors, and Lippman recalls two anecdotes that stand out in this regard. "When Richard was an infant, we'd take him to the beach," she says. "He would start screaming two or three blocks before we reached the surf. It wasn't until the third time that we figured out what was going on: the sound of the surf was hurting his ears." She also recalls a similar screaming reaction in relation to color: "My mother had bright red hair, and every time she'd stoop down to pick him up, he'd let out a wail." + +In recent years, Lippman says she has taken to reading books about autism and believes that such episodes were more than coincidental. "I do feel that Richard had some of the qualities of an autistic child," she says. "I regret that so little was known about autism back then." + +Over time, however, Lippman says her son learned to adjust. By age seven, she says, her son had become fond of standing at the front window of subway trains, mapping out and memorizing the labyrinthian system of railroad tracks underneath the city. It was a hobby that relied on an ability to accommodate the loud noises that accompanied each train ride. "Only the initial noise seemed to bother him," says Lippman. "It was as if he got shocked by the sound but his nerves learned how to make the adjustment." + +For the most part, Lippman recalls her son exhibiting the excitement, energy, and social skills of any normal boy. It wasn't until after a series of traumatic events battered the Stallman household, she says, that her son became introverted and emotionally distant. + +The first traumatic event was the divorce of Alice and Daniel Stallman, Richard's father. Although Lippman says both she and her ex-husband tried to prepare their son for the blow, she says the blow was devastating nonetheless. "He sort of didn't pay attention when we first told him what was happening," Lippman recalls. "But the reality smacked him in the face when he and I moved into a new apartment. The first thing he said was, `Where's Dad's furniture?'" + +For the next decade, Stallman would spend his weekdays at his mother's apartment in Manhattan and his weekends at his father's home in Queens. The shuttling back and forth gave him a chance to study a pair of contrasting parenting styles that, to this day, leaves Stallman firmly opposed to the idea of raising children himself. Speaking about his father, a World War II vet who passed away in early 2001, Stallman balances respect with anger. On one hand, there is the man whose moral commitment led him to learn French just so he could be more helpful to Allies when they'd finally come. On the other hand, there was the parent who always knew how to craft a put-down for cruel effect.4 + +"My father had a horrible temper," Stallman says. "He never screamed, but he always found a way to criticize you in a cold, designed-to-crush way." + +As for life in his mother's apartment, Stallman is less equivocal. "That was war," he says. "I used to say in my misery, `I want to go home,' meaning to the nonexistent place that I'll never have." + +For the first few years after the divorce, Stallman found the tranquility that eluded him in the home of his paternal grandparents. Then, around age 10 his grandparents passed away in short succession. For Stallman, the loss was devastating. "I used to go and visit and feel I was in a loving, gentle environment," Stallman recalls. "It was the only place I ever found one, until I went away to college." + +Lippman lists the death of Richard's paternal grandparents as the second traumatic event. "It really upset him," she says. He was very close to both his grandparents. Before they died, he was very outgoing, almost a leader-of-the-pack type with the other kids. After they died, he became much more emotionally withdrawn." + +From Stallman's perspective, the emotional withdrawal was merely an attempt to deal with the agony of adolescence. Labeling his teenage years a "pure horror," Stallman says he often felt like a deaf person amid a crowd of chattering music listeners. + +"I often had the feeling that I couldn't understand what other people were saying," says Stallman, recalling the emotional bubble that insulated him from the rest of the adolescent and adult world. "I could understand the words, but something was going on underneath the conversations that I didn't understand. I couldn't understand why people were interested in the things other people said." + +For all the agony it produced, adolescence would have a encouraging effect on Stallman's sense of individuality. At a time when most of his classmates were growing their hair out, Stallman preferred to keep his short. At a time when the whole teenage world was listening to rock and roll, Stallman preferred classical music. A devoted fan of science fiction, Mad magazine, and late-night TV, Stallman cultivated a distinctly off-the-wall personality that fed off the incomprehension of parents and peers alike. + +"Oh, the puns," says Lippman, still exasperated by the memory of her son's teenage personality. "There wasn't a thing you could say at the dinner table that he couldn't throw back at you as a pun." + +Outside the home, Stallman saved the jokes for the adults who tended to indulge his gifted nature. One of the first was a summer-camp counselor who handed Stallman a print-out manual for the IBM 7094 computer during his 12th year. To a preteenager fascinated with numbers and science, the gift was a godsend. 5 By the end of summer, Stallman was writing out paper programs according to the 7094's internal specifications, anxiously anticipating getting a chance to try them out on a real machine. + +With the first personal computer still a decade away, Stallman would be forced to wait a few years before getting access to his first computer. His first chance finally came during his junior year of high school. Hired on at the IBM New York Scientific Center, a now-defunct research facility in downtown Manhattan, Stallman spent the summer after high-school graduation writing his first program, a pre-processor for the 7094 written in the programming language PL/I. "I first wrote it in PL/I, then started over in assembler language when the PL/I program was too big to fit in the computer," he recalls. + +After that job at the IBM Scientific Center, Stallman had held a laboratory-assistant position in the biology department at Rockefeller University. Although he was already moving toward a career in math or physics, Stallman's analytical mind impressed the lab director enough that a few years after Stallman departed for college, Lippman received an unexpected phone call. "It was the professor at Rockefeller," Lippman says. "He wanted to know how Richard was doing. He was surprised to learn that he was working in computers. He'd always thought Richard had a great future ahead of him as a biologist." + +Stallman's analytical skills impressed faculty members at Columbia as well, even when Stallman himself became a target of their ire. "Typically once or twice an hour [Stallman] would catch some mistake in the lecture," says Breidbart. "And he was not shy about letting the professors know it immediately. It got him a lot of respect but not much popularity." + +Hearing Breidbart's anecdote retold elicits a wry smile from Stallman. "I may have been a bit of a jerk sometimes," he admits. "But I found kindred spirits among the teachers, because they, too, liked to learn. Kids, for the most part, didn't. At least not in the same way." + +Hanging out with the advanced kids on Saturday nevertheless encouraged Stallman to think more about the merits of increased socialization. With college fast approaching, Stallman, like many in his Columbia Science Honors Program, had narrowed his list of desired schools down to two choices: Harvard and MIT. Hearing of her son's desire to move on to the Ivy League, Lippman became concerned. As a 15-year-old high-school junior, Stallman was still having run-ins with teachers and administrators. Only the year before, he had pulled straight A's in American History, Chemistry, French, and Algebra, but a glaring F in English reflected the ongoing boycott of writing assignments. Such miscues might draw a knowing chuckle at MIT, but at Harvard, they were a red flag. + +During her son's junior year, Lippman says she scheduled an appointment with a therapist. The therapist expressed instant concern over Stallman's unwillingness to write papers and his run-ins with teachers. Her son certainly had the intellectual wherewithal to succeed at Harvard, but did he have the patience to sit through college classes that required a term paper? The therapist suggested a trial run. If Stallman could make it through a full year in New York City public schools, including an English class that required term papers, he could probably make it at Harvard. Following the completion of his junior year, Stallman promptly enrolled in summer school at Louis D. Brandeis High School, a public school located on 84th Street, and began making up the mandatory art classes he had shunned earlier in his high-school career. + +By fall, Stallman was back within the mainstream population of New York City high-school students. It wasn't easy sitting through classes that seemed remedial in comparison with his Saturday studies at Columbia, but Lippman recalls proudly her son's ability to toe the line. + +"He was forced to kowtow to a certain degree, but he did it," Lippman says. "I only got called in once, which was a bit of a miracle. It was the calculus teacher complaining that Richard was interrupting his lesson. I asked how he was interrupting. He said Richard was always accusing the teacher of using a false proof. I said, `Well, is he right?' The teacher said, `Yeah, but I can't tell that to the class. They wouldn't understand.'" + +By the end of his first semester at Brandeis, things were falling into place. A 96 in English wiped away much of the stigma of the 60 earned 2 years before. For good measure, Stallman backed it up with top marks in American History, Advanced Placement Calculus, and Microbiology. The crowning touch was a perfect 100 in Physics. Though still a social outcast, Stallman finished his 11 months at Brandeis as the fourth-ranked student in a class of 789. + + +Stallman's senior-year transcript at Louis D. Brandeis H.S., November, 1969. Note turnaround in English class performance. "He was forced to kowtow to a certain degree," says his mother, "but he did it." + +Outside the classroom, Stallman pursued his studies with even more diligence, rushing off to fulfill his laboratory-assistant duties at Rockefeller University during the week and dodging the Vietnam protesters on his way to Saturday school at Columbia. It was there, while the rest of the Science Honors Program students sat around discussing their college choices, that Stallman finally took a moment to participate in the preclass bull session. + +Recalls Breidbart, "Most of the students were going to Harvard and MIT, of course, but you had a few going to other Ivy League schools. As the conversation circled the room, it became apparent that Richard hadn't said anything yet. I don't know who it was, but somebody got up the courage to ask him what he planned to do." + +Thirty years later, Breidbart remembers the moment clearly. As soon as Stallman broke the news that he, too, would be attending Harvard University in the fall, an awkward silence filled the room. Almost as if on cue, the corners of Stallman's mouth slowly turned upward into a self-satisfied smile. + +Says Breidbart, "It was his silent way of saying, `That's right. You haven't got rid of me yet.'" + + +Chapter 4 +Impeach God +Although their relationship was fraught with tension, Richard Stallman would inherit one noteworthy trait from his mother: a passion for progressive politics. + +It was an inherited trait that would take several decades to emerge, however. For the first few years of his life, Stallman lived in what he now admits was a "political vacuum."1 Like most Americans during the Eisenhower age, the Stallman family spent the 50s trying to recapture the normalcy lost during the wartime years of the 1940s. + +"Richard's father and I were Democrats but happy enough to leave it at that," says Lippman, recalling the family's years in Queens. "We didn't get involved much in local or national politics." + +That all began to change, however, in the late 1950s when Alice divorced Daniel Stallman. The move back to Manhattan represented more than a change of address; it represented a new, independent identity and a jarring loss of tranquility. + +"I think my first taste of political activism came when I went to the Queens public library and discovered there was only a single book on divorce in the whole library," recalls Lippman. "It was very controlled by the Catholic church, at least in Elmhurst, where we lived. I think that was the first inkling I had of the forces that quietly control our lives." + +Returning to her childhood neighborhood, Manhattan's Upper West Side, Lippman was shocked by the changes that had taken place since her departure to Hunter College a decade and a half before. The skyrocketing demand for postwar housing had turned the neighborhood into a political battleground. On one side stood the pro-development city-hall politicians and businessmen hoping to rebuild many of the neighborhood's blocks to accommodate the growing number of white-collar workers moving into the city. On the other side stood the poor Irish and Puerto Rican tenants who had found an affordable haven in the neighborhood. + +At first, Lippman didn't know which side to choose. As a new resident, she felt the need for new housing. As a single mother with minimal income, however, she shared the poorer tenants' concern over the growing number of development projects catering mainly to wealthy residents. Indignant, Lippman began looking for ways to combat the political machine that was attempting to turn her neighborhood into a clone of the Upper East Side. + +Lippman says her first visit to the local Democratic party headquarters came in 1958. Looking for a day-care center to take care of her son while she worked, she had been appalled by the conditions encountered at one of the city-owned centers that catered to low-income residents. "All I remember is the stench of rotten milk, the dark hallways, the paucity of supplies. I had been a teacher in private nursery schools. The contrast was so great. We took one look at that room and left. That stirred me up." + +The visit to the party headquarters proved disappointing, however. Describing it as "the proverbial smoke-filled room," Lippman says she became aware for the first time that corruption within the party might actually be the reason behind the city's thinly disguised hostility toward poor residents. Instead of going back to the headquarters, Lippman decided to join up with one of the many clubs aimed at reforming the Democratic party and ousting the last vestiges of the Tammany Hall machine. Dubbed the Woodrow Wilson/FDR Reform Democratic Club, Lippman and her club began showing up at planning and city-council meetings, demanding a greater say. + +"Our primary goal was to fight Tammany Hall, Carmine DeSapio and his henchman,"2 says Lippman. "I was the representative to the city council and was very much involved in creating a viable urban-renewal plan that went beyond simply adding more luxury housing to the neighborhood." + +Such involvement would blossom into greater political activity during the 1960s. By 1965, Lippman had become an "outspoken" supporter for political candidates like William Fitts Ryan, a Democratic elected to Congress with the help of reform clubs and one of the first U.S. representatives to speak out against the Vietnam War. + +It wasn't long before Lippman, too, was an outspoken opponent of U.S. involvement in Indochina. "I was against the Vietnam war from the time Kennedy sent troops," she says. "I had read the stories by reporters and journalists sent to cover the early stages of the conflict. I really believed their forecast that it would become a quagmire." + +Such opposition permeated the Stallman-Lippman household. In 1967, Lippman remarried. Her new husband, Maurice Lippman, a major in the Air National Guard, resigned his commission to demonstrate his opposition to the war. Lippman's stepson, Andrew Lippman, was at MIT and temporarily eligible for a student deferment. Still, the threat of induction should that deferment disappear, as it eventually did, made the risk of U.S. escalation all the more immediate. Finally, there was Richard who, though younger, faced the prospect of choosing between Vietnam or Canada when the war lasted into the 1970s. + +"Vietnam was a major issue in our household," says Lippman. "We talked about it constantly: what would we do if the war continued, what steps Richard or his stepbrother would take if they got drafted. We were all opposed to the war and the draft. We really thought it was immoral." + +For Stallman, the Vietnam War elicited a complex mixture of emotions: confusion, horror, and, ultimately, a profound sense of political impotence. As a kid who could barely cope in the mild authoritarian universe of private school, Stallman experienced a shiver whenever the thought of Army boot camp presented itself. + +"I was devastated by the fear, but I couldn't imagine what to do and didn't have the guts to go demonstrate," recalls Stallman, whose March 18th birthday earned him a dreaded low number in the draft lottery when the federal government finally eliminated college deferments in 1971. "I couldn't envision moving to Canada or Sweden. The idea of getting up by myself and moving somewhere. How could I do that? I didn't know how to live by myself. I wasn't the kind of person who felt confident in approaching things like that." + +Stallman says he was both impressed and shamed by the family members who did speak out. Recalling a bumper sticker on his father's car likening the My Lai massacre to similar Nazi atrocities in World War II, he says he was "excited" by his father's gesture of outrage. "I admired him for doing it," Stallman says. "But I didn't imagine that I could do anything. I was afraid that the juggernaut of the draft was going to destroy me." + +Although descriptions of his own unwillingness to speak out carry a tinge of nostalgic regret, Stallman says he was ultimately turned off by the tone and direction of the anti-war movement. Like other members of the Science Honors Program, he saw the weekend demonstrations at Columbia as little more than a distracting spectacle.3 Ultimately, Stallman says, the irrational forces driving the anti-war movement became indistinguishable from the irrational forces driving the rest of youth culture. Instead of worshiping the Beatles, girls in Stallman's age group were suddenly worshiping firebrands like Abbie Hoffman and Jerry Rubin. To a kid already struggling to comprehend his teenage peers, escapist slogans like "make love not war" had a taunting quality. Not only was it a reminder that Stallman, the short-haired outsider who hated rock 'n' roll, detested drugs, and didn't participate in campus demonstrations, wasn't getting it politically; he wasn't "getting it" sexually either. + +"I didn't like the counter culture much," Stallman admits. "I didn't like the music. I didn't like the drugs. I was scared of the drugs. I especially didn't like the anti-intellectualism, and I didn't like the prejudice against technology. After all, I loved a computer. And I didn't like the mindless anti-Americanism that I often encountered. There were people whose thinking was so simplistic that if they disapproved of the conduct of the U.S. in the Vietnam War, they had to support the North Vietnamese. They couldn't imagine a more complicated position, I guess." + +Such comments alleviate feelings of timidity. They also underline a trait that would become the key to Stallman's own political maturation. For Stallman, political confidence was directly proportionate to personal confidence. By 1970, Stallman had become confident in few things outside the realm of math and science. Nevertheless, confidence in math gave him enough of a foundation to examine the anti-war movement in purely logical terms. In the process of doing so, Stallman had found the logic wanting. Although opposed to the war in Vietnam, Stallman saw no reason to disavow war as a means for defending liberty or correcting injustice. Rather than widen the breach between himself and his peers, however, Stallman elected to keep the analysis to himself. + +In 1970, Stallman left behind the nightly dinnertime conversations about politics and the Vietnam War as he departed for Harvard. Looking back, Stallman describes the transition from his mother's Manhattan apartment to life in a Cambridge dorm as an "escape." Peers who watched Stallman make the transition, however, saw little to suggest a liberating experience. + +"He seemed pretty miserable for the first while at Harvard," recalls Dan Chess, a classmate in the Science Honors Program who also matriculated at Harvard. "You could tell that human interaction was really difficult for him, and there was no way of avoiding it at Harvard. Harvard was an intensely social kind of place." + +To ease the transition, Stallman fell back on his strengths: math and science. Like most members of the Science Honors Program, Stallman breezed through the qualifying exam for Math 55, the legendary "boot camp" class for freshman mathematics "concentrators" at Harvard. Within the class, members of the Science Honors Program formed a durable unit. "We were the math mafia," says Chess with a laugh. "Harvard was nothing, at least compared with the SHP." + +To earn the right to boast, however, Stallman, Chess, and the other SHP alumni had to get through Math 55. Promising four years worth of math in two semesters, the course favored only the truly devout. "It was an amazing class," says David Harbater, a former "math mafia" member and now a professor of mathematics at the University of Pennsylvania. "It's probably safe to say there has never been a class for beginning college students that was that intense and that advanced. The phrase I say to people just to get it across is that, among other things, by the second semester we were discussing the differential geometry of Banach manifolds. That's usually when their eyes bug out, because most people don't start talking about Banach manifolds until their second year of graduate school." + +Starting with 75 students, the class quickly melted down to 20 by the end of the second semester. Of that 20, says Harbater, "only 10 really knew what they were doing." Of that 10, 8 would go on to become future mathematics professors, 1 would go on to teach physics. + +"The other one," emphasizes Harbater, "was Richard Stallman." + +Seth Breidbart, a fellow Math 55 classmate, remembers Stallman distinguishing himself from his peers even then. + +"He was a stickler in some very strange ways," says Breidbart. There is a standard technique in math which everybody does wrong. It's an abuse of notation where you have to define a function for something and what you do is you define a function and then you prove that it's well defined. Except the first time he did and presented it, he defined a relation and proved that it's a function. It's the exact same proof, but he used the correct terminology, which no one else did. That's just the way he was." + +It was in Math 55 that Richard Stallman began to cultivate a reputation for brilliance. Breidbart agrees, but Chess, whose competitive streak refused to yield, says the realization that Stallman might be the best mathematician in the class didn't set in until the next year. "It was during a class on Real Analysis, which I took with Richard the next year," says Chess, now a math professor at Hunter College. "I actually remember in a proof about complex valued measures that Richard came up with an idea that was basically a metaphor from the calculus of variations. It was the first time I ever saw somebody solve a problem in a brilliantly original way." + +Chess makes no bones about it: watching Stallman's solution unfold on the chalkboard was a devastating blow. As a kid who'd always taken pride in being the smartest mathematician the room, it was like catching a glimpse of his own mortality. Years later, as Chess slowly came to accept the professional rank of a good-but-not-great mathematician, he had Stallman's sophomore-year proof to look back on as a taunting early indicator. + +"That's the thing about mathematics," says Chess. "You don't have to be a first-rank mathematician to recognize first-rate mathematical talent. I could tell I was up there, but I could also tell I wasn't at the first rank. If Richard had chosen to be a mathematician, he would have been a first-rank mathematician." + +For Stallman, success in the classroom was balanced by the same lack of success in the social arena. Even as other members of the math mafia gathered to take on the Math 55 problem sets, Stallman preferred to work alone. The same went for living arrangements. On the housing application for Harvard, Stallman clearly spelled out his preferences. "I said I preferred an invisible, inaudible, intangible roommate," he says. In a rare stroke of bureaucratic foresight, Harvard's housing office accepted the request, giving Stallman a one-room single for his freshman year. + +Breidbart, the only math-mafia member to share a dorm with Stallman that freshman year, says Stallman slowly but surely learned how to interact with other students. He recalls how other dorm mates, impressed by Stallman's logical acumen, began welcoming his input whenever an intellectual debate broke out in the dining club or dorm commons. + +"We had the usual bull sessions about solving the world's problems or what would be the result of something," recalls Breidbart. "Say somebody discovers an immortality serum. What do you do? What are the political results? If you give it to everybody, the world gets overcrowded and everybody dies. If you limit it, if you say everyone who's alive now can have it but their children can't, then you end up with an underclass of people without it. Richard was just better able than most to see the unforeseen circumstances of any decision." + +Stallman remembers the discussions vividly. "I was always in favor of immortality," he says. "I was shocked that most people regarded immortality as a bad thing. How else would we be able to see what the world is like 200 years from now?" + +Although a first-rank mathematician and first-rate debater, Stallman shied away from clear-cut competitive events that might have sealed his brilliant reputation. Near the end of freshman year at Harvard, Breidbart recalls how Stallman conspicuously ducked the Putnam exam, a prestigious test open to math students throughout the U.S. and Canada. In addition to giving students a chance to measure their knowledge in relation to their peers, the Putnam served as a chief recruiting tool for academic math departments. According to campus legend, the top scorer automatically qualified for a graduate fellowship at any school of his choice, including Harvard. + +Like Math 55, the Putnam was a brutal test of merit. A six-hour exam in two parts, it seemed explicitly designed to separate the wheat from the chaff. Breidbart, a veteran of both the Science Honors Program and Math 55, describes it as easily the most difficult test he ever took. "Just to give you an idea of how difficult it was," says Breidbart, "the top score was a 120, and my score the first year was in the 30s. That score was still good enough to place me 101st in the country." + +Surprised that Stallman, the best student in the class, had passed on the test, Breidbart says he and a fellow classmate cornered him in the dining common and demanded an explanation. "He said he was afraid of not doing well," Breidbart recalls. + +Breidbart and the friend quickly wrote down a few problems from memory and gave them to Stallman. "He solved all of them," Breidbart says, "leading me to conclude that by not doing well, he either meant coming in second or getting something wrong." + +Stallman remembers the episode a bit differently. "I remember that they did bring me the questions and it's possible that I solved one of them, but I'm pretty sure I didn't solve them all," he says. Nevertheless, Stallman agrees with Breidbart's recollection that fear was the primary reason for not taking the test. Despite a demonstrated willingness to point out the intellectual weaknesses of his peers and professors in the classroom, Stallman hated the notion of head-to-head competition. + +"It's the same reason I never liked chess," says Stallman. "Whenever I'd play, I would become so consumed by the fear of making a single mistake that I would start making stupid mistakes very early in the game. The fear became a self-fulfilling prophecy." + +Whether such fears ultimately prompted Stallman to shy away from a mathematical career is a moot issue. By the end of his freshman year at Harvard, Stallman had other interests pulling him away from the field. Computer programming, a latent fascination throughout Stallman's high-school years, was becoming a full-fledged passion. Where other math students sought occasional refuge in art and history classes, Stallman sought it in the computer-science laboratory. + +For Stallman, the first taste of real computer programming at the IBM New York Scientific Center had triggered a desire to learn more. "Toward the end of my first year at Harvard school, I started to have enough courage to go visit computer labs and see what they had. I'd ask them if they had extra copies of any manuals that I could read." + +Taking the manuals home, Stallman would examine machine specifications, compare them with other machines he already knew, and concoct a trial program, which he would then bring back to the lab along with the borrowed manual. Although some labs balked at the notion of a strange kid coming off the street and working on the lab machinery, most recognized competence when they saw it and let Stallman run the programs he had created. + +One day, near the end of freshman year, Stallman heard about a special laboratory near MIT. The laboratory was located on the ninth floor an off-campus building in Tech Square, the newly built facility dedicated to advanced research. According to the rumors, the lab itself was dedicated to the cutting-edge science of artificial intelligence and boasted the cutting-edge machines and software programs to match. + +Intrigued, Stallman decided to pay a visit. + +The trip was short, about 2 miles on foot, 10 minutes by train, but as Stallman would soon find out, MIT and Harvard can feel like opposite poles of the same planet. With its maze-like tangle of interconnected office buildings, the Institute's campus offered an aesthetic yin to Harvard's spacious colonial-village yang. The same could be said for the student body, a geeky collection of ex-high school misfits known more for its predilection for pranks than its politically powerful alumni. + +The yin-yang relationship extended to the AI Lab as well. Unlike Harvard computer labs, there was no grad-student gatekeeper, no clipboard waiting list for terminal access, no explicit atmosphere of "look but don't touch." Instead, Stallman found only a collection of open terminals and robotic arms, presumably the artifacts of some A.I. experiment. + +Although the rumors said anybody could sit down at the terminals, Stallman decided to stick with the original plan. When he encountered a lab employee, he asked if the lab had any spare manuals it could loan to an inquisitive student. "They had some, but a lot of things weren't documented," Stallman recalls. "They were hackers after all." + +Stallman left with something even better than a manual: a job. Although he doesn't remember what the first project was, he does remember coming back to the AI Lab the next week, grabbing an open terminal and writing software code. + +Looking back, Stallman sees nothing unusual in the AI Lab's willingness to accept an unproven outsider at first glance. "That's the way it was back then," he says. "That's the way it still is now. I'll hire somebody when I meet him if I see he's good. Why wait? Stuffy people who insist on putting bureaucracy into everything really miss the point. If a person is good, he shouldn't have to go through a long, detailed hiring process; he should be sitting at a computer writing code." + +To get a taste of "bureaucratic and stuffy," Stallman need only visit the computer labs at Harvard. There, access to the terminals was doled out according to academic rank. As an undergrad, Stallman usually had to sign up or wait until midnight, about the time most professors and grad students finished their daily work assignments. The waiting wasn't difficult, but it was frustrating. Waiting for a public terminal, knowing all the while that a half dozen equally usable machines were sitting idle inside professors' locked offices, seemed the height of illogic. Although Stallman paid the occasional visit to the Harvard computer labs, he preferred the more egalitarian policies of the AI Lab. "It was a breath of fresh air," he says. "At the AI Lab, people seemed more concerned about work than status." + +Stallman quickly learned that the AI Lab's first-come, first-served policy owed much to the efforts of a vigilant few. Many were holdovers from the days of Project MAC, the Department of Defense-funded research program that had given birth to the first time-share operating systems. A few were already legends in the computing world. There was Richard Greenblatt, the lab's in-house Lisp expert and author of MacHack, the computer chess program that had once humbled A.I. critic Hubert Dreyfus. There was Gerald Sussman, original author of the robotic block-stacking program HACKER. And there was Bill Gosper, the in-house math whiz already in the midst of an 18-month hacking bender triggered by the philosophical implications of the computer game LIFE. 4 + +Members of the tight-knit group called themselves " hackers." Over time, they extended the "hacker" description to Stallman as well. In the process of doing so, they inculcated Stallman in the ethical traditions of the "hacker ethic ." To be a hacker meant more than just writing programs, Stallman learned. It meant writing the best possible programs. It meant sitting at a terminal for 36 hours straight if that's what it took to write the best possible programs. Most importantly, it meant having access to the best possible machines and the most useful information at all times. Hackers spoke openly about changing the world through software, and Stallman learned the instinctual hacker disdain for any obstacle that prevented a hacker from fulfilling this noble cause. Chief among these obstacles were poor software, academic bureaucracy, and selfish behavior. + +Stallman also learned the lore, stories of how hackers, when presented with an obstacle, had circumvented it in creative ways. Stallman learned about " lock hacking," the art of breaking into professors' offices to "liberate" sequestered terminals. Unlike their pampered Harvard counterparts, MIT faculty members knew better than to treat the AI Lab's terminal as private property. If a faculty member made the mistake of locking away a terminal for the night, hackers were quick to correct the error. Hackers were equally quick to send a message if the mistake repeated itself. "I was actually shown a cart with a heavy cylinder of metal on it that had been used to break down the door of one professor's office,"5 Stallman says. + +Such methods, while lacking in subtlety, served a purpose. Although professors and administrators outnumbered hackers two-to-one inside the AI Lab, the hacker ethic prevailed. Indeed, by the time of Stallman's arrival at the AI Lab, hackers and the AI Lab administration had coevolved into something of a symbiotic relationship. In exchange for fixing the machines and keeping the software up and running, hackers earned the right to work on favorite pet projects. Often, the pet projects revolved around improving the machines and software programs even further. Like teenage hot-rodders, most hackers viewed tinkering with machines as its own form of entertainment. + +Nowhere was this tinkering impulse better reflected than in the operating system that powered the lab's central PDP-6 mini-computer. Dubbed ITS, short for the Incompatible Time Sharing system, the operating system incorporated the hacking ethic into its very design. Hackers had built it as a protest to Project MAC's original operating system, the Compatible Time Sharing System, CTSS, and named it accordingly. At the time, hackers felt the CTSS design too restrictive, limiting programmers' power to modify and improve the program's own internal architecture if needed. According to one legend passed down by hackers, the decision to build ITS had political overtones as well. Unlike CTSS, which had been designed for the IBM 7094, ITS was built specifically for the PDP-6. In letting hackers write the systems themselves, AI Lab administrators guaranteed that only hackers would feel comfortable using the PDP-6. In the feudal world of academic research, the gambit worked. Although the PDP-6 was co-owned in conjunction with other departments, A.I. researchers soon had it to themselves.6 + +ITS boasted features most commercial operating systems wouldn't offer for years, features such as multitasking, debugging, and full-screen editing capability. Using it and the PDP-6 as a foundation, the Lab had been able to declare independence from Project MAC shortly before Stallman's arrival.6 + +As an apprentice hacker, Stallman quickly became enamored with ITS. Although forbidding to most newcomers, the program contained many built-in features that provided a lesson in software development to hacker apprentices such as himself. + +"ITS had a very elegant internal mechanism for one program to examine another," says Stallman, recalling the program. "You could examine all sorts of status about another program in a very clean, well-specified way." + +Using this feature, Stallman was able to watch how programs written by hackers processed instructions as they ran. Another favorite feature would allow the monitoring program to freeze the monitored program's job between instructions. In other operating systems, such a command would have resulted in half-computed gibberish or an automatic systems crash. In ITS, it provided yet another way to monitor the step-by-step performance. + +"If you said, `Stop the job,' it would always be stopped in user mode. It would be stopped between two user-mode instructions, and everything about the job would be consistent for that point," Stallman says. "If you said, `Resume the job,' it would continue properly. Not only that, but if you were to change the status of the job and then change it back, everything would be consistent. There was no hidden status anywhere." + +By the end of 1970, hacking at the AI Lab had become a regular part of Stallman's weekly schedule. From Monday to Thursday, Stallman devoted his waking hours to his Harvard classes. As soon as Friday afternoon arrived, however, he was on the T, heading down to MIT for the weekend. Stallman usually timed his arrival to coincide with the ritual food run. Joining five or six other hackers in their nightly quest for Chinese food, he would jump inside a beat-up car and head across the Harvard Bridge into nearby Boston. For the next two hours, he and his hacker colleagues would discuss everything from ITS to the internal logic of the Chinese language and pictograph system. Following dinner, the group would return to MIT and hack code until dawn. + +For the geeky outcast who rarely associated with his high-school peers, it was a heady experience, suddenly hanging out with people who shared the same predilection for computers, science fiction, and Chinese food. "I remember many sunrises seen from a car coming back from Chinatown," Stallman would recall nostalgically, 15 years after the fact in a speech at the Swedish Royal Technical Institute. "It was actually a very beautiful thing to see a sunrise, 'cause that's such a calm time of day. It's a wonderful time of day to get ready to go to bed. It's so nice to walk home with the light just brightening and the birds starting to chirp; you can get a real feeling of gentle satisfaction, of tranquility about the work that you have done that night."7 + +The more Stallman hung out with the hackers, the more he adopted the hacker worldview. Already committed to the notion of personal liberty, Stallman began to infuse his actions with a sense of communal responsibility. When others violated the communal code, Stallman was quick to speak out. Within a year of his first visit, Stallman was the one breaking into locked offices, trying to recover the sequestered terminals that belonged to the lab community as a whole. In true hacker fashion, Stallman also sought to make his own personal contribution to the art of lock hacking. One of the most artful door-opening tricks, commonly attributed to Greenblatt, involved bending a stiff wire into a cane and attaching a loop of tape to the long end. Sliding the wire under the door, a hacker could twist and rotate the wire so that the long end touched the door knob. Provided the adhesive on the tape held, a hacker could open the doorknob with a few sharp twists. + +When Stallman tried the trick, he found it good but wanting in a few places. Getting the tape to stick wasn't always easy, and twisting the wire in a way that turned the doorknob was similarly difficult. Stallman remembered that the hallway ceiling possessed tiles that could be slid away. Some hackers, in fact, had used the false ceiling as a way to get around locked doors, an approach that generally covered the perpetrator in fiberglass but got the job done. + +Stallman considered an alternative approach. What if, instead of slipping a wire under the door, a hacker slid away one of the panels and stood over the door jamb? + +Stallman took it upon himself to try it out. Instead of using a wire, Stallman draped out a long U-shaped loop of magnetic tape, fastening a loop of adhesive tape at the base of the U. Standing over the door jamb, he dangled the tape until it looped under the doorknob. Lifting the tape until the adhesive fastened, he then pulled on the left end of the tape, twisting the doorknob counter-clockwise. Sure enough, the door opened. Stallman had added a new twist to the art of lock hacking. + +"Sometimes you had to kick the door after you turned the door knob," says Stallman, recalling the lingering bugginess of the new method. "It took a little bit of balance to pull it off." + +Such activities reflected a growing willingness on Stallman's part to speak and act out in defense of political beliefs. The AI Lab's spirit of direct action had proved inspirational enough for Stallman to break out of the timid impotence of his teenage years. Breaking into an office to free a terminal wasn't the same as taking part in a protest march, but it was effective in ways that most protests weren't. It solved the problem at hand. + +By the time of his last years at Harvard, Stallman was beginning to apply the whimsical and irreverent lessons of the AI Lab back at school. + +"Did he tell you about the snake?" his mother asks at one point during an interview. "He and his dorm mates put a snake up for student election. Apparently it got a considerable number of votes." + +Stallman verifies the snake candidacy with a few caveats. The snake was a candidate for election within Currier House, Stallman's dorm, not the campus-wide student council. Stallman does remember the snake attracting a fairly significant number of votes, thanks in large part to the fact that both the snake and its owner both shared the same last name. "People may have voted for it, because they thought they were voting for the owner," Stallman says. "Campaign posters said that the snake was `slithering for' the office. We also said it was an `at large' candidate, since it had climbed into the wall through the ventilating unit a few weeks before and nobody knew where it was." + +Running a snake for dorm council was just one of several election-related pranks. In a later election, Stallman and his dorm mates nominated the house master's son. "His platform was mandatory retirement at age seven," Stallman recalls. Such pranks paled in comparison to the fake-candidate pranks on the MIT campus, however. One of the most successful fake-candidate pranks was a cat named Woodstock, which actually managed to outdraw most of the human candidates in a campus-wide election. "They never announced how many votes Woodstock got, and they treated those votes as spoiled ballots," Stallman recalls. "But the large number of spoiled ballots in that election suggested that Woodstock had actually won. A couple of years later, Woodstock was suspiciously run over by a car. Nobody knows if the driver was working for the MIT administration." Stallman says he had nothing to do with Woodstock's candidacy, "but I admired it."8 + +At the AI Lab, Stallman's political activities had a sharper-edged tone. During the 1970s, hackers faced the constant challenge of faculty members and administrators pulling an end-run around ITS and its hacker-friendly design. One of the first attempts came in the mid-1970s, as more and more faculty members began calling for a file security system to protect research data. Most other computer labs had installed such systems during late 1960s, but the AI Lab, through the insistence of Stallman and other hackers, remained a security-free zone. + +For Stallman, the opposition to security was both ethical and practical. On the ethical side, Stallman pointed out that the entire art of hacking relied on intellectual openness and trust. On the practical side, he pointed to the internal structure of ITS being built to foster this spirit of openness, and any attempt to reverse that design required a major overhaul. + +"The hackers who wrote the Incompatible Timesharing System decided that file protection was usually used by a self-styled system manager to get power over everyone else," Stallman would later explain. "They didn't want anyone to be able to get power over them that way, so they didn't implement that kind of a feature. The result was, that whenever something in the system was broken, you could always fix it."9 + +Through such vigilance, hackers managed to keep the AI Lab's machines security-free. Over at the nearby MIT Laboratory for Computer Sciences, however, security-minded faculty members won the day. The LCS installed its first password-based system in 1977. Once again, Stallman took it upon himself to correct what he saw as ethical laxity. Gaining access to the software code that controlled the password system, Stallman implanted a software command that sent out a message to any LCS user who attempted to choose a unique password. If a user entered "starfish," for example, the message came back something like: + + I see you chose the password "starfish." I suggest that you switch to the password "carriage return." It's much easier to type, and also it stands up to the principle that there should be no passwords.10 + +Users who did enter "carriage return"-that is, users who simply pressed the Enter or Return button, entering a blank string instead of a unique password-left their accounts accessible to the world at large. As scary as that might have been for some users, it reinforced the hacker notion that Institute computers, and even Institute computer files, belonged to the public, not private individuals. Stallman, speaking in an interview for the 1984 book Hackers, proudly noted that one-fifth of the LCS staff accepted this argument and employed the blank-string password.11 + +Stallman's null-string crusade would prove ultimately futile. By the early 1980s, even the AI Lab's machines were sporting password-based security systems. Even so, it represents a major milestone in terms of Stallman's personal and political maturation. To the objective observer familiar with Stallman's later career, it offers a convenient inflection point between the timid teenager afraid to speak out even on issues of life-threatening importance and the adult activist who would soon turn needling and cajoling into a full-time occupation. + +In voicing his opposition to computer security, Stallman drew on many of the forces that had shaped his early life: hunger for knowledge, distaste for authority, and frustration over hidden procedures and rules that rendered some people clueless outcasts. He would also draw on the ethical concepts that would shape his adult life: communal responsibility, trust, and the hacker spirit of direct action. Expressed in software-computing terms, the null string represents the 1.0 version of the Richard Stallman political worldview-incomplete in a few places but, for the most part, fully mature. + +Looking back, Stallman hesitates to impart too much significance to an event so early in his hacking career. "In that early stage there were a lot of people who shared my feelings," he says. "The large number of people who adopted the null string as their password was a sign that many people agreed that it was the proper thing to do. I was simply inclined to be an activist about it." + +Stallman does credit the AI Lab for awakening that activist spirit, however. As a teenager, Stallman had observed political events with little idea as to how a single individual could do or say anything of importance. As a young adult, Stallman was speaking out on matters in which he felt supremely confident, matters such as software design, communal responsibility, and individual freedom. "I joined this community which had a way of life which involved respecting each other's freedom," he says. "It didn't take me long to figure out that that was a good thing. It took me longer to come to the conclusion that this was a moral issue." + +Hacking at the AI Lab wasn't the only activity helping to boost Stallman's esteem. During the middle of his sophomore year at Harvard, Stallman had joined up with a dance troupe that specialized in folk dances . What began as a simple attempt to meet women and expand his social horizons soon expanded into yet another passion alongside hacking. Dancing in front of audiences dressed in the native garb of a Balkan peasant, Stallman no longer felt like the awkward, uncoordinated 10-year-old whose attempts to play football had ended in frustration. He felt confident, agile, and alive. For a brief moment, he even felt a hint of emotional connection. He soon found being in front of an audience fun, and it wasn't long thereafter that he began craving the performance side of dancing almost as much as the social side. + +Although the dancing and hacking did little to improve Stallman's social standing, they helped him overcome the feelings of weirdness that had clouded his pre-Harvard life. Instead of lamenting his weird nature, Stallman found ways to celebrate it. In 1977, while attending a science-fiction convention, he came across a woman selling custom-made buttons. Excited, Stallman ordered a button with the words "Impeach God" emblazoned on it. + +For Stallman, the "Impeach God" message worked on many levels. An atheist since early childhood, Stallman first saw it as an attempt to set a "second front" in the ongoing debate on religion. "Back then everybody was arguing about God being dead or alive," Stallman recalls. "`Impeach God' approached the subject of God from a completely different viewpoint. If God was so powerful as to create the world and yet do nothing to correct the problems in it, why would we ever want to worship such a God? Wouldn't it be better to put him on trial?" + +At the same time, "Impeach God" was a satirical take on America and the American political system. The Watergate scandal of the 1970s affected Stallman deeply. As a child, Stallman had grown up mistrusting authority. Now, as an adult, his mistrust had been solidified by the culture of the AI Lab hacker community. To the hackers, Watergate was merely a Shakespearean rendition of the daily power struggles that made life such a hassle for those without privilege. It was an outsized parable for what happened when people traded liberty and openness for security and convenience. + +Buoyed by growing confidence, Stallman wore the button proudly. People curious enough to ask him about it received the same well-prepared spiel. "My name is Jehovah," Stallman would say. "I have a special plan to save the universe, but because of heavenly security reasons I can't tell you what that plan is. You're just going to have to put your faith in me, because I see the picture and you don't. You know I'm good because I told you so. If you don't believe me, I'll throw you on my enemies list and throw you in a pit where Infernal Revenue Service will audit your taxes for eternity." + +Those who interpreted the spiel as a word-for-word parody of the Watergate hearings only got half the message. For Stallman, the other half of the message was something only his fellow hackers seemed to be hearing. One hundred years after Lord Acton warned about absolute power corrupting absolutely, Americans seemed to have forgotten the first part of Acton's truism: power, itself, corrupts. Rather than point out the numerous examples of petty corruption, Stallman felt content voicing his outrage toward an entire system that trusted power in the first place. + +"I figured why stop with the small fry," says Stallman, recalling the button and its message. "If we went after Nixon, why not going after Mr. Big. The way I see it, any being that has power and abuses it deserves to have that power taken away." + + +Chapter 5 +Small Puddle of Freedom +Ask anyone who's spent more than a minute in Richard Stallman's presence, and you'll get the same recollection: forget the long hair. Forget the quirky demeanor. The first thing you notice is the gaze. One look into Stallman's green eyes, and you know you're in the presence of a true believer. + +To call the Stallman gaze intense is an understatement. Stallman's eyes don't just look at you; they look through you. Even when your own eyes momentarily shift away out of simple primate politeness, Stallman's eyes remain locked-in, sizzling away at the side of your head like twin photon beams. + +Maybe that's why most writers, when describing Stallman, tend to go for the religious angle. In a 1998 Salon.com article titled "The Saint of Free Software," Andrew Leonard describes Stallman's green eyes as "radiating the power of an Old Testament prophet."1 A 1999 Wired magazine article describes the Stallman beard as "Rasputin-like,"2 while a London Guardian profile describes the Stallman smile as the smile of "a disciple seeing Jesus."3 + +Such analogies serve a purpose, but they ultimately fall short. That's because they fail to take into account the vulnerable side of the Stallman persona. Watch the Stallman gaze for an extended period of time, and you will begin to notice a subtle change. What appears at first to be an attempt to intimidate or hypnotize reveals itself upon second and third viewing as a frustrated attempt to build and maintain contact. If, as Stallman himself has suspected from time to time, his personality is the product of autism or Asperger Syndrome, his eyes certainly confirm the diagnosis. Even at their most high-beam level of intensity, they have a tendency to grow cloudy and distant, like the eyes of a wounded animal preparing to give up the ghost. + +My own first encounter with the legendary Stallman gaze dates back to the March, 1999, LinuxWorld Convention and Expo in San Jose, California. Billed as a "coming out party" for the Linux software community, the convention also stands out as the event that reintroduced Stallman to the technology media. Determined to push for his proper share of credit, Stallman used the event to instruct spectators and reporters alike on the history of the GNU Project and the project's overt political objectives. + +As a reporter sent to cover the event, I received my own Stallman tutorial during a press conference announcing the release of GNOME 1.0, a free software graphic user interface. Unwittingly, I push an entire bank of hot buttons when I throw out my very first question to Stallman himself: do you think GNOME's maturity will affect the commercial popularity of the Linux operating system? + +"I ask that you please stop calling the operating system Linux," Stallman responds, eyes immediately zeroing in on mine. "The Linux kernel is just a small part of the operating system. Many of the software programs that make up the operating system you call Linux were not developed by Linus Torvalds at all. They were created by GNU Project volunteers, putting in their own personal time so that users might have a free operating system like the one we have today. To not acknowledge the contribution of those programmers is both impolite and a misrepresentation of history. That's why I ask that when you refer to the operating system, please call it by its proper name, GNU/Linux." + +Taking the words down in my reporter's notebook, I notice an eerie silence in the crowded room. When I finally look up, I find Stallman's unblinking eyes waiting for me. Timidly, a second reporter throws out a question, making sure to use the term " GNU/Linux" instead of Linux. Miguel de Icaza, leader of the GNOME project, fields the question. It isn't until halfway through de Icaza's answer, however, that Stallman's eyes finally unlock from mine. As soon as they do, a mild shiver rolls down my back. When Stallman starts lecturing another reporter over a perceived error in diction, I feel a guilty tinge of relief. At least he isn't looking at me, I tell myself. + +For Stallman, such face-to-face moments would serve their purpose. By the end of the first LinuxWorld show, most reporters know better than to use the term "Linux" in his presence, and wired.com is running a story comparing Stallman to a pre-Stalinist revolutionary erased from the history books by hackers and entrepreneurs eager to downplay the GNU Project's overly political objectives.2 Other articles follow, and while few reporters call the operating system GNU/Linux in print, most are quick to credit Stallman for launching the drive to build a free software operating system 15 years before. + +I won't meet Stallman again for another 17 months. During the interim, Stallman will revisit Silicon Valley once more for the August, 1999 LinuxWorld show. Although not invited to speak, Stallman does managed to deliver the event's best line. Accepting the show's Linus Torvalds Award for Community Service-an award named after Linux creator Linus Torvalds-on behalf of the Free Software Foundation, Stallman wisecracks, "Giving the Linus Torvalds Award to the Free Software Foundation is a bit like giving the Han Solo Award to the Rebel Alliance." + +This time around, however, the comments fail to make much of a media dent. Midway through the week, Red Hat, Inc., a prominent GNU/Linux vendor, goes public. The news merely confirms what many reporters such as myself already suspect: "Linux" has become a Wall Street buzzword, much like "e-commerce" and "dot-com" before it. With the stock market approaching the Y2K rollover like a hyperbola approaching its vertical asymptote, all talk of free software or open source as a political phenomenon falls by the wayside. + +Maybe that's why, when LinuxWorld follows up its first two shows with a third LinuxWorld show in August, 2000, Stallman is conspicuously absent. + +My second encounter with Stallman and his trademark gaze comes shortly after that third LinuxWorld show. Hearing that Stallman is going to be in Silicon Valley, I set up a lunch interview in Palo Alto, California. The meeting place seems ironic, not only because of the recent no-show but also because of the overall backdrop. Outside of Redmond, Washington, few cities offer a more direct testament to the economic value of proprietary software. Curious to see how Stallman, a man who has spent the better part of his life railing against our culture's predilection toward greed and selfishness, is coping in a city where even garage-sized bungalows run in the half-million-dollar price range, I make the drive down from Oakland. + +I follow the directions Stallman has given me, until I reach the headquarters of Art.net, a nonprofit "virtual artists collective." Located in a hedge-shrouded house in the northern corner of the city, the Art.net headquarters are refreshingly run-down. Suddenly, the idea of Stallman lurking in the heart of Silicon Valley doesn't seem so strange after all. + +I find Stallman sitting in a darkened room, tapping away on his gray laptop computer. He looks up as soon as I enter the room, giving me a full blast of his 200-watt gaze. When he offers a soothing "Hello," I offer a return greeting. Before the words come out, however, his eyes have already shifted back to the laptop screen. + +"I'm just finishing an article on the spirit of hacking," Stallman says, fingers still tapping. "Take a look." + +I take a look. The room is dimly lit, and the text appears as greenish-white letters on a black background, a reversal of the color scheme used by most desktop word-processing programs, so it takes my eyes a moment to adjust. When they do, I find myself reading Stallman's account of a recent meal at a Korean restaurant. Before the meal, Stallman makes an interesting discovery: the person setting the table has left six chopsticks instead of the usual two in front of Stallman's place setting. Where most restaurant goers would have ignored the redundant pairs, Stallman takes it as challenge: find a way to use all six chopsticks at once. Like many software hacks, the successful solution is both clever and silly at the same time. Hence Stallman's decision to use it as an illustration. + +As I read the story, I feel Stallman watching me intently. I look over to notice a proud but child-like half smile on his face. When I praise the essay, my comment barely merits a raised eyebrow. + +"I'll be ready to go in a moment," he says. + +Stallman goes back to tapping away at his laptop. The laptop is gray and boxy, not like the sleek, modern laptops that seemed to be a programmer favorite at the recent LinuxWorld show. Above the keyboard rides a smaller, lighter keyboard, a testament to Stallman's aging hands. During the late 1980s, when Stallman was putting in 70- and 80-hour work weeks writing the first free software tools and programs for the GNU Project, the pain in Stallman's hands became so unbearable that he had to hire a typist. Today, Stallman relies on a keyboard whose keys require less pressure than a typical computer keyboard. + +Stallman has a tendency to block out all external stimuli while working. Watching his eyes lock onto the screen and his fingers dance, one quickly gets the sense of two old friends locked in deep conversation. + +The session ends with a few loud keystrokes and the slow disassembly of the laptop. + +"Ready for lunch?" Stallman asks. + +We walk to my car. Pleading a sore ankle, Stallman limps along slowly. Stallman blames the injury on a tendon in his left foot. The injury is three years old and has gotten so bad that Stallman, a huge fan of folk dancing, has been forced to give up all dancing activities. "I love folk dancing inherently," Stallman laments. "Not being able to dance has been a tragedy for me." + +Stallman's body bears witness to the tragedy. Lack of exercise has left Stallman with swollen cheeks and a pot belly that was much less visible the year before. You can tell the weight gain has been dramatic, because when Stallman walks, he arches his back like a pregnant woman trying to accommodate an unfamiliar load. + +The walk is further slowed by Stallman's willingness to stop and smell the roses, literally. Spotting a particularly beautiful blossom, he tickles the innermost petals with his prodigious nose, takes a deep sniff and steps back with a contented sigh. + +"Mmm, rhinophytophilia,"4 he says, rubbing his back. + +The drive to the restaurant takes less than three minutes. Upon recommendation from Tim Ney, former executive director of the Free Software Foundation, I have let Stallman choose the restaurant. While some reporters zero in on Stallman's monk-like lifestyle, the truth is, Stallman is a committed epicure when it comes to food. One of the fringe benefits of being a traveling missionary for the free software cause is the ability to sample delicious food from around the world. "Visit almost any major city in the world, and chances are Richard knows the best restaurant in town," says Ney. "Richard also takes great pride in knowing what's on the menu and ordering for the entire table." + +For today's meal, Stallman has chosen a Cantonese-style dim sum restaurant two blocks off University Avenue, Palo Alto's main drag. The choice is partially inspired by Stallman's recent visit to China, including a lecture stop in Guangdong province, in addition to Stallman's personal aversion to spicier Hunanese and Szechuan cuisine. "I'm not a big fan of spicy," Stallman admits. + +We arrive a few minutes after 11 a.m. and find ourselves already subject to a 20-minute wait. Given the hacker aversion to lost time, I hold my breath momentarily, fearing an outburst. Stallman, contrary to expectations, takes the news in stride. + +"It's too bad we couldn't have found somebody else to join us," he tells me. "It's always more fun to eat with a group of people." + +During the wait, Stallman practices a few dance steps. His moves are tentative but skilled. We discuss current events. Stallman says his only regret about not attending LinuxWorld was missing out on a press conference announcing the launch of the GNOME Foundation. Backed by Sun Microsystems and IBM, the foundation is in many ways a vindication for Stallman, who has long championed that free software and free-market economics need not be mutually exclusive. Nevertheless, Stallman remains dissatisfied by the message that came out. + +"The way it was presented, the companies were talking about Linux with no mention of the GNU Project at all," Stallman says. + +Such disappointments merely contrast the warm response coming from overseas, especially Asia, Stallman notes. A quick glance at the Stallman 2000 travel itinerary bespeaks the growing popularity of the free software message. Between recent visits to India, China, and Brazil, Stallman has spent 12 of the last 115 days on United States soil. His travels have given him an opportunity to see how the free software concept translates into different languages of cultures. + +"In India many people are interested in free software, because they see it as a way to build their computing infrastructure without spending a lot of money," Stallman says. "In China, the concept has been much slower to catch on. Comparing free software to free speech is harder to do when you don't have any free speech. Still, the level of interest in free software during my last visit was profound." + +The conversation shifts to Napster, the San Mateo, California software company, which has become something of a media cause cČlËbre in recent months. The company markets a controversial software tool that lets music fans browse and copy the music files of other music fans. Thanks to the magnifying powers of the Internet, this so-called "peer-to-peer" program has evolved into a de facto online juke box, giving ordinary music fans a way to listen to MP3 music files over the computer without paying a royalty or fee, much to record companies' chagrin. + +Although based on proprietary software, the Napster system draws inspiration from the long-held Stallman contention that once a work enters the digital realm-in other words, once making a copy is less a matter of duplicating sounds or duplicating atoms and more a matter of duplicating information-the natural human impulse to share a work becomes harder to restrict. Rather than impose additional restrictions, Napster execs have decided to take advantage of the impulse. Giving music listeners a central place to trade music files, the company has gambled on its ability to steer the resulting user traffic toward other commercial opportunities. + +The sudden success of the Napster model has put the fear in traditional record companies, with good reason. Just days before my Palo Alto meeting with Stallman, U.S. District Court Judge Marilyn Patel granted a request filed by the Recording Industry Association of America for an injunction against the file-sharing service. The injunction was subsequently suspended by the U.S. Ninth District Court of Appeals, but by early 2001, the Court of Appeals, too, would find the San Mateo-based company in breach of copyright law,5 a decision RIAA spokesperson Hillary Rosen would later proclaim proclaim a "clear victory for the creative content community and the legitimate online marketplace."6 + +For hackers such as Stallman, the Napster business model is scary in different ways. The company's eagerness to appropriate time-worn hacker principles such as file sharing and communal information ownership, while at the same time selling a service based on proprietary software, sends a distressing mixed message. As a person who already has a hard enough time getting his own carefully articulated message into the media stream, Stallman is understandably reticent when it comes to speaking out about the company. Still, Stallman does admit to learning a thing or two from the social side of the Napster phenomenon. + +"Before Napster, I thought it might be OK for people to privately redistribute works of entertainment," Stallman says. "The number of people who find Napster useful, however, tells me that the right to redistribute copies not only on a neighbor-to-neighbor basis, but to the public at large, is essential and therefore may not be taken away." + +No sooner does Stallman say this than the door to the restaurant swings open and we are invited back inside by the host. Within a few seconds, we are seated in a side corner of the restaurant next to a large mirrored wall. + +The restaurant's menu doubles as an order form, and Stallman is quickly checking off boxes before the host has even brought water to the table. "Deep-fried shrimp roll wrapped in bean-curd skin," Stallman reads. "Bean-curd skin. It offers such an interesting texture. I think we should get it." + +This comment leads to an impromptu discussion of Chinese food and Stallman's recent visit to China. "The food in China is utterly exquisite," Stallman says, his voice gaining an edge of emotion for the first time this morning. "So many different things that I've never seen in the U.S., local things made from local mushrooms and local vegetables. It got to the point where I started keeping a journal just to keep track of every wonderful meal." + +The conversation segues into a discussion of Korean cuisine. During the same June, 2000, Asian tour, Stallman paid a visit to South Korea. His arrival ignited a mini-firestorm in the local media thanks to a Korean software conference attended by Microsoft founder and chairman Bill Gates that same week. Next to getting his photo above Gates's photo on the front page of the top Seoul newspaper, Stallman says the best thing about the trip was the food. "I had a bowl of naeng myun, which is cold noodles," says Stallman. "These were a very interesting feeling noodle. Most places don't use quite the same kind of noodles for your naeng myun, so I can say with complete certainty that this was the most exquisite naeng myun I ever had." + +The term "exquisite" is high praise coming from Stallman. I know this, because a few moments after listening to Stallman rhapsodize about naeng myun, I feel his laser-beam eyes singeing the top of my right shoulder. + +"There is the most exquisite woman sitting just behind you," Stallman says. + +I turn to look, catching a glimpse of a woman's back. The woman is young, somewhere in her mid-20s, and is wearing a white sequinned dress. She and her male lunch companion are in the final stages of paying the check. When both get up from the table to leave the restaurant, I can tell without looking, because Stallman's eyes suddenly dim in intensity. + +"Oh, no," he says. "They're gone. And to think, I'll probably never even get to see her again." + +After a brief sigh, Stallman recovers. The moment gives me a chance to discuss Stallman's reputation vis-ý-vis the fairer sex. The reputation is a bit contradictory at times. A number of hackers report Stallman's predilection for greeting females with a kiss on the back of the hand.7 A May 26, 2000 Salon.com article, meanwhile, portrays Stallman as a bit of a hacker lothario. Documenting the free software-free love connection, reporter Annalee Newitz presents Stallman as rejecting traditional family values, telling her, "I believe in love, but not monogamy." 8 + +Stallman lets his menu drop a little when I bring this up. "Well, most men seem to want sex and seem to have a rather contemptuous attitude towards women," he says. "Even women they're involved with. I can't understand it at all." + +I mention a passage from the 1999 book Open Sources in which Stallman confesses to wanting to name the ill-fated GNU kernel after a girlfriend at the time. The girlfriend's name was Alix, a name that fit perfectly with the Unix developer convention of putting an "x" at the end of any new kernel name-e.g., "Linux." Because the woman was a Unix system administrator, Stallman says it would have been an even more touching tribute. Unfortunately, Stallman notes, the kernel project's eventual main developer renamed the kernel HURD. 9 Although Stallman and the girlfriend later broke up, the story triggers an automatic question: for all the media imagery depicting him as a wild-eyed fanatic, is Richard Stallman really just a hopeless romantic, a wandering Quixote tilting at corporate windmills in an effort to impress some as-yet-unidentified Dulcinea? + +"I wasn't really trying to be romantic," Stallman says, recalling the Alix story. "It was more of a teasing thing. I mean, it was romantic, but it was also teasing, you know? It would have been a delightful surprise." + +For the first time all morning, Stallman smiles. I bring up the hand kissing. "Yes, I do do that," Stallman says. "I've found it's a way of offering some affection that a lot of women will enjoy. It's a chance to give some affection and to be appreciated for it." + +Affection is a thread that runs clear through Richard Stallman's life, and he is painfully candid about it when questions arise. "There really hasn't been much affection in my life, except in my mind," he says. Still, the discussion quickly grows awkward. After a few one-word replies, Stallman finally lifts up his menu, cutting off the inquiry. + +"Would you like some shimai?" he asks. + +When the food comes out, the conversation slaloms between the arriving courses. We discuss the oft-noted hacker affection for Chinese food, the weekly dinner runs into Boston's Chinatown district during Stallman's days as a staff programmer at the AI Lab, and the underlying logic of the Chinese language and its associated writing system. Each thrust on my part elicits a well-informed parry on Stallman's part. + +"I heard some people speaking Shanghainese the last time I was in China," Stallman says. "It was interesting to hear. It sounded quite different [from Mandarin]. I had them tell me some cognate words in Mandarin and Shanghainese. In some cases you can see the resemblance, but one question I was wondering about was whether tones would be similar. They're not. That's interesting to me, because there's a theory that the tones evolved from additional syllables that got lost and replaced. Their effect survives in the tone. If that's true, and I've seen claims that that happened within historic times, the dialects must have diverged before the loss of these final syllables." + +The first dish, a plate of pan-fried turnip cakes, has arrived. Both Stallman and I take a moment to carve up the large rectangular cakes, which smell like boiled cabbage but taste like potato latkes fried in bacon. + +I decide to bring up the outcast issue again, wondering if Stallman's teenage years conditioned him to take unpopular stands, most notably his uphill battle since 1994 to get computer users and the media to replace the popular term "Linux" with "GNU/Linux." + +"I believe it did help me," Stallman says, chewing on a dumpling. "I have never understood what peer pressure does to other people. I think the reason is that I was so hopelessly rejected that for me, there wasn't anything to gain by trying to follow any of the fads. It wouldn't have made any difference. I'd still be just as rejected, so I didn't try." + +Stallman points to his taste in music as a key example of his contrarian tendencies. As a teenager, when most of his high school classmates were listening to Motown and acid rock, Stallman preferred classical music. The memory leads to a rare humorous episode from Stallman's middle-school years. Following the Beatles' 1964 appearance on the Ed Sullivan Show, most of Stallman's classmates rushed out to purchase the latest Beatles albums and singles. Right then and there, Stallman says, he made a decision to boycott the Fab Four. + +"I liked some of the pre-Beatles popular music," Stallman says. "But I didn't like the Beatles. I especially disliked the wild way people reacted to them. It was like: who was going to have a Beatles assembly to adulate the Beatles the most?" + +When his Beatles boycott failed to take hold, Stallman looked for other ways to point out the herd-mentality of his peers. Stallman says he briefly considered putting together a rock band himself dedicated to satirizing the Liverpool group. + +"I wanted to call it Tokyo Rose and the Japanese Beetles." + +Given his current love for international folk music, I ask Stallman if he had a similar affinity for Bob Dylan and the other folk musicians of the early 1960s. Stallman shakes his head. "I did like Peter, Paul and Mary," he says. "That reminds me of a great filk." + +When I ask for a definition of "filk," Stallman explains the concept. A filk, he says, is a popular song whose lyrics have been replaced with parody lyrics. The process of writing a filk is called filking, and it is a popular activity among hackers and science-fiction aficionados. Classic filks include "On Top of Spaghetti," a rewrite of "On Top of Old Smokey," and "Yoda," filk-master "Weird" Al Yankovic's Star Wars-oriented rendition of the Kinks tune, "Lola." + +Stallman asks me if I would be interested in hearing the folk filk. As soon as I say yes, Stallman's voice begins singing in an unexpectedly clear tone: + + How much wood could a woodchuck chuck,If a woodchuck could chuck wood?How many poles could a polak lock,If a polak could lock poles?How many knees could a negro grow,If a negro could grow knees?The answer, my dear, is stick it in your ear.The answer is to stick it in your ear. + +The singing ends, and Stallman's lips curl into another child-like half smile. I glance around at the nearby tables. The Asian families enjoying their Sunday lunch pay little attention to the bearded alto in their midst.10 After a few moments of hesitation, I finally smile too. + +"Do you want that last cornball?" Stallman asks, eyes twinkling. Before I can screw up the punch line, Stallman grabs the corn-encrusted dumpling with his two chopsticks and lifts it proudly. "Maybe I'm the one who should get the cornball," he says. + +The food gone, our conversation assumes the dynamics of a normal interview. Stallman reclines in his chair and cradles a cup of tea in his hands. We resume talking about Napster and its relation to the free software movement. Should the principles of free software be extended to similar arenas such as music publishing? I ask. + +"It's a mistake to transfer answers from one thing to another," says Stallman, contrasting songs with software programs. "The right approach is to look at each type of work and see what conclusion you get." + +When it comes to copyrighted works, Stallman says he divides the world into three categories. The first category involves "functional" works-e.g., software programs, dictionaries, and textbooks. The second category involves works that might best be described as "testimonial"-e.g., scientific papers and historical documents. Such works serve a purpose that would be undermined if subsequent readers or authors were free to modify the work at will. The final category involves works of personal expression-e.g., diaries, journals, and autobiographies. To modify such documents would be to alter a person's recollections or point of view-action Stallman considers ethically unjustifiable. + +Of the three categories, the first should give users the unlimited right to make modified versions, while the second and third should regulate that right according to the will of the original author. Regardless of category, however, the freedom to copy and redistribute noncommercially should remain unabridged at all times, Stallman insists. If that means giving Internet users the right to generate a hundred copies of an article, image, song, or book and then email the copies to a hundred strangers, so be it. "It's clear that private occasional redistribution must be permitted, because only a police state can stop that," Stallman says. "It's antisocial to come between people and their friends. Napster has convinced me that we also need to permit, must permit, even noncommercial redistribution to the public for the fun of it. Because so many people want to do that and find it so useful." + +When I ask whether the courts would accept such a permissive outlook, Stallman cuts me off. + +"That's the wrong question," he says. "I mean now you've changed the subject entirely from one of ethics to one of interpreting laws. And those are two totally different questions in the same field. It's useless to jump from one to the other. How the courts would interpret the existing laws is mainly in a harsh way, because that's the way these laws have been bought by publishers." + +The comment provides an insight into Stallman's political philosophy: just because the legal system currently backs up businesses' ability to treat copyright as the software equivalent of land title doesn't mean computer users have to play the game according to those rules. Freedom is an ethical issue, not a legal issue. "I'm looking beyond what the existing laws are to what they should be," Stallman says. "I'm not trying to draft legislation. I'm thinking about what should the law do? I consider the law prohibiting the sharing of copies with your friend the moral equivalent of Jim Crow. It does not deserve respect." + +The invocation of Jim Crow prompts another question. How much influence or inspiration does Stallman draw from past political leaders? Like the civil-rights movement of the 1950s and 1960s, his attempt to drive social change is based on an appeal to timeless values: freedom, justice, and fair play. + +Stallman divides his attention between my analogy and a particularly tangled strand of hair. When I stretch the analogy to the point where I'm comparing Stallman with Dr. Martin Luther King, Jr., Stallman, after breaking off a split end and popping it into his mouth, cuts me off. + +"I'm not in his league, but I do play the same game," he says, chewing. + +I suggest Malcolm X as another point of comparison. Like the former Nation of Islam spokesperson, Stallman has built up a reputation for courting controversy, alienating potential allies, and preaching a message favoring self-sufficiency over cultural integration. + +Chewing on another split end, Stallman rejects the comparison. "My message is closer to King's message," he says. "It's a universal message. It's a message of firm condemnation of certain practices that mistreat others. It's not a message of hatred for anyone. And it's not aimed at a narrow group of people. I invite anyone to value freedom and to have freedom." + +Even so, a suspicious attitude toward political alliances remains a fundamental Stallman character trait. In the case of his well-publicized distaste for the term "open source," the unwillingness to participate in recent coalition-building projects seems understandable. As a man who has spent the last two decades stumping on the behalf of free software, Stallman's political capital is deeply invested in the term. Still, comments such as the "Han Solo" wisecrack at the 1999 LinuxWorld have only reinforced the Stallman's reputation in the software industry as a disgrunted mossback unwilling to roll with political or marketing trends. + +"I admire and respect Richard for all the work he's done," says Red Hat president Robert Young, summing up Stallman's paradoxical political nature. "My only critique is that sometimes Richard treats his friends worse than his enemies." + +Stallman's unwillingness to seek alliances seems equally perplexing when you consider his political interests outside of the free software movement. Visit Stallman's offices at MIT, and you instantly find a clearinghouse of left-leaning news articles covering civil-rights abuses around the globe. Visit his web site, and you'll find diatribes on the Digital Millennium Copyright Act, the War on Drugs, and the World Trade Organization. + +Given his activist tendencies, I ask, why hasn't Stallman sought a larger voice? Why hasn't he used his visibility in the hacker world as a platform to boost rather than reduce his political voice. + +Stallman lets his tangled hair drop and contemplates the question for a moment. + +"I hesitate to exaggerate the importance of this little puddle of freedom," he says. "Because the more well-known and conventional areas of working for freedom and a better society are tremendously important. I wouldn't say that free software is as important as they are. It's the responsibility I undertook, because it dropped in my lap and I saw a way I could do something about it. But, for example, to end police brutality, to end the war on drugs, to end the kinds of racism we still have, to help everyone have a comfortable life, to protect the rights of people who do abortions, to protect us from theocracy, these are tremendously important issues, far more important than what I do. I just wish I knew how to do something about them." + +Once again, Stallman presents his political activity as a function of personal confidence. Given the amount of time it has taken him to develop and hone the free software movement's core tenets, Stallman is hesitant to jump aboard any issues or trends that might transport him into uncharted territory. + +"I wish I knew I how to make a major difference on those bigger issues, because I would be tremendously proud if I could, but they're very hard and lots of people who are probably better than I am have been working on them and have gotten only so far," he says. "But as I see it, while other people were defending against these big visible threats, I saw another threat that was unguarded. And so I went to defend against that threat. It may not be as big a threat, but I was the only one there." + +Chewing a final split end, Stallman suggests paying the check. Before the waiter can take it away, however, Stallman pulls out a white-colored dollar bill and throws it on the pile. The bill looks so clearly counterfeit, I can't help but pick it up and read it. Sure enough, it is counterfeit. Instead of bearing the image of a George Washington or Abe Lincoln, the bill's front side bears the image of a cartoon pig. Instead of the United States of America, the banner above the pig reads "United Swines of Avarice." The bill is for zero dollars, and when the waiter picks up the money, Stallman makes sure to tug on his sleeve. + +"I added an extra zero to your tip," Stallman says, yet another half smile creeping across his lips. + +The waiter, uncomprehending or fooled by the look of the bill, smiles and scurries away. + +"I think that means we're free to go," Stallman says. + + +Chapter 6 +The Emacs Commune +The AI Lab of the 1970s was by all accounts a special place. Cutting-edge projects and top-flight researchers gave it an esteemed position in the world of computer science. The internal hacker culture and its anarchic policies lent a rebellious mystique as well. Only later, when many of the lab's scientists and software superstars had departed, would hackers fully realize the unique and ephemeral world they had once inhabited. + +"It was a bit like the Garden of Eden," says Stallman, summing up the lab and its software-sharing ethos in a 1998 Forbes article. "It hadn't occurred to us not to cooperate."1 + +Such mythological descriptions, while extreme, underline an important fact. The ninth floor of 545 Tech Square was more than a workplace for many. For hackers such as Stallman, it was home. + +The word "home" is a weighted term in the Stallman lexicon. In a pointed swipe at his parents, Stallman, to this day, refuses to acknowledge any home before Currier House, the dorm he lived in during his days at Harvard. He has also been known to describe leaving that home in tragicomic terms. Once, while describing his years at Harvard, Stallman said his only regret was getting kicked out. It wasn't until I asked Stallman what precipitated his ouster, that I realized I had walked into a classic Stallman setup line. + +"At Harvard they have this policy where if you pass too many classes they ask you to leave," Stallman says. + +With no dorm and no desire to return to New York, Stallman followed a path blazed by Greenblatt, Gosper, Sussman, and the many other hackers before him. Enrolling at MIT as a grad student, Stallman rented an apartment in nearby Cambridge but soon viewed the AI Lab itself as his de facto home. In a 1986 speech, Stallman recalled his memories of the AI Lab during this period: + + I may have done a little bit more living at the lab than most people, because every year or two for some reason or other I'd have no apartment and I would spend a few months living at the lab. And I've always found it very comfortable, as well as nice and cool in the summer. But it was not at all uncommon to find people falling asleep at the lab, again because of their enthusiasm; you stay up as long as you possibly can hacking, because you just don't want to stop. And then when you're completely exhausted, you climb over to the nearest soft horizontal surface. A very informal atmosphere.2 + +The lab's home-like atmosphere could be a problem at times. What some saw as a dorm, others viewed as an electronic opium den. In the 1976 book Computer Power and Human Reason, MIT researcher Joseph Weizenbaum offered a withering critique of the " computer bum," Weizenbaum's term for the hackers who populated computer rooms such as the AI Lab. "Their rumpled clothes, their unwashed hair and unshaved faces, and their uncombed hair all testify that they are oblivious to their bodies and to the world in which they move," Weizenbaum wrote. "[Computer bums] exist, at least when so engaged, only through and for the computers."3 + +Almost a quarter century after its publication, Stallman still bristles when hearing Weizenbaum's "computer bum" description, discussing it in the present tense as if Weizenbaum himself was still in the room. "He wants people to be just professionals, doing it for the money and wanting to get away from it and forget about it as soon as possible," Stallman says. "What he sees as a normal state of affairs, I see as a tragedy." + +Hacker life, however, was not without tragedy. Stallman characterizes his transition from weekend hacker to full-time AI Lab denizen as a series of painful misfortunes that could only be eased through the euphoria of hacking. As Stallman himself has said, the first misfortune was his graduation from Harvard. Eager to continue his studies in physics, Stallman enrolled as a graduate student at MIT. The choice of schools was a natural one. Not only did it give Stallman the chance to follow the footsteps of great MIT alumni: William Shockley ('36), Richard P. Feynman ('39), and Murray Gell-Mann ('51), it also put him two miles closer to the AI Lab and its new PDP-10 computer. "My attention was going toward programming, but I still thought, well, maybe I can do both," Stallman says. + +Toiling in the fields of graduate-level science by day and programming in the monastic confines of the AI Lab by night, Stallman tried to achieve a perfect balance. The fulcrum of this geek teeter-totter was his weekly outing with the folk-dance troupe, his one social outlet that guaranteed at least a modicum of interaction with the opposite sex. Near the end of that first year at MIT, however, disaster struck. A knee injury forced Stallman to drop out of the troupe. At first, Stallman viewed the injury as a temporary problem, devoting the spare time he would have spent dancing to working at the AI Lab even more. By the end of the summer, when the knee still ached and classes reconvened, Stallman began to worry. "My knee wasn't getting any better," Stallman recalls, "which meant I had to stop dancing completely. I was heartbroken." + +With no dorm and no dancing, Stallman's social universe imploded. Like an astronaut experiencing the aftereffects of zero-gravity, Stallman found that his ability to interact with nonhackers, especially female nonhackers, had atrophied significantly. After 16 weeks in the AI Lab, the self confidence he'd been quietly accumulating during his 4 years at Harvard was virtually gone. + +"I felt basically that I'd lost all my energy," Stallman recalls. "I'd lost my energy to do anything but what was most immediately tempting. The energy to do something else was gone. I was in total despair." + +Stallman retreated from the world even further, focusing entirely on his work at the AI Lab. By October, 1975, he dropped out of MIT, never to go back. Software hacking, once a hobby, had become his calling. + +Looking back on that period, Stallman sees the transition from full-time student to full-time hacker as inevitable. Sooner or later, he believes, the siren's call of computer hacking would have overpowered his interest in other professional pursuits. "With physics and math, I could never figure out a way to contribute," says Stallman, recalling his struggles prior to the knee injury. "I would have been proud to advance either one of those fields, but I could never see a way to do that. I didn't know where to start. With software, I saw right away how to write things that would run and be useful. The pleasure of that knowledge led me to want to do it more." + +Stallman wasn't the first to equate hacking with pleasure. Many of the hackers who staffed the AI Lab boasted similar, incomplete academic rČsumČs. Most had come in pursuing degrees in math or electrical engineering only to surrender their academic careers and professional ambitions to the sheer exhilaration that came with solving problems never before addressed. Like St. Thomas Aquinas, the scholastic known for working so long on his theological summae that he sometimes achieved spiritual visions, hackers reached transcendent internal states through sheer mental focus and physical exhaustion. Although Stallman shunned drugs, like most hackers, he enjoyed the "high" that came near the end of a 20-hour coding bender. + +Perhaps the most enjoyable emotion, however, was the sense of personal fulfillment. When it came to hacking, Stallman was a natural. A childhood's worth of late-night study sessions gave him the ability to work long hours with little sleep. As a social outcast since age 10, he had little difficulty working alone. And as a mathematician with built-in gift for logic and foresight, Stallman possessed the ability to circumvent design barriers that left most hackers spinning their wheels. + +"He was special," recalls Gerald Sussman, an MIT faculty member and former AI Lab researcher. Describing Stallman as a "clear thinker and a clear designer," Sussman employed Stallman as a research-project assistant beginning in 1975. The project was complex, involving the creation of an AI program that could analyze circuit diagrams. Not only did it involve an expert's command of Lisp, a programming language built specifically for AI applications, but it also required an understanding of how a human might approach the same task. + +When he wasn't working on official projects such as Sussman's automated circuit-analysis program, Stallman devoted his time to pet projects. It was in a hacker's best interest to improve the lab's software infrastructure, and one of Stallman's biggest pet projects during this period was the lab's editor program TECO. + +The story of Stallman's work on TECO during the 1970s is inextricably linked with Stallman's later leadership of the free software movement. It is also a significant stage in the history of computer evolution, so much so that a brief recapitulation of that evolution is necessary. During the 1950s and 1960s, when computers were first appearing at universities, computer programming was an incredibly abstract pursuit. To communicate with the machine, programmers created a series of punch cards, with each card representing an individual software command. Programmers would then hand the cards over to a central system administrator who would then insert them, one by one, into the machine, waiting for the machine to spit out a new set of punch cards, which the programmer would then decipher as output. This process, known as " batch processing," was cumbersome and time consuming. It was also prone to abuses of authority. One of the motivating factors behind hackers' inbred aversion to centralization was the power held by early system operators in dictating which jobs held top priority. + +In 1962, computer scientists and hackers involved in MIT's Project MAC, an early forerunner of the AI Lab, took steps to alleviate this frustration. Time-sharing, originally known as "time stealing," made it possible for multiple programs to take advantage of a machine's operational capabilities. Teletype interfaces also made it possible to communicate with a machine not through a series of punched holes but through actual text. A programmer typed in commands and read the line-by-line output generated by the machine. + +During the late 1960s, interface design made additional leaps. In a famous 1968 lecture, Doug Engelbart, a scientist then working at the Stanford Research Institute, unveiled a prototype of the modern graphical interface. Rigging up a television set to the computer and adding a pointer device which Engelbart dubbed a " mouse," the scientist created a system even more interactive than the time-sharing system developed a MIT. Treating the video display like a high-speed printer, Engelbart's system gave a user the ability to move the cursor around the screen and see the cursor position updated by the computer in real time. The user suddenly had the ability to position text anywhere on the screen. + +Such innovations would take another two decades to make their way into the commercial marketplace. Still, by the 1970s, video screens had started to replace teletypes as display terminals, creating the potential for full-screen-as opposed to line-by-line-editing capabilities. + +One of the first programs to take advantage of this full-screen capability was the MIT AI Lab's TECO. Short for Text Editor and COrrector, the program had been upgraded by hackers from an old teletype line editor for the lab's PDP-6 machine.4 + +TECO was a substantial improvement over old editors, but it still had its drawbacks. To create and edit a document, a programmer had to enter a series of software commands specifying each edit. It was an abstract process. Unlike modern word processors, which update text with each keystroke, TECO demanded that the user enter an extended series of editing instructions followed by an "end of command" sequence just to change the text.Over time, a hacker grew proficient enough to write entire documents in edit mode, but as Stallman himself would later point out, the process required "a mental skill like that of blindfold chess."5 + +To facilitate the process, AI Lab hackers had built a system that displayed both the "source" and "display" modes on a split screen. Despite this innovative hack, switching from mode to mode was still a nuisance. + +TECO wasn't the only full-screen editor floating around the computer world at this time. During a visit to the Stanford Artificial Intelligence Lab in 1976, Stallman encountered an edit program named E. The program contained an internal feature, which allowed a user to update display text after each command keystroke. In the language of 1970s programming, E was one of the first rudimentary WYSIWYG editors. Short for "what you see is what you get," WYSIWYG meant that a user could manipulate the file by moving through the displayed text, as opposed to working through a back-end editor program."6 + +Impressed by the hack, Stallman looked for ways to expand TECO's functionality in similar fashion upon his return to MIT. He found a TECO feature called Control-R, written by Carl Mikkelson and named after the two-key combination that triggered it. Mikkelson's hack switched TECO from its usual abstract command-execution mode to a more intuitive keystroke-by-keystroke mode. Stallman revised the feature in a subtle but significant way. He made it possible to trigger other TECO command strings, or " macros," using other, two-key combinations. Where users had once entered command strings and discarded them after entering then, Stallman's hack made it possible to save macro tricks on file and call them up at will. Mikkelson's hack had raised TECO to the level of a WYSIWYG editor. Stallman's hack had raised it to the level of a user-programmable WYSIWYG editor. "That was the real breakthrough," says Guy Steele, a fellow AI Lab hacker at the time.6 + +By Stallman's own recollection, the macro hack touched off an explosion of further innovation. "Everybody and his brother was writing his own collection of redefined screen-editor commands, a command for everything he typically liked to do," Stallman would later recall. "People would pass them around and improve them, making them more powerful and more general. The collections of redefinitions gradually became system programs in their own right."6 + +So many people found the macro innovations useful and had incorporated it into their own TECO programs that the TECO editor had become secondary to the macro mania it inspired. "We started to categorize it mentally as a programming language rather than as an editor," Stallman says. Users were experiencing their own pleasure tweaking the software and trading new ideas.6 + +Two years after the explosion, the rate of innovation began to exhibit dangerous side effects. The explosive growth had provided an exciting validation of the collaborative hacker approach, but it had also led to over-complexity. "We had a Tower of Babel effect," says Guy Steele. + +The effect threatened to kill the spirit that had created it, Steele says. Hackers had designed ITS to facilitate programmers' ability to share knowledge and improve each other's work. That meant being able to sit down at another programmer's desk, open up a programmer's work and make comments and modifications directly within the software. "Sometimes the easiest way to show somebody how to program or debug something was simply to sit down at the terminal and do it for them," explains Steele. + +The macro feature, after its second year, began to foil this capability. In their eagerness to embrace the new full-screen capabilities, hackers had customized their versions of TECO to the point where a hacker sitting down at another hacker's terminal usually had to spend the first hour just figuring out what macro commands did what. + +Frustrated, Steele took it upon himself to the solve the problem. He gathered together the four different macro packages and began assembling a chart documenting the most useful macro commands. In the course of implementing the design specified by the chart, Steele says he attracted Stallman's attention. + +"He started looking over my shoulder, asking me what I was doing," recalls Steele. + +For Steele, a soft-spoken hacker who interacted with Stallman infrequently, the memory still sticks out. Looking over another hacker's shoulder while he worked was a common activity at the AI Lab. Stallman, the TECO maintainer at the lab, deemed Steele's work "interesting" and quickly set off to complete it. + +"As I like to say, I did the first 0.001 percent of the implementation, and Stallman did the rest," says Steele with a laugh. + +The project's new name, Emacs, came courtesy of Stallman. Short for "editing macros," it signified the evolutionary transcendence that had taken place during the macros explosion two years before. It also took advantage of a gap in the software programming lexicon. Noting a lack of programs on ITS starting with the letter "E," Stallman chose Emacs, making it possible to reference the program with a single letter. Once again, the hacker lust for efficiency had left its mark.6 + +In the course of developing a standard system of macro commands, Stallman and Steele had to traverse a political tightrope. In creating a standard program, Stallman was in clear violation of the fundamental hacker tenet-"promote decentralization." He was also threatening to hobble the very flexibility that had fueled TECO's explosive innovation in the first place. + +"On the one hand, we were trying to make a uniform command set again; on the other hand, we wanted to keep it open ended, because the programmability was important," recalls Steele. + +To solve the problem, Stallman, Steele, and fellow hackers David Moon and Dan Weinreib limited their standardization effort to the WYSIWYG commands that controlled how text appeared on-screen. The rest of the Emacs effort would be devoted to retaining the program's Tinker Toy-style extensibility. + +Stallman now faced another conundrum: if users made changes but didn't communicate those changes back to the rest of the community, the Tower of Babel effect would simply emerge in other places. Falling back on the hacker doctrine of sharing innovation, Stallman embedded a statement within the source code that set the terms of use. Users were free to modify and redistribute the code on the condition that they gave back all the extensions they made. Stallman dubbed it the " Emacs Commune." Just as TECO had become more than a simple editor, Emacs had become more than a simple software program. To Stallman, it was a social contract. In an early memo documenting the project, Stallman spelled out the contract terms. "EMACS," he wrote, "was distributed on a basis of communal sharing, which means that all improvements must be given back to me to be incorporated and distributed."7 + +Not everybody accepted the contract. The explosive innovation continued throughout the decade, resulting in a host of Emacs-like programs with varying degrees of cross-compatibility. A few cited their relation to Stallman's original Emacs with humorously recursive names: Sine (Sine is not Emacs), Eine (Eine is not Emacs), and Zwei (Zwei was Eine initially). As a devoted exponent of the hacker ethic, Stallman saw no reason to halt this innovation through legal harassment. Still, the fact that some people would so eagerly take software from the community chest, alter it, and slap a new name on the resulting software displayed a stunning lack of courtesy. + +Such rude behavior was reflected against other, unsettling developments in the hacker community. Brian Reid's 1979 decision to embed "time bombs" in Scribe, making it possible for Unilogic to limit unpaid user access to the software, was a dark omen to Stallman. "He considered it the most Nazi thing he ever saw in his life," recalls Reid. Despite going on to later Internet fame as the cocreator of the Usenet alt heirarchy, Reid says he still has yet to live down that 1979 decision, at least in Stallman's eyes. "He said that all software should be free and the prospect of charging money for software was a crime against humanity."8 + +Although Stallman had been powerless to head off Reid's sale, he did possess the ability to curtail other forms of behavior deemed contrary to the hacker ethos. As central source-code maintainer for the Emacs "commune," Stallman began to wield his power for political effect. During his final stages of conflict with the administrators at the Laboratory for Computer Science over password systems, Stallman initiated a software " strike," 9 refusing to send lab members the latest version of Emacs until they rejected the security system on the lab's computers. The move did little to improve Stallman's growing reputation as an extremist, but it got the point across: commune members were expected to speak up for basic hacker values. + +"A lot of people were angry with me, saying I was trying to hold them hostage or blackmail them, which in a sense I was," Stallman would later tell author Steven Levy. "I was engaging in violence against them because I thought they were engaging in violence to everyone at large."9 + +Over time, Emacs became a sales tool for the hacker ethic. The flexibility Stallman and built into the software not only encouraged collaboration, it demanded it. Users who didn't keep abreast of the latest developments in Emacs evolution or didn't contribute their contributions back to Stallman ran the risk of missing out on the latest breakthroughs. And the breakthroughs were many. Twenty years later, users had modified Emacs for so many different uses-using it as a spreadsheet, calculator, database, and web browser-that later Emacs developers adopted an overflowing sink to represent its versatile functionality. "That's the idea that we wanted to convey," says Stallman. "The amount of stuff it has contained within it is both wonderful and awful at the same time." + +Stallman's AI Lab contemporaries are more charitable. Hal Abelson, an MIT grad student who worked with Stallman during the 1970s and would later assist Stallman as a charter boardmember of the Free Software Foundation, describes Emacs as "an absolutely brilliant creation." In giving programmers a way to add new software libraries and features without messing up the system, Abelson says, Stallman paved the way for future large-scale collaborative software projects. "Its structure was robust enough that you'd have people all over the world who were loosely collaborating [and] contributing to it," Abelson says. "I don't know if that had been done before."10 + +Guy Steele expresses similar admiration. Currently a research scientist for Sun Microsystems, he remembers Stallman primarily as a "brilliant programmer with the ability to generate large quantities of relatively bug-free code." Although their personalities didn't exactly mesh, Steele and Stallman collaborated long enough for Steele to get a glimpse of Stallman's intense coding style. He recalls a notable episode in the late 1970s when the two programmers banded together to write the editor's "pretty print" feature. Originally conceived by Steele, pretty print was another keystroke-triggerd feature that reformatted Emacs' source code so that it was both more readable and took up less space, further bolstering the program's WYSIWIG qualities. The feature was strategic enough to attract Stallman's active interest, and it wasn't long before Steele wrote that he and Stallman were planning an improved version. + +"We sat down one morning," recalls Steele. "I was at the keyboard, and he was at my elbow," says Steele. "He was perfectly willing to let me type, but he was also telling me what to type. + +The programming session lasted 10 hours. Throughout that entire time, Steele says, neither he nor Stallman took a break or made any small talk. By the end of the session, they had managed to hack the pretty print source code to just under 100 lines. "My fingers were on the keyboard the whole time," Steele recalls, "but it felt like both of our ideas were flowing onto the screen. He told me what to type, and I typed it." + +The length of the session revealed itself when Steele finally left the AI Lab. Standing outside the building at 545 Tech Square, he was surprised to find himself surrounded by nighttime darkness. As a programmer, Steele was used to marathon coding sessions. Still, something about this session was different. Working with Stallman had forced Steele to block out all external stimuli and focus his entire mental energies on the task at hand. Looking back, Steele says he found the Stallman mind-meld both exhilarating and scary at the same time. "My first thought afterward was: it was a great experience, very intense, and that I never wanted to do it again in my life." + + +Chapter 7 +A Stark Moral Choice +On September 27, 1983, computer programmers logging on to the Usenet newsgroup net.unix-wizards encountered an unusual message. Posted in the small hours of the morning, 12:30 a.m. to be exact, and signed by rms@mit-oz, the message's subject line was terse but attention-grabbing. "New UNIX implementation," it read. Instead of introducing a newly released version of Unix, however, the message's opening paragraph issued a call to arms: + + Starting this Thanksgiving I am going to write a complete Unix-compatible software system called GNU (for Gnu's Not Unix), and give it away free to everyone who can use it. Contributions of time, money, programs and equipment are greatly needed.1 + +To an experienced Unix developer, the message was a mixture of idealism and hubris. Not only did the author pledge to rebuild the already mature Unix operating system from the ground up, he also proposed to improve it in places. The new GNU system, the author predicted, would carry all the usual components-a text editor, a shell program to run Unix-compatible applications, a compiler, "and a few other things."1 It would also contain many enticing features that other Unix systems didn't yet offer: a graphic user interface based on the Lisp programming language, a crash-proof file system, and networking protocols built according to MIT's internal networking system. + +"GNU will be able to run Unix programs, but will not be identical to Unix," the author wrote. "We will make all improvements that are convenient, based on our experience with other operating systems." + +Anticipating a skeptical response on some readers' part, the author made sure to follow up his operating-system outline with a brief biographical sketch titled, "Who am I?": + + I am Richard Stallman, inventor of the original much-imitated EMACS editor, now at the Artificial Intelligence Lab at MIT. I have worked extensively on compilers, editors, debuggers, command interpreters, the Incompatible Timesharing System and the Lisp Machine operating system. I pioneered terminal-independent display support in ITS. In addition I have implemented one crashproof file system and two window systems for Lisp machines.1 + +As fate would have it, Stallman's fanciful GNU Project missed its Thanksgiving launch date. By January, 1984, however, Stallman made good on his promise and fully immersed himself in the world of Unix software development. For a software architect raised on ITS, it was like designing suburban shopping malls instead of Moorish palaces. Even so, building a Unix-like operating system had its hidden advantages. ITS had been powerful, but it also possessed an Achilles' heel: MIT hackers had designed it to take specific advantage of the DEC-built PDP line. When AI Lab administrators elected to phase out the lab's powerful PDP-10 machine in the early 1980s, the operating system that hackers once likened to a vibrant city became an instant ghost town. Unix, on the other hand, was designed for mobility and long-term survival. Originally developed by junior scientists at AT&T, the program had slipped out under corporate-management radar, finding a happy home in the cash-strapped world of academic computer systems. With fewer resources than their MIT brethren, Unix developers had customized the software to ride atop a motley assortment of hardware systems: everything from the 16-bit PDP-11-a machine considered fit for only small tasks by most AI Lab hackers-to 32-bit mainframes such as the VAX 11/780. By 1983, a few companies, most notably Sun Microsystems, were even going so far as to develop a new generation of microcomputers, dubbed "workstations," to take advantage of the increasingly ubiquitous operating system. + +To facilitate this process, the developers in charge of designing the dominant Unix strains made sure to keep an extra layer of abstraction between the software and the machine. Instead of tailoring the operating system to take advantage of a specific machine's resources-as the AI Lab hackers had done with ITS and the PDP-10-Unix developers favored a more generic, off-the-rack approach. Focusing more on the interlocking standards and specifications that held the operating system's many subcomponents together, rather than the actual components themselves, they created a system that could be quickly modified to suit the tastes of any machine. If a user quibbled with a certain portion, the standards made it possible to pull out an individual subcomponent and either fix it or replace it with something better. Simply put, what the Unix approach lacked in terms of style or aesthetics, it more than made up for in terms of flexibility and economy, hence its rapid adoption. 2 + +Stallman's decision to start developing the GNU system was triggered by the end of the ITS system that the AI Lab hackers had nurtured for so long. The demise of ITS had been a traumatic blow to Stallman. Coming on the heels of the Xerox laser printer episode, it offered further evidence that the AI Lab hacker culture was losing its immunity to business practices in the outside world. + +Like the software code that composed it, the roots of ITS' demise stretched way back. Defense spending, long a major font for computer-science research, had dried up during the post-Vietnam years. In a desperate quest for new funds, laboratories and universities turned to the private sector. In the case of the AI Lab, winning over private investors was an easy sell. Home to some of the most ambitious computer-science projects of the post-war era, the lab became a quick incubator of technology. Indeed, by 1980, most of the lab's staff, including many hackers, were dividing its time between Institute and commercial projects. + +What at first seemed like a win-win deal-hackers got to work on the best projects, giving the lab first look at many of the newest computer technologies coming down the pike-soon revealed itself as a Faustian bargain. The more time hackers devoted to cutting-edge commercial projects, the less time they had to devote to general maintenance on the lab's baroque software infrastructure. Soon, companies began hiring away hackers outright in an attempt to monopolize their time and attention. With fewer hackers to mind the shop, programs and machines took longer to fix. Even worse, Stallman says, the lab began to undergo a "demographic change." The hackers who had once formed a vocal minority within the AI Lab were losing membership while "the professors and the students who didn't really love the [PDP-10] were just as numerous as before."3 + +The breaking point came in 1982. That was the year the lab's administration decided to upgrade its main computer, the PDP-10. Digital, the corporation that manufactured the PDP-10, had discontinued the line. Although the company still offered a high-powered mainframe, dubbed the KL-10, the new machine required a drastic rewrite or "port" of ITS if hackers wanted to continue running the same operating system. Fearful that the lab had lost its critical mass of in-house programming talent, AI Lab faculty members pressed for Twenex, a commercial operating system developed by Digital. Outnumbered, the hackers had no choice but to comply. + +"Without hackers to maintain the system, [faculty members] said, `We're going to have a disaster; we must have commercial software,'" Stallman would recall a few years later. "They said, `We can expect the company to maintain it.' It proved that they were utterly wrong, but that's what they did."3 + +At first, hackers viewed the Twenex system as yet another authoritarian symbol begging to be subverted. The system's name itself was a protest. Officially dubbed TOPS-20 by DEC, it was a successor to TOPS-10, a commercial operating system DEC marketed for the PDP-10. Bolt Beranek Newman had deveoped an improved version, dubbed Tenex, which TOPS-20 drew upon.4 Stallman, the hacker who coined the Twenex term, says he came up with the name as a way to avoid using the TOPS-20 name. "The system was far from tops, so there was no way I was going to call it that," Stallman recalls. "So I decided to insert a `w' in the Tenex name and call it Twenex." + +The machine that ran the Twenex/TOPS-20 system had its own derisive nickname: Oz. According to one hacker legend, the machine got its nickname because it required a smaller PDP-11 machine to power its terminal. One hacker, upon viewing the KL-10-PDP-11 setup for the first time, likened it to the wizard's bombastic onscreen introduction in the Wizard of Oz. "I am the great and powerful Oz," the hacker intoned. "Pay no attention to the PDP-11 behind that console."5 + +If hackers laughed when they first encountered the KL-10, their laughter quickly died when they encountered Twenex. Not only did Twenex boast built-in security, but the system's software engineers had designed the tools and applications with the security system in mind. What once had been a cat-and-mouse game over passwords in the case of the Laboratory for Computer Science's security system, now became an out-and-out battle over system management. System administrators argued that without security, the Oz system was more prone to accidental crashes. Hackers argued that crashes could be better prevented by overhauling the source code. Unfortunately, the number of hackers with the time and inclination to perform this sort of overhaul had dwindled to the point that the system-administrator argument prevailed. + +Cadging passwords and deliberately crashing the system in order to glean evidence from the resulting wreckage, Stallman successfully foiled the system administrators' attempt to assert control. After one foiled "coup d'etat," Stallman issued an alert to the entire AI staff.3 + +"There has been another attempt to seize power," Stallman wrote. "So far, the aristocratic forces have been defeated." To protect his identity, Stallman signed the message "Radio Free OZ." + +The disguise was a thin one at best. By 1982, Stallman's aversion to passwords and secrecy had become so well known that users outside the AI Laboratory were using his account as a stepping stone to the ARPAnet, the research-funded computer network that would serve as a foundation for today's Internet. One such "tourist" during the early 1980s was Don Hopkins, a California programmer who learned through the hacking grapevine that all an outsider needed to do to gain access to MIT's vaunted ITS system was to log in under the initials RMS and enter the same three-letter monogram when the system requested a password. + +"I'm eternally grateful that MIT let me and many other people use their computers for free," says Hopkins. "It meant a lot to many people." + +This so-called "tourist" policy, which had been openly tolerated by MIT management during the ITS years,6 fell by the wayside when Oz became the lab's primary link to the ARPAnet. At first, Stallman continued his policy of repeating his login ID as a password so outside users could follow in his footsteps. Over time, however, the Oz's fragility prompted administrators to bar outsiders who, through sheer accident or malicious intent, might bring down the system. When those same administrators eventually demanded that Stallman stop publishing his password, Stallman, citing personal ethics, refused to do so and ceased using the Oz system altogether.3 + +"[When] passwords first appeared at the MIT AI Lab I [decided] to follow my belief that there should be no passwords," Stallman would later say. "Because I don't believe that it's really desirable to have security on a computer, I shouldn't be willing to help uphold the security regime."3 + +Stallman's refusal to bow before the great and powerful Oz symbolized the growing tension between hackers and AI Lab management during the early 1980s. This tension paled in comparison to the conflict that raged within the hacker community itself. By the time the KL-10 arrived, the hacker community had already divided into two camps. The first centered around a software company called Symbolics, Inc. The second centered around Symbolics chief rival, Lisp Machines, Inc. (LMI). Both companies were in a race to market the Lisp Machine, a device built to take full advantage of the Lisp programming language. + +Created by artificial-intelligence research pioneer John McCarthy, a MIT artificial-intelligence researcher during the late 1950s, Lisp is an elegant language well-suited for programs charged with heavy-duty sorting and processing. The language's name is a shortened version of LISt Processing. Following McCarthy's departure to the Stanford Artificial Intelligence Laboratory, MIT hackers refined the language into a local dialect dubbed MACLISP. The "MAC" stood for Project MAC, the DARPA-funded research project that gave birth to the AI Lab and the Laboratory for Computer Science. Led by AI Lab arch-hacker Richard Greenblatt, AI Lab programmers during the 1970s built up an entire Lisp-based operating system, dubbed the Lisp Machine operating system. By 1980, the Lisp Machine project had generated two commercial spin-offs. Symbolics was headed by Russell Noftsker, a former AI Lab administrator, and Lisp Machines, Inc., was headed by Greenblatt. + +The Lisp Machine software was hacker-built, meaning it was owned by MIT but available for anyone to copy as per hacker custom. Such a system limited the marketing advantage of any company hoping to license the software from MIT and market it as unique. To secure an advantage, and to bolster the aspects of the operating system that customers might consider attractive, the companies recruited various AI Lab hackers and set them working on various components of the Lisp Machine operating system outside the auspices of the AI Lab. + +The most aggressive in this strategy was Symbolics. By the end of 1980, the company had hired 14 AI Lab staffers as part-time consultants to develop its version of the Lisp Machine. Apart from Stallman, the rest signed on to help LMI.7 + +At first, Stallman accepted both companies' attempt to commercialize the Lisp machine, even though it meant more work for him. Both licensed the Lisp Machine OS source code from MIT, and it was Stallman's job to update the lab's own Lisp Machine to keep pace with the latest innovations. Although Symbolics' license with MIT gave Stallman the right to review, but not copy, Symbolics' source code, Stallman says a "gentleman's agreement" between Symbolics management and the AI Lab made it possible to borrow attractive snippets in traditional hacker fashion. + +On March 16, 1982, a date Stallman remembers well because it was his birthday, Symbolics executives decided to end this gentlemen's agreement. The move was largely strategic. LMI, the primary competition in the Lisp Machine marketplace, was essentially using a copy of the AI Lab Lisp Machine. Rather than subsidize the development of a market rival, Symbolics executives elected to enforce the letter of the license. If the AI Lab wanted its operating system to stay current with the Symbolics operating system, the lab would have to switch over to a Symbolics machine and sever its connection to LMI. + +As the person responsible for keeping up the lab's Lisp Machine, Stallman was incensed. Viewing this announcement as an "ultimatum," he retaliated by disconnecting Symbolics' microwave communications link to the laboratory. He then vowed never to work on a Symbolics machine and pledged his immediate allegiance to LMI. "The way I saw it, the AI Lab was a neutral country, like Belgium in World War I," Stallman says. "If Germany invades Belgium, Belgium declares war on Germany and sides with Britain and France." + +The circumstances of the so-called "Symbolics War" of 1982-1983 depend heavily on the source doing the telling. When Symbolics executives noticed that their latest features were still appearing in the AI Lab Lisp Machine and, by extension, the LMI Lisp machine, they installed a "spy" program on Stallman's computer terminal. Stallman says he was rewriting the features from scratch, taking advantage of the license's review clause but also taking pains to make the source code as different as possible. Symbolics executives argued otherwise and took their case to MIT administration. According to 1994 book, The Brain Makers: Genius, Ego, and Greed, and the Quest for Machines That Think, written by Harvey Newquist, the administration responded with a warning to Stallman to "stay away" from the Lisp Machine project.8 According to Stallman, MIT administrators backed Stallman up. "I was never threatened," he says. "I did make changes in my practices, though. Just to be ultra safe, I no longer read their source code. I used only the documentation and wrote the code from that." + +Whatever the outcome, the bickering solidified Stallman's resolve. With no source code to review, Stallman filled in the software gaps according to his own tastes and enlisted members of the AI Lab to provide a continuous stream of bug reports. He also made sure LMI programmers had direct access to the changes. "I was going to punish Symbolics if it was the last thing I did," Stallman says. + +Such statements are revealing. Not only do they shed light on Stallman's nonpacifist nature, they also reflect the intense level of emotion triggered by the conflict. According to another Newquist-related story, Stallman became so irate at one point that he issued an email threatening to "wrap myself in dynamite and walk into Symbolics' offices."9 Although Stallman would deny any memory of the email and still describes its existence as a "vicious rumor," he acknowledges that such thoughts did enter his head. "I definitely did have fantasies of killing myself and destroying their building in the process," Stallman says. "I thought my life was over."5 + +The level of despair owed much to what Stallman viewed as the "destruction" of his "home"-i.e., the demise of the AI Lab's close-knit hacker subculture. In a later email interview with Levy, Stallman would liken himself to the historical figure Ishi, the last surviving member of the Yahi, a Pacific Northwest tribe wiped out during the Indian wars of the 1860s and 1870s. The analogy casts Stallman's survival in epic, almost mythical, terms. In reality, however, it glosses over the tension between Stallman and his fellow AI Lab hackers prior to the Symbolics-LMI schism. Instead of seeing Symbolics as an exterminating force, many of Stallman's colleagues saw it as a belated bid for relevance. In commercializing the Lisp Machine, the company pushed hacker principles of engineer-driven software design out of the ivory-tower confines of the AI Lab and into the corporate marketplace where manager-driven design principles held sway. Rather than viewing Stallman as a holdout, many hackers saw him as a troubling anachronism. + +Stallman does not dispute this alternate view of historical events. In fact, he says it was yet another reason for the hostility triggered by the Symbolics "ultimatum." Even before Symbolics hired away most of the AI Lab's hacker staff, Stallman says many of the hackers who later joined Symbolics were shunning him. "I was no longer getting invited to go to Chinatown," Stallman recalls. "The custom started by Greenblatt was that if you went out to dinner, you went around or sent a message asking anybody at the lab if they also wanted to go. Sometime around 1980-1981, I stopped getting asked. They were not only not inviting me, but one person later confessed that he had been pressured to lie to me to keep their going away to dinner without me a secret." + +Although Stallman felt anger toward the hackers who orchestrated this petty form of ostracism, the Symbolics controversy dredged up a new kind of anger, the anger of a person about to lose his home. When Symbolics stopped sending over its source-code changes, Stallman responded by holing up in his MIT offices and rewriting each new software feature and tool from scratch. Frustrating as it may have been, it guaranteed that future Lisp Machine users had unfettered access to the same features as Symbolics users. + +It also guaranteed Stallman's legendary status within the hacker community. Already renowned for his work with Emacs, Stallman's ability to match the output of an entire team of Symbolics programmers-a team that included more than a few legendary hackers itself-still stands has one of the major human accomplishments of the Information Age, or of any age for that matter. Dubbing it a "master hack" and Stallman himself a "virtual John Henry of computer code," author Steven Levy notes that many of his Symbolics-employed rivals had no choice but to pay their idealistic former comrade grudging respect. Levy quotes Bill Gosper, a hacker who eventually went to work for Symbolics in the company's Palo Alto office, expressing amazement over Stallman's output during this period: + + I can see something Stallman wrote, and I might decide it was bad (probably not, but somebody could convince me it was bad), and I would still say, "But wait a minute-Stallman doesn't have anybody to argue with all night over there. He's working alone! It's incredible anyone could do this alone!"10 + +For Stallman, the months spent playing catch up with Symbolics evoke a mixture of pride and profound sadness. As a dyed-in-the-wool liberal whose father had served in World War II, Stallman is no pacifist. In many ways, the Symbolics war offered the rite of passage toward which Stallman had been careening ever since joining the AI Lab staff a decade before. At the same time, however, it coincided with the traumatic destruction of the AI Lab hacker culture that had nurtured Stallman since his teenage years. One day, while taking a break from writing code, Stallman experienced a traumatic moment passing through the lab's equipment room. There, Stallman encountered the hulking, unused frame of the PDP-10 machine. Startled by the dormant lights, lights that once actively blinked out a silent code indicating the status of the internal program, Stallman says the emotional impact was not unlike coming across a beloved family member's well-preserved corpse. + +"I started crying right there in the equipment room," he says. "Seeing the machine there, dead, with nobody left to fix it, it all drove home how completely my community had been destroyed." + +Stallman would have little opportunity to mourn. The Lisp Machine, despite all the furor it invoked and all the labor that had gone into making it, was merely a sideshow to the large battles in the technology marketplace. The relentless pace of computer miniaturization was bringing in newer, more powerful microprocessors that would soon incorporate the machine's hardware and software capabilities like a modern metropolis swallowing up an ancient desert village. + +Riding atop this microprocessor wave were hundreds-thousands-of commercial software programs, each protected by a patchwork of user licenses and nondisclosure agreements that made it impossible for hackers to review or share source code. The licenses were crude and ill-fitting, but by 1983 they had become strong enough to satisfy the courts and scare away would-be interlopers. Software, once a form of garnish most hardware companies gave away to make their expensive computer systems more flavorful, was quickly becoming the main dish. In their increasing hunger for new games and features, users were putting aside the traditional demand to review the recipe after every meal. + +Nowhere was this state of affairs more evident than in the realm of personal computer systems. Companies such as Apple Computer and Commodore were minting fresh millionaires selling machines with built-in operating systems. Unaware of the hacker culture and its distaste for binary-only software, many of these users saw little need to protest when these companies failed to attach the accompanying source-code files. A few anarchic adherents of the hacker ethic helped propel that ethic into this new marketplace, but for the most part, the marketplace rewarded the programmers speedy enough to write new programs and savvy enough to copyright them as legally protected works. + +One of the most notorious of these programmers was Bill Gates, a Harvard dropout two years Stallman's junior. Although Stallman didn't know it at the time, seven years before sending out his message to the n et.unix-wizards newsgroup, Gates, a budding entrepreneur and general partner with the Albuquerque-based software firm Micro-Soft, later spelled as Microsoft, had sent out his own open letter to the software-developer community. Written in response to the PC users copying Micro-Soft's software programs, Gates' " Open Letter to Hobbyists" had excoriated the notion of communal software development. + +"Who can afford to do professional work for nothing?" asked Gates. "What hobbyist can put three man-years into programming, finding all bugs, documenting his product, and distributing it for free?"11 + +Although few hackers at the AI Lab saw the missive, Gates' 1976 letter nevertheless represented the changing attitude toward software both among commercial software companies and commercial software developers. Why treat software as a zero-cost commodity when the market said otherwise? As the 1970s gave way to the 1980s, selling software became more than a way to recoup costs; it became a political statement. At a time when the Reagan Administration was rushing to dismantle many of the federal regulations and spending programs that had been built up during the half century following the Great Depression, more than a few software programmers saw the hacker ethic as anticompetitive and, by extension, un-American. At best, it was a throwback to the anticorporate attitudes of the late 1960s and early 1970s. Like a Wall Street banker discovering an old tie-dyed shirt hiding between French-cuffed shirts and double-breasted suits, many computer programmers treated the hacker ethic as an embarrassing reminder of an idealistic age. + +For a man who had spent the entire 1960s as an embarrassing throwback to the 1950s, Stallman didn't mind living out of step with his peers. As a programmer used to working with the best machines and the best software, however, Stallman faced what he could only describe as a "stark moral choice": either get over his ethical objection for " proprietary" software-the term Stallman and his fellow hackers used to describe any program that carried private copyright or end-user license that restricted copying and modification-or dedicate his life to building an alternate, nonproprietary system of software programs. Given his recent months-long ordeal with Symbolics, Stallman felt more comfortable with the latter option. "I suppose I could have stopped working on computers altogether," Stallman says. "I had no special skills, but I'm sure I could have become a waiter. Not at a fancy restaurant, probably, but I could've been a waiter somewhere." + +Being a waiter-i.e., dropping out of programming altogether-would have meant completely giving up an activity, computer programming, that had given him so much pleasure. Looking back on his life since moving to Cambridge, Stallman finds it easy to identify lengthy periods when software programming provided the only pleasure. Rather than drop out, Stallman decided to stick it out. + +An atheist, Stallman rejects notions such as fate, dharma, or a divine calling in life. Nevertheless, he does feel that the decision to shun proprietary software and build an operating system to help others do the same was a natural one. After all, it was Stallman's own personal combination of stubbornness, foresight, and coding virtuosity that led him to consider a fork in the road most others didn't know existed. In describing the decision in a chapter for the 1999 book, Open Sources, Stallman cites the spirit encapsulated in the words of the Jewish sage Hillel: + + If I am not for myself, who will be for me?If I am only for myself, what am I?If not now, when?12 + +Speaking to audiences, Stallman avoids the religious route and expresses the decision in pragmatic terms. "I asked myself: what could I, an operating-system developer, do to improve the situation? It wasn't until I examined the question for a while that I realized an operating-system developer was exactly what was needed to solve the problem." + +Once he reached that decision, Stallman says, everything else "fell into place." He would abstain from using software programs that forced him to compromise his ethical beliefs, while at the same time devoting his life to the creation of software that would make it easier for others to follow the same path. Pledging to build a free software operating system "or die trying-of old age, of course," Stallman quips, he resigned from the MIT staff in January, 1984, to build GNU. + +The resignation distanced Stallman's work from the legal auspices of MIT. Still, Stallman had enough friends and allies within the AI Lab to retain rent-free access to his MIT office. He also had the ability to secure outside consulting gigs to underwrite the early stages of the GNU Project. In resigning from MIT, however, Stallman negated any debate about conflict of interest or Institute ownership of the software. The man whose early adulthood fear of social isolation had driven him deeper and deeper into the AI Lab's embrace was now building a legal firewall between himself and that environment. + +For the first few months, Stallman operated in isolation from the Unix community as well. Although his announcement to the net.unix-wizards group had attracted sympathetic responses, few volunteers signed on to join the crusade in its early stages. + +"The community reaction was pretty much uniform," recalls Rich Morin, leader of a Unix user group at the time. "People said, `Oh, that's a great idea. Show us your code. Show us it can be done.'" + +In true hacker fashion, Stallman began looking for existing programs and tools that could be converted into GNU programs and tools. One of the first was a compiler named VUCK, which converted programs written in the popular C programming language into machine-readable code. Translated from the Dutch, the program's acronym stood for the Free University Compiler Kit. Optimistic, Stallman asked the program's author if the program was free. When the author informed him that the words "Free University" were a reference to the Vrije Universiteit in Amsterdam, Stallman was chagrined. + +"He responded derisively, stating that the university was free but the compiler was not," recalls Stallman. "I therefore decided that my first program for the GNU Project would be a multi-language, multi-platform compiler."3 + +Eventually Stallman found a Pastel language compiler written by programmers at Lawrence Livermore National Lab. According to Stallman's knowledge at the time, the compiler was free to copy and modify. Unfortunately, the program possessed a sizable design flaw: it saved each program into core memory, tying up precious space for other software activities. On mainframe systems this design flaw had been forgivable. On Unix systems it was a crippling barrier, since the machines that ran Unix were too small to handle the large files generated. Stallman made substantial progress at first, building a C-compatible frontend to the compiler. By summer, however, he had come to the conclusion that he would have to build a totally new compiler from scratch. + +In September of 1984, Stallman shelved compiler development for the near term and began searching for lower-lying fruit. He began development of a GNU version of Emacs, the program he himself had been supervising for a decade. The decision was strategic. Within the Unix community, the two native editor programs were vi, written by Sun Microsystems cofounder Bill Joy, and ed, written by Bell Labs scientist (and Unix cocreator) Ken Thompson. Both were useful and popular, but neither offered the endlessly expandable nature of Emacs. In rewriting Emacs for the Unix audience, Stallman stood a better chance of showing off his skills. It also stood to reason that Emacs users might be more attuned to the Stallman mentality. + +Looking back, Stallman says he didn't view the decision in strategic terms. "I wanted an Emacs, and I had a good opportunity to develop one." + +Once again, the notion of reinventing the wheel grated on Stallman's efficient hacker sensibilities. In writing a Unix version of Emacs, Stallman was soon following the footsteps of Carnegie Mellon graduate student James Gosling, author of a C-based version dubbed Gosling Emacs or GOSMACS. Gosling's version of Emacs included an interpreter that exploited a simplified offshoot of the Lisp language called MOCKLISP. Determined to build GNU Emacs on a similar Lisp foundation, Stallman borrowed copiously from Gosling's innovations. Although Gosling had put GOSMACS under copyright and had sold the rights to UniPress, a privately held software company, Stallman cited the assurances of a fellow developer who had participated in the early MOCKLISP interpreter. According to the developer, Gosling, while a Ph.D. student at Carnegie Mellon, had assured early collaborators that their work would remain accessible. When UniPress caught wind of Stallman's project, however, the company threatened to enforce the copyright. Once again, Stallman faced the prospect of building from the ground up. + +In the course of reverse-engineering Gosling's interpreter, Stallman would create a fully functional Lisp interpreter, rendering the need for Gosling's original interpreter moot. Nevertheless, the notion of developers selling off software rights-indeed, the very notion of developers having software rights to sell in the first place-rankled Stallman. In a 1986 speech at the Swedish Royal Technical Institute, Stallman cited the UniPress incident as yet another example of the dangers associated with proprietary software. + +"Sometimes I think that perhaps one of the best things I could do with my life is find a gigantic pile of proprietary software that was a trade secret, and start handing out copies on a street corner so it wouldn't be a trade secret any more," said Stallman. "Perhaps that would be a much more efficient way for me to give people new free software than actually writing it myself; but everyone is too cowardly to even take it."3 + +Despite the stress it generated, the dispute over Gosling's innovations would assist both Stallman and the free software movement in the long term. It would force Stallman to address the weaknesses of the Emacs Commune and the informal trust system that had allowed problematic offshoots to emerge. It would also force Stallman to sharpen the free software movement's political objectives. Following the release of GNU Emacs in 1985, Stallman issued " The GNU Manifesto," an expansion of the original announcement posted in September, 1983. Stallman included within the document a lengthy section devoted to the many arguments used by commercial and academic programmers to justify the proliferation of proprietary software programs. One argument, "Don't programmers deserve a reward for their creativity," earned a response encapsulating Stallman's anger over the recent Gosling Emacs episode: + +"If anything deserves a reward, it is social contribution," Stallman wrote. "Creativity can be a social contribution, but only in so far [sic] as society is free to use the results. If programmers deserve to be rewarded for creating innovative programs, by the same token they deserve to be punished if they restrict the use of these programs."13 + +With the release of GNU Emacs, the GNU Project finally had code to show. It also had the burdens of any software-based enterprise. As more and more Unix developers began playing with the software, money, gifts, and requests for tapes began to pour in. To address the business side of the GNU Project, Stallman drafted a few of his colleagues and formed the Free Software Foundation (FSF), a nonprofit organization dedicated to speeding the GNU Project towards its goal. With Stallman as president and various hacker allies as board members, the FSF helped provide a corporate face for the GNU Project. + +Robert Chassell, a programmer then working at Lisp Machines, Inc., became one of five charter board members at the Free Software Foundation following a dinner conversation with Stallman. Chassell also served as the organization's treasurer, a role that started small but quickly grew. + +"I think in '85 our total expenses and revenue were something in the order of $23,000, give or take," Chassell recalls. "Richard had his office, and we borrowed space. I put all the stuff, especially the tapes, under my desk. It wasn't until sometime later LMI loaned us some space where we could store tapes and things of that sort." + +In addition to providing a face, the Free Software Foundation provided a center of gravity for other disenchanted programmers. The Unix market that had seemed so collegial even at the time of Stallman's initial GNU announcement was becoming increasingly competitive. In an attempt to tighten their hold on customers, companies were starting to close off access to Unix source code, a trend that only speeded the number of inquiries into ongoing GNU software projects. The Unix wizards who once regarded Stallman as a noisy kook were now beginning to see him as a software Cassandra. + +"A lot of people don't realize, until they've had it happen to them, how frustrating it can be to spend a few years working on a software program only to have it taken away," says Chassell, summarizing the feelings and opinions of the correspondents writing in to the FSF during the early years. "After that happens a couple of times, you start to say to yourself, `Hey, wait a minute.'" + +For Chassell, the decision to participate in the Free Software Foundation came down to his own personal feelings of loss. Prior to LMI, Chassell had been working for hire, writing an introductory book on Unix for Cadmus, Inc., a Cambridge-area software company. When Cadmus folded, taking the rights to the book down with it, Chassell says he attempted to buy the rights back with no success. + +"As far as I know, that book is still sitting on shelf somewhere, unusable, uncopyable, just taken out of the system," Chassell says. "It was quite a good introduction if I may say so myself. It would have taken maybe three or four months to convert [the book] into a perfectly usable introduction to GNU/Linux today. The whole experience, aside from what I have in my memory, was lost." + +Forced to watch his work sink into the mire while his erstwhile employer struggled through bankruptcy, Chassell says he felt a hint of the anger that drove Stallman to fits of apoplexy. "The main clarity, for me, was the sense that if you want to have a decent life, you don't want to have bits of it closed off," Chassell says. "This whole idea of having the freedom to go in and to fix something and modify it, whatever it may be, it really makes a difference. It makes one think happily that after you've lived a few years that what you've done is worthwhile. Because otherwise it just gets taken away and thrown out or abandoned or, at the very least, you no longer have any relation to it. It's like losing a bit of your life." + + +Chapter 8 +St. Ignucius +The Maui High Performance Computing Center is located in a single-story building in the dusty red hills just above the town of Kihei. Framed by million-dollar views and the multimillion dollar real estate of the Silversword Golf Course, the center seems like the ultimate scientific boondoggle. Far from the boxy, sterile confines of Tech Square or even the sprawling research metropolises of Argonne, Illinois and Los Alamos, New Mexico, the MHPCC seems like the kind of place where scientists spend more time on their tans than their post-doctoral research projects. + +The image is only half true. Although researchers at the MHPCC do take advantage of the local recreational opportunities, they also take their work seriously. According to Top500.org, a web site that tracks the most powerful supercomputers in the world, the IBM SP Power3 supercomputer housed within the MHPCC clocks in at 837 billion floating-point operations per second, making it one of 25 most powerful computers in the world. Co-owned and operated by the University of Hawaii and the U.S. Air Force, the machine divides its computer cycles between the number crunching tasks associated with military logistics and high-temperature physics research. + +Simply put, the MHPCC is a unique place, a place where the brainy culture of science and engineering and the laid-back culture of the Hawaiian islands coexist in peaceful equilibrium. A slogan on the lab's 2000 web site sums it up: "Computing in paradise." + +It's not exactly the kind of place you'd expect to find Richard Stallman, a man who, when taking in the beautiful view of the nearby Maui Channel through the picture windows of a staffer's office, mutters a terse critique: "Too much sun." Still, as an emissary from one computing paradise to another, Stallman has a message to deliver, even if it means subjecting his pale hacker skin to the hazards of tropical exposure. + +The conference room is already full by the time I arrive to catch Stallman's speech. The gender breakdown is a little better than at the New York speech, 85% male, 15% female, but not by much. About half of the audience members wear khaki pants and logo-encrusted golf shirts. The other half seems to have gone native. Dressed in the gaudy flower-print shirts so popular in this corner of the world, their faces are a deep shade of ochre. The only residual indication of geek status are the gadgets: Nokia cell phones, Palm Pilots, and Sony VAIO laptops. + +Needless to say, Stallman, who stands in front of the room dressed in plain blue T-shirt, brown polyester slacks, and white socks, sticks out like a sore thumb. The fluorescent lights of the conference room help bring out the unhealthy color of his sun-starved skin. His beard and hair are enough to trigger beads of sweat on even the coolest Hawaiian neck. Short of having the words "mainlander" tattooed on his forehead, Stallman couldn't look more alien if he tried. + +As Stallman putters around the front of the room, a few audience members wearing T-shirts with the logo of the Maui FreeBSD Users Group (MFUG) race to set up camera and audio equipment. FreeBSD, a free software offshoot of the Berkeley Software Distribution, the venerable 1970s academic version of Unix, is technically a competitor to the GNU/Linux operating system. Still, in the hacking world, Stallman speeches are documented with a fervor reminiscent of the Grateful Dead and its legendary army of amateur archivists. As the local free software heads, it's up to the MFUG members to make sure fellow programmers in Hamburg, Mumbai, and Novosibirsk don't miss out on the latest pearls of RMS wisdom. + +The analogy to the Grateful Dead is apt. Often, when describing the business opportunities inherent within the free software model, Stallman has held up the Grateful Dead as an example. In refusing to restrict fans' ability to record live concerts, the Grateful Dead became more than a rock group. They became the center of a tribal community dedicated to Grateful Dead music. Over time, that tribal community became so large and so devoted that the band shunned record contracts and supported itself solely through musical tours and live appearances. In 1994, the band's last year as a touring act, the Grateful Dead drew $52 million in gate receipts alone.1 + +While few software companies have been able to match that success, the tribal aspect of the free software community is one reason many in the latter half of the 1990s started to accept the notion that publishing software source code might be a good thing. Hoping to build their own loyal followings, companies such as IBM, Sun Microsystems, and Hewlett Packard have come to accept the letter, if not the spirit, of the Stallman free software message. Describing the GPL as the information-technology industry's "Magna Carta," ZDNet software columnist Evan Leibovitch sees the growing affection for all things GNU as more than just a trend. "This societal shift is letting users take back control of their futures," Leibovitch writes. "Just as the Magna Carta gave rights to British subjects, the GPL enforces consumer rights and freedoms on behalf of the users of computer software."2 + +The tribal aspect of the free software community also helps explain why 40-odd programmers, who might otherwise be working on physics projects or surfing the Web for windsurfing buoy reports, have packed into a conference room to hear Stallman speak. + +Unlike the New York speech, Stallman gets no introduction. He also offers no self-introduction. When the FreeBSD people finally get their equipment up and running, Stallman simply steps forward, starts speaking, and steamrolls over every other voice in the room. + +"Most of the time when people consider the question of what rules society should have for using software, the people considering it are from software companies, and they consider the question from a self-serving perspective," says Stallman, opening his speech. "What rules can we impose on everybody else so they have to pay us lots of money? I had the good fortune in the 1970s to be part of a community of programmers who shared software. And because of this I always like to look at the same issue from a different direction to ask: what kind of rules make possible a good society that is good for the people who are in it? And therefore I reach completely different answers." + +Once again, Stallman quickly segues into the parable of the Xerox laser printer, taking a moment to deliver the same dramatic finger-pointing gestures to the crowd. He also devotes a minute or two to the GNU/Linux name. + +"Some people say to me, `Why make such a fuss about getting credit for this system? After all, the important thing is the job is done, not whether you get recognition for it.' Well, this would be wise advice if it were true. But the job wasn't to build an operating system; the job is to spread freedom to the users of computers. And to do that we have to make it possible to do everything with computers in freedom."3 + +Adds Stallman, "There's a lot more work to do." + +For some in the audience, this is old material. For others, it's a little arcane. When a member of the golf-shirt contingent starts dozing off, Stallman stops the speech and asks somebody to wake the person up. + +"Somebody once said my voice was so soothing, he asked if I was some kind of healer," says Stallman, drawing a quick laugh from the crowd. "I guess that probably means I can help you drift gently into a blissful, relaxing sleep. And some of you might need that. I guess I shouldn't object if you do. If you need to sleep, by all means do." + +The speech ends with a brief discussion of software patents, a growing issue of concern both within the software industry and within the free software community. Like Napster, software patents reflect the awkward nature of applying laws and concepts written for the physical world to the frictionless universe of information technology. The difference between protecting a program under copyright and protecting a program under software patents is subtle but significant. In the case of copyright, a software creator can restrict duplication of the source code but not duplication of the idea or functionality that the source code addresses. In other words, if a developer chooses not to use a software program under the original developer's terms, that second developer is still free to reverse-engineer the program-i.e., duplicate the software program's functionality by rewriting the source code from scratch. Such duplication of ideas is common within the commercial software industry, where companies often isolate reverse-engineering teams to head off accusations of corporate espionage or developer hanky-panky. In the jargon of modern software development, companies refer to this technique as "clean room" engineering. + +Software patents work differently. According to the U.S. Patent Office, companies and individuals may secure patents for innovative algorithms provided they submit their claims to a public review. In theory, this allows the patent-holder to trade off disclosure of their invention for a limited monopoly of a minimum of 20 years after the patent filing. In practice, the disclosure is of limited value, since the operation of the program is often self-evident. Unlike copyright, a patent gives its holder the ability to head off the independent development of software programs with the same or similar functionality. + +In the software industry, where 20 years can cover the entire life cycle of a marketplace, patents take on a strategic weight. Where companies such as Microsoft and Apple once battled over copyright and the "look and feel" of various technologies, today's Internet companies use patents as a way to stake out individual applications and business models, the most notorious example being Amazon.com's 2000 attempt to patent the company's "one-click" online shopping process. For most companies, however, software patents have become a defensive tool, with cross-licensing deals balancing one set of corporate patents against another in a tense form of corporate detente. Still, in a few notable cases of computer encryption and graphic imaging algorithms, software vendors have successfully stifled rival technologies. + +For Stallman, the software-patent issue dramatizes the need for eternal hacker vigilance. It also underlines the importance of stressing the political benefits of free software programs over the competitive benefits. Pointing to software patents' ability to create sheltered regions in the marketplace, Stallman says competitive performance and price, two areas where free software operating systems such as GNU/Linux and FreeBSD already hold a distinct advantage over their proprietary counterparts, are red herrings compared to the large issues of user and developer freedom. + +"It's not because we don't have the talent to make better software," says Stallman. "It's because we don't have the right. Somebody has prohibited us from serving the public. So what's going to happen when users encounter these gaps in free software? Well, if they have been persuaded by the open source movement that these freedoms are good because they lead to more-powerful reliable software, they're likely to say, `You didn't deliver what you promised. This software's not more powerful. It's missing this feature. You lied to me.' But if they have come to agree with the free software movement, that the freedom is important in itself, then they will say, `How dare those people stop me from having this feature and my freedom too.' And with that kind of response, we may survive the hits that we're going to take as these patents explode." + +Such comments involve a hefty dose of spin, of course. Most open source advocates are equally, if not more, vociferous as Stallman when it comes to opposing software patents. Still, the underlying logic of Stallman's argument-that open source advocates emphasize the utilitarian advantages of free software over the political advantages-remains uncontested. Rather than stress the political significance of free software programs, open source advocates have chosen to stress the engineering integrity of the hacker development model. Citing the power of peer review, the open source argument paints programs such as GNU/Linux or FreeBSD as better built, better inspected and, by extension, more trushworthy to the average user. + +That's not to say the term "open source" doesn't have its political implications. For open source advocates, the term open source serves two purposes. First, it eliminates the confusion associated with the word "free," a word many businesses interpret as meaning "zero cost." Second, it allows companies to examine the free software phenomenon on a technological, rather than ethical, basis. Eric Raymond, cofounder of the Open Source Initiative and one of the leading hackers to endorse the term, effectively summed up the frustration of following Stallman down the political path in a 1999 essay, titled " Shut Up and Show Them the Code": + + RMS's rhetoric is very seductive to the kind of people we are. We hackers are thinkers and idealists who readily resonate with appeals to "principle" and "freedom" and "rights." Even when we disagree with bits of his program, we want RMS's rhetorical style to work; we think it ought to work; we tend to be puzzled and disbelieving when it fails on the 95% of people who aren't wired like we are.4 + +Included among that 95%, Raymond writes, are the bulk of business managers, investors, and nonhacker computer users who, through sheer weight of numbers, tend to decide the overall direction of the commercial software marketplace. Without a way to win these people over, Raymond argues, programmers are doomed to pursue their ideology on the periphery of society: + + When RMS insists that we talk about "computer users' rights," he's issuing a dangerously attractive invitation to us to repeat old failures. It's one we should reject-not because his principles are wrong, but because that kind of language, applied to software, simply does not persuade anybody but us. In fact, it confuses and repels most people outside our culture.4 + +Watching Stallman deliver his political message in person, it is hard to see anything confusing or repellent. Stallman's appearance may seem off-putting, but his message is logical. When an audience member asks if, in shunning proprietary software, free software proponents lose the ability to keep up with the latest technological advancements, Stallman answers the question in terms of his own personal beliefs. "I think that freedom is more important than mere technical advance," he says. "I would always choose a less advanced free program rather than a more advanced nonfree program, because I won't give up my freedom for something like that. My rule is, if I can't share it with you, I won't take it." + +Such answers, however, reinforce the quasi-religious nature of the Stallman message. Like a Jew keeping kosher or a Mormon refusing to drink alcohol, Stallman paints his decision to use free software in the place of proprietary in the color of tradition and personal belief. As software evangelists go, Stallman avoids forcing those beliefs down listeners' throats. Then again, a listener rarely leaves a Stallman speech not knowing where the true path to software righteousness lies. + +As if to drive home this message, Stallman punctuates his speech with an unusual ritual. Pulling a black robe out of a plastic grocery bag, Stallman puts it on. Out of a second bag, he pulls a reflective yellow computer disk and places it on his head. The crowd lets out a startled laugh. + +"I am St. Ignucius of the Church of Emacs," says Stallman, raising his right hand in mock-blessing. "I bless your computer, my child." + + +Stallman dressed as St. Ignucius. Photo by Wouter van Oortmerssen. + +The laughter turns into full-blown applause after a few seconds. As audience members clap, the computer disk on Stallman's head catches the glare of an overhead light, eliciting a perfect halo effect. In the blink of an eye, Stallman goes from awkward haole to Russian religious icon. + +" Emacs was initially a text editor," says Stallman, explaining the getup. "Eventually it became a way of life for many and a religion for some. We call this religion the Church of Emacs." + +The skit is a lighthearted moment of self-pardoy, a humorous return-jab at the many people who might see Stallman's form of software asceticism as religious fanaticism in disguise. It is also the sound of the other shoe dropping-loudly. It's as if, in donning his robe and halo, Stallman is finally letting listeners of the hook, saying, "It's OK to laugh. I know I'm weird." + +Discussing the St. Ignucius persona afterward, Stallman says he first came up with it in 1996, long after the creation of Emacs but well before the emergence of the "open source" term and the struggle for hacker-community leadership that precipitated it. At the time, Stallman says, he wanted a way to "poke fun at himself," to remind listeners that, though stubborn, Stallman was not the fanatic some made him out to be. It was only later, Stallman adds, that others seized the persona as a convenient way to play up his reputation as software ideologue, as Eric Raymond did in an 1999 interview with the linux.com web site: + + When I say RMS calibrates what he does, I'm not belittling or accusing him of insincerity. I'm saying that like all good communicators he's got a theatrical streak. Sometimes it's conscious-have you ever seen him in his St. Ignucius drag, blessing software with a disk platter on his head? Mostly it's unconscious; he's just learned the degree of irritating stimulus that works, that holds attention without (usually) freaking people out.5 + +Stallman takes issue with the Raymond analysis. "It's simply my way of making fun of myself," he says. "The fact that others see it as anything more than that is a reflection of their agenda, not mine." + +That said, Stallman does admit to being a ham. "Are you kidding?" he says at one point. "I love being the center of attention." To facilitate that process, Stallman says he once enrolled in Toastmasters, an organization that helps members bolster their public-speaking skills and one Stallman recommends highly to others. He possesses a stage presence that would be the envy of most theatrical performers and feels a link to vaudevillians of years past. A few days after the Maui High Performance Computing Center speech, I allude to the 1999 LinuxWorld performace and ask Stallman if he has a Groucho Marx complex-i.e., the unwillingness to belong to any club that would have him as a member. Stallman's response is immediate: "No, but I admire Groucho Marx in a lot of ways and certainly have been in some things I say inspired by him. But then I've also been inspired in some ways by Harpo." + +The Groucho Marx influence is certainly evident in Stallman's lifelong fondness for punning. Then again, punning and wordplay are common hacker traits. Perhaps the most Groucho-like aspect of Stallman's personality, however, is the deadpan manner in which the puns are delivered. Most come so stealthily-without even the hint of a raised eyebrow or upturned smile-you almost have to wonder if Stallman's laughing at his audience more than the audience is laughing at him. + +Watching members of the Maui High Performance Computer Center laugh at the St. Ignucius parody, such concerns evaporate. While not exactly a standup act, Stallman certainly possesses the chops to keep a roomful of engineers in stitches. "To be a saint in the Church of Emacs does not require celibacy, but it does require making a commitment to living a life of moral purity," he tells the Maui audience. "You must exorcise the evil proprietary operating system from all your computer and then install a wholly [holy] free operating system. And then you must install only free software on top of that. If you make this commitment and live by it, then you too will be a saint in the Church of Emacs, and you too may have a halo." + +The St. Ignucius skit ends with a brief inside joke. On most Unix systems and Unix-related offshoots, the primary competitor program to Emacs is vi, a text-editing program developed by former UC Berkeley student and current Sun Microsystems chief scientist, Bill Joy. Before doffing his "halo," Stallman pokes fun at the rival program. "People sometimes ask me if it is a sin in the Church of Emacs to use vi," he says. "Using a free version of vi is not a sin; it is a penance. So happy hacking." + +After a brief question-and-answer session, audience members gather around Stallman. A few ask for autographs. "I'll sign this," says Stallman, holding up one woman's print out of the GNU General Public License, "but only if you promise me to use the term GNU/Linux instead of Linux and tell all your friends to do likewise." + +The comment merely confirms a private observation. Unlike other stage performers and political figures, Stallman has no "off" mode. Aside from the St. Ignucius character, the ideologue you see onstage is the ideologue you meet backstage. Later that evening, during a dinner conversation in which a programmer mentions his affinity for "open source" programs, Stallman, between bites, upbraids his tablemate: "You mean free software. That's the proper way to refer to it." + +During the question-and-answer session, Stallman admits to playing the pedagogue at times. "There are many people who say, `Well, first let's invite people to join the community, and then let's teach them about freedom.' And that could be a reasonable strategy, but what we have is almost everybody's inviting people to join the community, and hardly anybody's teaching them about freedom once they come in." + +The result, Stallman says, is something akin to a third-world city. People move in, hoping to strike it rich or at the very least to take part in a vibrant, open culture, and yet those who hold the true power keep evolving new tricks and strategies-i.e., software patents-to keep the masses out. "You have millions of people moving in and building shantytowns, but nobody's working on step two: getting them out of those shantytowns. If you think talking about software freedom is a good strategy, please join in doing step two. There are plenty working on step one. We need more people working on step two." + +Working on "step two" means driving home the issue that freedom, not acceptance, is the root issue of the free software movement. Those who hope to reform the proprietary software industry from the inside are on a fool's errand. "Change from the inside is risky," Stallman stays. "Unless you're working at the level of a Gorbachev, you're going to be neutralized." + +Hands pop up. Stallman points to a member of the golf shirt-wearing contingent. "Without patents, how would you suggest dealing with commercial espionage?" + +"Well, those two questions have nothing to do with each other, really," says Stallman. + +"But I mean if someone wants to steal another company's piece of software." + +Stallman's recoils as if hit by a poisonous spray. "Wait a second," Stallman says. "Steal? I'm sorry, there's so much prejudice in that statement that the only thing I can say is that I reject that prejudice. Companies that develop nonfree software and other things keep lots and lots of trade secrets, and so that's not really likely to change. In the old days-even in the 1980s-for the most part programmers were not aware that there were even software patents and were paying no attention to them. What happened was that people published the interesting ideas, and if they were not in the free software movement, they kept secret the little details. And now they patent those broad ideas and keep secret the little details. So as far as what you're describing, patents really make no difference to it one way or another." + +"But if it doesn't affect their publication," a new audience member jumps in, his voice trailing off almost as soon as he starts speaking. + +"But it does," Stallman says. "Their publication is telling you that this is an idea that's off limits to the rest of the community for 20 years. And what the hell good is that? Besides, they've written it in such a hard way to read, both to obfuscate the idea and to make the patent as broad as possible, that it's basically useless looking at the published information to learn anything anyway. The only reason to look at patents is to see the bad news of what you can't do." + +The audience falls silent. The speech, which began at 3:15, is now nearing the 5:00 whistle, and most listeners are already squirming in their seats, antsy to get a jump start on the weekend. Sensing the fatigue, Stallman glances around the room and hastily shuts things down. "So it looks like we're done," he says, following the observation with an auctioneer's "going, going, gone" to flush out any last-minute questioners. When nobody throws their hand up, Stallman signs off with a traditional exit line. + +"Happy hacking," he says. + + +Chapter 9 +The GNU General Public License +By the spring of 1985, Richard Stallman had settled on the GNU Project's first milestone-a Lisp-based free software version of Emacs. To meet this goal, however, he faced two challenges. First, he had to rebuild Emacs in a way that made it platform independent. Second, he had to rebuild the Emacs Commune in a similar fashion. + +The dispute with UniPress had highlighted a flaw in the Emacs Commune social contract. Where users relied on Stallman's expert insight, the Commune's rules held. In areas where Stallman no longer held the position of alpha hacker-pre-1984 Unix systems, for example-individuals and companies were free to make their own rules. + +The tension between the freedom to modify and the freedom to exert authorial privilege had been building before GOSMACS. The Copyright Act of 1976 had overhauled U.S. copyright law, extending the legal protection of copyright to software programs. According to Section 102(b) of the Act, individuals and companies now possessed the ability to copyright the "expression" of a software program but not the "actual processes or methods embodied in the program."1 Translated, programmers and companies had the ability to treat software programs like a story or song. Other programmers could take inspiration from the work, but to make a direct copy or nonsatirical derivative, they first had to secure permission from the original creator. Although the new law guaranteed that even programs without copyright notices carried copyright protection, programmers quickly asserted their rights, attaching coypright notices to their software programs. + +At first, Stallman viewed these notices with alarm. Rare was the software program that didn't borrow source code from past programs, and yet, with a single stroke of the president's pen, Congress had given programmers and companies the power to assert individual authorship over communally built programs. It also injected a dose of formality into what had otherwise been an informal system. Even if hackers could demonstrate how a given program's source-code bloodlines stretched back years, if not decades, the resources and money that went into battling each copyright notice were beyond most hackers' means. Simply put, disputes that had once been settled hacker-to-hacker were now settled lawyer-to-lawyer. In such a system, companies, not hackers, held the automatic advantage. + +Proponents of software copyright had their counter-arguments: without copyright, works might otherwise slip into the public domain. Putting a copyright notice on a work also served as a statement of quality. Programmers or companies who attached their name to the copyright attached their reputations as well. Finally, it was a contract, as well as a statement of ownership. Using copyright as a flexible form of license, an author could give away certain rights in exchange for certain forms of behavior on the part of the user. For example, an author could give away the right to suppress unauthorized copies just so long as the end user agreed not to create a commercial offshoot. + +It was this last argument that eventually softened Stallman's resistance to software copyright notices. Looking back on the years leading up to the GNU Project, Stallman says he began to sense the beneficial nature of copyright sometime around the release of Emacs 15.0, the last significant pre-GNU Project upgrade of Emacs. "I had seen email messages with copyright notices plus simple `verbatim copying permitted' licenses," Stallman recalls. "Those definitely were [an] inspiration." + +For Emacs 15, Stallman drafted a copyright that gave users the right to make and distribute copies. It also gave users the right to make modified versions, but not the right to claim sole ownership of those modified versions, as in the case of GOSMACS. + +Although helpful in codifying the social contract of the Emacs Commune, the Emacs 15 license remained too "informal" for the purposes of the GNU Project, Stallman says. Soon after starting work on a GNU version of Emacs, Stallman began consulting with the other members of the Free Software Foundation on how to shore up the license's language. He also consulted with the attorneys who had helped him set up the Free Software Foundation. + +Mark Fischer, a Boston attorney specializing in intellectual-property law, recalls discussing the license with Stallman during this period. "Richard had very strong views about how it should work," Fischer says, "He had two principles. The first was to make the software absolutely as open as possible. The second was to encourage others to adopt the same licensing practices." + +Encouraging others to adopt the same licensing practices meant closing off the escape hatch that had allowed privately owned versions of Emacs to emerge. To close that escape hatch, Stallman and his free software colleagues came up with a solution: users would be free to modify GNU Emacs just so long as they published their modifications. In addition, the resulting "derivative" works would also have carry the same GNU Emacs License. + +The revolutionary nature of this final condition would take a while to sink in. At the time, Fischer says, he simply viewed the GNU Emacs License as a simple contract. It put a price tag on GNU Emacs' use. Instead of money, Stallman was charging users access to their own later modifications. That said, Fischer does remember the contract terms as unique. + +"I think asking other people to accept the price was, if not unique, highly unusual at that time," he says. + +The GNU Emacs License made its debut when Stallman finally released GNU Emacs in 1985. Following the release, Stallman welcomed input from the general hacker community on how to improve the license's language. One hacker to take up the offer was future software activist John Gilmore, then working as a consultant to Sun Microsystems. As part of his consulting work, Gilmore had ported Emacs over to SunOS, the company's in-house version of Unix. In the process of doing so, Gilmore had published the changes as per the demands of the GNU Emacs License. Instead of viewing the license as a liability, Gilmore saw it as clear and concise expression of the hacker ethos. "Up until then, most licenses were very informal," Gilmore recalls. + +As an example of this informality, Gilmore cites a copyright notice for trn, a Unix utility. Written by Larry Wall, future creator of the Perl programming language, patch made it simple for Unix programmers to insert source-code fixes-" patches" in hacker jargon-into any large program. Recognizing the utility of this feature, Wall put the following copyright notice in the program's accompanying README file: + +Copyright (c) 1985, Larry Wall +You may copy the trn kit in whole or in part as long as you don't try +to make money off it, or pretend that you wrote it.2 + +Such statements, while reflective of the hacker ethic, also reflected the difficulty of translating the loose, informal nature of that ethic into the rigid, legal language of copyright. In writing the GNU Emacs License, Stallman had done more than close up the escape hatch that permitted proprietary offshoots. He had expressed the hacker ethic in a manner understandable to both lawyer and hacker alike. + +It wasn't long, Gilmore says, before other hackers began discussing ways to "port" the GNU Emacs License over to their own programs. Prompted by a conversation on Usenet, Gilmore sent an email to Stallman in November, 1986, suggesting modification: + + You should probably remove "EMACS" from the license and replace it with "SOFTWARE" or something. Soon, we hope, Emacs will not be the biggest part of the GNU system, and the license applies to all of it.3 + +Gilmore wasn't the only person suggesting a more general approach. By the end of 1986, Stallman himself was at work with GNU Project's next major milestone, a source-code debugger, and was looking for ways to revamp the Emacs license so that it might apply to both programs. Stallman's solution: remove all specific references to Emacs and convert the license into a generic copyright umbrella for GNU Project software. The GNU General Public License, GPL for short, was born. + +In fashioning the GPL, Stallman followed the software convention of using decimal numbers to indicate prototype versions and whole numbers to indicate mature versions. Stallman published Version 1.0 of the GPL in 1989 (a project Stallman was developing in 1985), almost a full year after the release of the GNU Debugger, Stallman's second major foray into the realm of Unix programming. The license contained a preamble spelling out its political intentions: + +The General Public License is designed to make sure that you have +the freedom to give away or sell copies of free software, that you +receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you +know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the software, or if you modify it.4 + +In fashioning the GPL, Stallman had been forced to make an additional adjustment to the informal tenets of the old Emacs Commune. Where he had once demanded that Commune members publish any and all changes, Stallman now demanded publication only in instances when programmers circulated their derivative versions in the same public manner as Stallman. In other words, programmers who simply modified Emacs for private use no longer needed to send the source-code changes back to Stallman. In what would become a rare compromise of free software doctrine, Stallman slashed the price tag for free software. Users could innovate without Stallman looking over their shoulders just so long as they didn't bar Stallman and the rest of the hacker community from future exchanges of the same program. + +Looking back, Stallman says the GPL compromise was fueled by his own dissatisfaction with the Big Brother aspect of the original Emacs Commune social contract. As much as he liked peering into other hackers' systems, the knowledge that some future source-code maintainer might use that power to ill effect forced him to temper the GPL. + +"It was wrong to require people to publish all changes," says Stallman. "It was wrong to require them to be sent to one privileged developer. That kind of centralization and privilege for one was not consistent with a society in which all had equal rights." + +As hacks go, the GPL stands as one of Stallman's best. It created a system of communal ownership within the normally proprietary confines of copyright law. More importantly, it demonstrated the intellectual similarity between legal code and software code. Implicit within the GPL's preamble was a profound message: instead of viewing copyright law with suspicion, hackers should view it as yet another system begging to be hacked. + +"The GPL developed much like any piece of free software with a large community discussing its structure, its respect or the opposite in their observation, needs for tweaking and even to compromise it mildly for greater acceptance," says Jerry Cohen, another attorney who helped Stallman with the creation of the license. "The process worked very well and GPL in its several versions has gone from widespread skeptical and at times hostile response to widespread acceptance." + +In a 1986 interview with Byte magazine, Stallman summed up the GPL in colorful terms. In addition to proclaiming hacker values, Stallman said, readers should also "see it as a form of intellectual jujitsu, using the legal system that software hoarders have set up against them."5 Years later, Stallman would describe the GPL's creation in less hostile terms. "I was thinking about issues that were in a sense ethical and in a sense political and in a sense legal," he says. "I had to try to do what could be sustained by the legal system that we're in. In spirit the job was that of legislating the basis for a new society, but since I wasn't a government, I couldn't actually change any laws. I had to try to do this by building on top of the existing legal system, which had not been designed for anything like this." + +About the time Stallman was pondering the ethical, political, and legal issues associated with free software, a California hacker named Don Hopkins mailed him a manual for the 68000 microprocessor. Hopkins, a Unix hacker and fellow science-fiction buff, had borrowed the manual from Stallman a while earlier. As a display of gratitude, Hopkins decorated the return envelope with a number of stickers obtained at a local science-fiction convention. One sticker in particular caught Stallman's eye. It read, "Copyleft (L), All Rights Reversed." Following the release of the first version of GPL, Stallman paid tribute to the sticker, nicknaming the free software license "Copyleft." Over time, the nickname and its shorthand symbol, a backwards "C," would become an official Free Software Foundation synonym for the GPL. + +The German sociologist Max Weber once proposed that all great religions are built upon the "routinization" or "institutionalization" of charisma. Every successful religion, Weber argued, converts the charisma or message of the original religious leader into a social, political, and ethical apparatus more easily translatable across cultures and time. + +While not religious per se, the GNU GPL certainly qualifies as an interesting example of this "routinization" process at work in the modern, decentralized world of software development. Since its unveiling, programmers and companies who have otherwise expressed little loyalty or allegiance to Stallman have willingly accepted the GPL bargain at face value. A few have even accepted the GPL as a preemptive protective mechanism for their own software programs. Even those who reject the GPL contract as too compulsory, still credit it as influential. + +One hacker falling into this latter group was Keith Bostic, a University of California employee at the time of the GPL 1.0 release. Bostic's department, the Computer Systems Research Group (SRG), had been involved in Unix development since the late 1970s and was responsible for many key parts of Unix, including the TCP/IP networking protocol, the cornerstone of modern Internet communications. By the late 1980s, AT&T, the original owner of the Unix brand name, began to focus on commercializing Unix and began looking to the Berkeley Software Distribution, or BSD, the academic version of Unix developed by Bostic and his Berkeley peers, as a key source of commercial technology. + +Although the Berkeley BSD source code was shared among researchers and commercial programmers with a source-code license, this commercialization presented a problem. The Berkeley code was intermixed with proprietary AT&T code. As a result, Berkeley distributions were available only to institutions that already had a Unix source license from AT&T. As AT&T raised its license fees, this arrangement, which had at first seemed innocuous, became increasingly burdensome. + +Hired in 1986, Bostic had taken on the personal project of porting BSD over to the Digital Equipment Corporation's PDP-11 computer. It was during this period, Bostic says, that he came into close interaction with Stallman during Stallman's occasional forays out to the west coast. "I remember vividly arguing copyright with Stallman while he sat at borrowed workstations at CSRG," says Bostic. "We'd go to dinner afterward and continue arguing about copyright over dinner." + +The arguments eventually took hold, although not in the way Stallman would have liked. In June, 1989, Berkeley separated its networking code from the rest of the AT&T-owned operating system and distributed it under a University of California license. The contract terms were liberal. All a licensee had to do was give credit to the university in advertisements touting derivative programs.6 In contrast to the GPL, proprietary offshoots were permissible. Only one problem hampered the license's rapid adoption: the BSD Networking release wasn't a complete operating system. People could study the code, but it could only be run in conjunction with other proprietary-licensed code. + +Over the next few years, Bostic and other University of California employees worked to replace the missing components and turn BSD into a complete, freely redistributable operating system. Although delayed by a legal challenge from Unix Systems Laboratories-the AT&T spin-off that retained ownership of the Unix brand name-the effort would finally bear fruit in the early 1990s. Even before then, however, many of the Berkeley utilities would make their way into Stallman's GNU Project. + +"I think it's highly unlikely that we ever would have gone as strongly as we did without the GNU influence," says Bostic, looking back. "It was clearly something where they were pushing hard and we liked the idea." + +By the end of the 1980s, the GPL was beginning to exert a gravitational effect on the free software community. A program didn't have to carry the GPL to qualify as free software-witness the case of the BSD utilities-but putting a program under the GPL sent a definite message. "I think the very existence of the GPL inspired people to think through whether they were making free software, and how they would license it," says Bruce Perens, creator of Electric Fence, a popular Unix utility, and future leader of the Debian GNU/Linux development team. A few years after the release of the GPL, Perens says he decided to discard Electric Fence's homegrown license in favor of Stallman's lawyer-vetted copyright. "It was actually pretty easy to do," Perens recalls. + +Rich Morin, the programmer who had viewed Stallman's initial GNU announcement with a degree of skepticism, recalls being impressed by the software that began to gather under the GPL umbrella. As the leader of a SunOS user group, one of Morin's primary duties during the 1980s had been to send out distribution tapes containing the best freeware or free software utilities. The job often mandated calling up original program authors to verify whether their programs were copyright protected or whether they had been consigned to the public domain. Around 1989, Morin says, he began to notice that the best software programs typically fell under the GPL license. "As a software distributor, as soon as I saw the word GPL, I knew I was home free," recalls Morin. + +To compensate for the prior hassles that went into compiling distribution tapes to the Sun User Group, Morin had charged recipients a convenience fee. Now, with programs moving over to the GPL, Morin was suddenly getting his tapes put together in half the time, turning a tidy profit in the process. Sensing a commercial opportunity, Morin rechristened his hobby as a business: Prime Time Freeware. + +Such commercial exploitation was completely within the confines of the free software agenda. "When we speak of free software, we are referring to freedom, not price," advised Stallman in the GPL's preamble. By the late 1980s, Stallman had refined it to a more simple mnemonic: "Don't think free as in free beer; think free as in free speech." + +For the most part, businesses ignored Stallman's entreaties. Still, for a few entrepreneurs, the freedom associated with free software was the same freedom associated with free markets. Take software ownership out of the commercial equation, and you had a situation where even the smallest software company was free to compete against the IBMs and DECs of the world. + +One of the first entrepreneurs to grasp this concept was Michael Tiemann, a software programmer and graduate student at Stanford University. During the 1980s, Tiemann had followed the GNU Project like an aspiring jazz musician following a favorite artist. It wasn't until the release of the GNU C Compiler in 1987, however, that he began to grasp the full potential of free software. Dubbing GCC a "bombshell," Tiemann says the program's own existence underlined Stallman's determination as a programmer. + +"Just as every writer dreams of writing the great American novel, every programmer back in the 1980s talked about writing the great American compiler," Tiemman recalls. "Suddenly Stallman had done it. It was very humbling." + +"You talk about single points of failure, GCC was it," echoes Bostic. "Nobody had a compiler back then, until GCC came along." + +Rather than compete with Stallman, Tiemann decided to build on top of his work. The original version of GCC weighed in at 110,000 lines of code, but Tiemann recalls the program as surprisingly easy to understand. So easy in fact that Tiemann says it took less than five days to master and another week to port the software to a new hardware platform, National Semiconductor's 32032 microchip. Over the next year, Tiemann began playing around with the source code, creating a native compiler for the C+ programming language. One day, while delivering a lecture on the program at Bell Labs, Tiemann ran into some AT&T developers struggling to pull off the same thing. + +"There were about 40 or 50 people in the room, and I asked how many people were working on the native code compiler," Tiemann recalls. "My host said the information was confidential but added that if I took a look around the room I might get a good general idea." + +It wasn't long after, Tiemann says, that the light bulb went off in his head. "I had been working on that project for six months," Tiemann says. I just thought to myself, whether it's me or the code this is a level of efficiency that the free market should be ready to reward." + +Tiemann found added inspiration in the GNU Manifesto, which, while excoriating the greed of some software vendors, encourages other vendors to consider the advantages of free software from a consumer point of view. By removing the power of monopoly from the commerical software question, the GPL makes it possible for the smartest vendors to compete on the basis of service and consulting, the two most profit-rich corners of the software marketplace. + +In a 1999 essay, Tiemann recalls the impact of Stallman's Manifesto. "It read like a socialist polemic, but I saw something different. I saw a business plan in disguise."7 + +Teaming up with John Gilmore, another GNU Project fan, Tiemann launched a software consulting service dedicated to customizing GNU programs. Dubbed Cygnus Support, the company signed its first development contract in February, 1990. By the end of the year, the company had $725,000 worth of support and development contracts. + +GNU Emacs, GDB, and GCC were the "big three" of developer-oriented tools, but they weren't the only ones developed by Stallman during the GNU Project's first half decade. By 1990, Stallman had also generated GNU versions of the Bourne Shell (rechristened the Bourne Again Shell, or BASH), YACC (rechristened Bison), and awk (rechristened gawk). Like GCC , every GNU program had to be designed to run on multiple systems, not just a single vendor's platform. In the process of making programs more flexible, Stallman and his collaborators often made them more useful as well. + +Recalling the GNU universalist approach, Prime Time Freeware's Morin points to a critical, albeit mundane, software package called hello. "It's the hello world program which is five lines of C, packaged up as if it were a GNU distribution," Morin says. "And so it's got the Texinfo stuff and the configure stuff. It's got all the other software engineering goo that the GNU Project has come up with to allow packages to port to all these different environments smoothly. That's tremendously important work, and it affects not only all of [Stallman's] software, but also all of the other GNU Project software." + +According to Stallman, improving software programs was secondary to building them in the first place. "With each piece I may or may not find a way to improve it," said Stallman to Byte. "To some extent I am getting the benefit of reimplementation, which makes many systems much better. To some extent it's because I have been in the field a long time and worked on many other systems. I therefore have many ideas to bring to bear."8 + +Nevertheless, as GNU tools made their mark in the late 1980s, Stallman's AI Lab-honed reputation for design fastidiousness soon became legendary throughout the entire software-development community. + +Jeremy Allison, a Sun user during the late 1980s and programmer destined to run his own free software project, Samba, in the 1990s, recalls that reputation with a laugh. During the late 1980s, Allison began using Emacs. Inspired by the program's community-development model, Allison says he sent in a snippet of source code only to have it rejected by Stallman. + +"It was like the Onion headline," Allison says. "`Child's prayers to God answered: No.'" + +Stallman's growing stature as a software programmer, however, was balanced by his struggles as a project manager. Although the GNU Project moved from success to success in creation of developer-oriented tools, its inability to generate a working kernel-the central "traffic cop" program in all Unix systems that determines which devices and applications get access to the microprocessor and when-was starting to elicit grumbles as the 1980s came to a close. As with most GNU Project efforts, Stallman had started kernel development by looking for an existing program to modify. According to a January 1987 "Gnusletter," Stallman was already working to overhaul TRIX, a Unix kernel developed at MIT. + +A review of GNU Project "GNUsletters" of the late 1980s reflects the management tension. In January, 1987, Stallman announced to the world that the GNU Project was working to overhaul TRIX, a Unix kernel developed at MIT. A year later, in February of 1988, the GNU Project announced that it had shifted its attentions to Mach, a lightweight "micro-kernel" developed at Carnegie Mellon. All told, however, official GNU Project kernel development wouldn't commence until 1990.9 + +The delays in kernel development were just one of many concerns weighing on Stallman during this period. In 1989, Lotus Development Corporation filed suit against rival software company, Paperback Software International, for copying menu commands in Lotus' popular 1-2-3 Spreadsheet program. Lotus' suit, coupled with the Apple -Microsoft "look and feel" battle, provided a troublesome backdrop for the GNU Project. Although both suits fell outside the scope of the GNU Project, both revolved around operating systems and software applications developed for the personal computer, not Unix-compatible hardware systems-they threatened to impose a chilling effect on the entire culture of software development. Determined to do something, Stallman recruited a few programmer friends and composed a magazine ad blasting the lawsuits. He then followed up the ad by helping to organize a group to protest the corporations filing the suit. Calling itself the League of Programming Freedom, the group held protests outside the offices of Lotus, Inc. and the Boston courtroom hosting the Lotus trial. + +The protests were notable.10 They document the evolving nature of software industry. Applications had quietly replaced operating systems as the primary corporate battleground. In its unfulfilled quest to build a free software operating system, the GNU Project seemed hopelessly behind the times. Indeed, the very fact that Stallman had felt it necessary to put together an entirely new group dedicated to battling the "look and feel" lawsuits reinforced that obsolescence in the eyes of some observers. + +In 1990, the John D. and Catherine T. MacArthur Foundation cerified Stallman's genius status when it granted Stallman a MacArthur fellowship, therefore making him a recipient for the organization's so-called "genius grant." The grant, a $240,000 reward for launching the GNU Project and giving voice to the free software philosophy, relieved a number of short-term concerns. First and foremost, it gave Stallman, a nonsalaried employee of the FSF who had been supporting himself through consulting contracts, the ability to devote more time to writing GNU code.11 + +Ironically, the award also made it possible for Stallman to vote. Months before the award, a fire in Stallman's apartment house had consumed his few earthly possessions. By the time of the award, Stallman was listing himself as a "squatter"12 at 545 Technology Square. "[The registrar of voters] didn't want to accept that as my address," Stallman would later recall. "A newspaper article about the MacArthur grant said that and then they let me register."13 + +Most importantly, the MacArthur money gave Stallman more freedom. Already dedicated to the issue of software freedom, Stallman chose to use the additional freedom to increase his travels in support of the GNU Project mission. + +Interestingly, the ultimate success of the GNU Project and the free software movement in general would stem from one of these trips. In 1990, Stallman paid a visit to the Polytechnic University in Helsinki, Finland. Among the audience members was 21-year-old Linus Torvalds, future developer of the Linux kernel-the free software kernel destined to fill the GNU Project's most sizable gap. + +A student at the nearby University of Helsinki at the time, Torvalds regarded Stallman with bemusement. "I saw, for the first time in my life, the stereotypical long-haired, bearded hacker type," recalls Torvalds in his 2001 autobiography Just for Fun. "We don't have much of them in Helsinki."14 + +While not exactly attuned to the "sociopolitical" side of the Stallman agenda, Torvalds nevertheless appreciated the agenda's underlying logic: no programmer writes error-free code. By sharing software, hackers put a program's improvement ahead of individual motivations such as greed or ego protection. + +Like many programmers of his generation, Torvalds had cut his teeth not on mainframe computers like the IBM 7094, but on a motley assortment of home-built computer systems. As university student, Torvalds had made the step up from C programming to Unix, using the university's MicroVAX. This ladder-like progression had given Torvalds a different perspective on the barriers to machine access. For Stallman, the chief barriers were bureaucracy and privilege. For Torvalds, the chief barriers were geography and the harsh Helsinki winter. Forced to trek across the University of Helsinki just to log in to his Unix account, Torvalds quickly began looking for a way to log in from the warm confines of his off-campus apartment. + +The search led Torvalds to the operating system Minix, a lightweight version of Unix developed for instructional purposes by Dutch university professor Andrew Tanenbaum. The program fit within the memory confines of a 386 PC, the most powerful machine Torvalds could afford, but still lacked a few necessary features. It most notably lacked terminal emulation, the feature that allowed Torvalds' machine to mimic a university terminal, making it possible to log in to the MicroVAX from home. + +During the summer of 1991, Torvalds rewrote Minix from the ground up, adding other features as he did so. By the end of the summer, Torvalds was referring to his evolving work as the "GNU/Emacs of terminal emulation programs."15 Feeling confident, he solicited a Minix newsgroup for copies of the POSIX standards, the software blue prints that determined whether a program was Unix compatible. A few weeks later, Torvalds was posting a message eerily reminiscent of Stallman's original 1983 GNU posting: + +Hello everybody out there using minix- + +I'm doing a (free) operating system (just a hobby, won't be big and +professional like gnu for 386 (486) AT clones). This has been brewing +since April, and is starting to get ready. I'd like any feedback on +things people like/dislike in minix, as my OS resembles it somewhat +(same physical layout of the file-system (due to practical reasons) +among other things).16 + +The posting drew a smattering of responses and within a month, Torvalds had posted a 0.01 version of the operating system-i.e., the earliest possible version fit for outside review-on an Internet FTP site. In the course of doing so, Torvalds had to come up with a name for the new system. On his own PC hard drive, Torvalds had saved the program as Linux, a name that paid its respects to the software convention of giving each Unix variant a name that ended with the letter X. Deeming the name too "egotistical," Torvalds changed it to Freax, only to have the FTP site manager change it back. + +Although Torvalds had set out build a full operating system, both he and other developers knew at the time that most of the functional tools needed to do so were already available, thanks to the work of GNU, BSD, and other free software developers. One of the first tools the Linux development team took advantage of was the GNU C Compiler, a tool that made it possible to process programs written in the C programming language. + +Integrating GCC improved the performance of Linux. It also raised issues. Although the GPL's "viral" powers didn't apply to the Linux kernel, Torvald's willingness to borrow GCC for the purposes of his own free software operating system indicated a certain obligation to let other users borrow back. As Torvalds would later put it: "I had hoisted myself up on the shoulders of giants."17 Not surprisingly, he began to think about what would happen when other people looked to him for similar support. A decade after the decision, Torvalds echoes the Free Software Foundation's Robert Chassel when he sums up his thoughts at the time: + + You put six months of your life into this thing and you want to make it available and you want to get something out of it, but you don't want people to take advantage of it. I wanted people to be able to see [Linux], and to make changes and improvements to their hearts' content. But I also wanted to make sure that what I got out of it was to see what they were doing. I wanted to always have access to the sources so that if they made improvements, I could make those improvements myself.18 + +When it was time to release the 0.12 version of Linux, the first to include a fully integrated version of GCC, Torvalds decided to voice his allegiance with the free software movement. He discarded the old kernel license and replaced it with the GPL. The decision triggered a porting spree, as Torvalds and his collaborators looked to other GNU programs to fold into the growing Linux stew. Within three years, Linux developers were offering their first production release, Linux 1.0, including fully modified versions of GCC, GDB, and a host of BSD tools. + +By 1994, the amalgamated operating system had earned enough respect in the hacker world to make some observers wonder if Torvalds hadn't given away the farm by switching to the GPL in the project's initial months. In the first issue of Linux Journal, publisher Robert Young sat down with Torvalds for an interview. When Young asked the Finnish programmer if he felt regret at giving up private ownership of the Linux source code, Torvalds said no. "Even with 20/20 hindsight," Torvalds said, he considered the GPL "one of the very best design decisions" made during the early stages of the Linux project.19 + +That the decision had been made with zero appeal or deference to Stallman and the Free Software Foundation speaks to the GPL's growing portability. Although it would take a few years to be recognized by Stallman, the explosiveness of Linux development conjured flashbacks of Emacs. This time around, however, the innovation triggering the explosion wasn't a software hack like Control-R but the novelty of running a Unix-like system on the PC architecture. The motives may have been different, but the end result certainly fit the ethical specifications: a fully functional operating system composed entirely of free software. + +As his initial email message to the comp.os.minix newsgroup indicates, it would take a few months before Torvalds saw Linux as anything less than a holdover until the GNU developers delivered on the HURD kernel. This initial unwillingness to see Linux in political terms would represent a major blow to the Free Software Foundation. + +As far as Torvalds was concerned, he was simply the latest in a long line of kids taking apart and reassembling things just for fun. Nevertheless, when summing up the runaway success of a project that could have just as easily spent the rest of its days on an abandoned computer hard drive, Torvalds credits his younger self for having the wisdom to give up control and accept the GPL bargain. + +"I may not have seen the light," writes Torvalds, reflecting on Stallman's 1991 Polytechnic University speech and his subsequent decision to switch to the GPL. "But I guess something from his speech sunk in ." 20 + + +Chapter 10 +GNU/Linux +By 1993, the free software movement was at a crossroads. To the optimistically inclined, all signs pointed toward success for the hacker culture. Wired magazine, a funky, new publication offering stories on data encryption, Usenet, and software freedom, was flying off magazine racks. The Internet, once a slang term used only by hackers and research scientists, had found its way into mainstream lexicon. Even President Clinton was using it. The personal computer, once a hobbyist's toy, had grown to full-scale respectability, giving a whole new generation of computer users access to hacker-built software. And while the GNU Project had not yet reached its goal of a fully intact, free software operating system, curious users could still try Linux in the interim. + +Any way you sliced it, the news was good, or so it seemed. After a decade of struggle, hackers and hacker values were finally gaining acceptance in mainstream society. People were getting it. + +Or were they? To the pessimistically inclined, each sign of acceptance carried its own troubling countersign. Sure, being a hacker was suddenly cool, but was cool good for a community that thrived on alienation? Sure, the White House was saying all the right things about the Internet, even going so far as to register its own domain name, whitehouse.gov, but it was also meeting with the companies, censorship advocates, and law-enforcement officials looking to tame the Internet's Wild West culture. Sure, PCs were more powerful, but in commoditizing the PC marketplace with its chips, Intel had created a situation in which proprietary software vendors now held the power. For every new user won over to the free software cause via Linux, hundreds, perhaps thousands, were booting up Microsoft Windows for the first time. + +Finally, there was the curious nature of Linux itself. Unrestricted by design bugs (like GNU) and legal disputes (like BSD), Linux' high-speed evolution had been so unplanned, its success so accidental, that programmers closest to the software code itself didn't know what to make of it. More compilation album than operating system, it was comprised of a hacker medley of greatest hits: everything from GCC, GDB, and glibc (the GNU Project's newly developed C Library) to X (a Unix-based graphic user interface developed by MIT's Laboratory for Computer Science) to BSD-developed tools such as BIND (the Berkeley Internet Naming Daemon, which lets users substitute easy-to-remember Internet domain names for numeric IP addresses) and TCP/IP. The arch's capstone, of course, was the Linux kernel-itself a bored-out, super-charged version of Minix. Rather than building their operating system from scratch, Torvalds and his rapidly expanding Linux development team had followed the old Picasso adage, "good artists borrow; great artists steal." Or as Torvalds himself would later translate it when describing the secret of his success: "I'm basically a very lazy person who likes to take credit for things other people actually do."1 + +Such laziness, while admirable from an efficiency perspective, was troubling from a political perspective. For one thing, it underlined the lack of an ideological agenda on Torvalds' part. Unlike the GNU developers, Torvalds hadn't built an operating system out of a desire to give his fellow hackers something to work with; he'd built it to have something he himself could play with. Like Tom Sawyer whitewashing a fence, Torvalds' genius lay less in the overall vision and more in his ability to recruit other hackers to speed the process. + +That Torvalds and his recruits had succeeded where others had not raised its own troubling question: what, exactly, was Linux? Was it a manifestation of the free software philosophy first articulated by Stallman in the GNU Manifesto? Or was it simply an amalgamation of nifty software tools that any user, similarly motivated, could assemble on his own home system? + +By late 1993, a growing number of Linux users had begun to lean toward the latter definition and began brewing private variations on the Linux theme. They even became bold enough to bottle and sell their variations-or "distributions"-to fellow Unix aficionados. The results were spotty at best. + +"This was back before Red Hat and the other commercial distributions," remembers Ian Murdock, then a computer science student at Purdue University. "You'd flip through Unix magazines and find all these business card-sized ads proclaiming `Linux.' Most of the companies were fly-by-night operations that saw nothing wrong with slipping a little of their own source code into the mix." + +Murdock, a Unix programmer, remembers being "swept away" by Linux when he first downloaded and installed it on his home PC system. "It was just a lot of fun," he says. "It made me want to get involved." The explosion of poorly built distributions began to dampen his early enthusiasm, however. Deciding that the best way to get involved was to build a version of Linux free of additives, Murdock set about putting a list of the best free software tools available with the intention of folding them into his own distribution. "I wanted something that would live up to the Linux name," Murdock says. + +In a bid to "stir up some interest," Murdock posted his intentions on the Internet, including Usenet's comp.os.linux newsgroup. One of the first responding email messages was from rms@ai.mit.edu. As a hacker, Murdock instantly recognized the address. It was Richard M. Stallman, founder of the GNU Project and a man Murdock knew even back then as "the hacker of hackers." Seeing the address in his mail queue, Murdock was puzzled. Why on Earth would Stallman, a person leading his own operating-system project, care about Murdock's gripes over Linux? + +Murdock opened the message. + +"He said the Free Software Foundation was starting to look closely at Linux and that the FSF was interested in possibly doing a Linux system, too. Basically, it looked to Stallman like our goals were in line with their philosophy." + +The message represented a dramatic about-face on Stallman's part. Until 1993, Stallman had been content to keep his nose out of the Linux community's affairs. In fact, he had all but shunned the renegade operating system when it first appeared on the Unix programming landscape in 1991. After receiving the first notification of a Unix-like operating system that ran on PCs, Stallman says he delegated the task of examining the new operating system to a friend. Recalls Stallman, "He reported back that the software was modeled after System V, which was the inferior version of Unix. He also told me it wasn't portable." + +The friend's report was correct. Built to run on 386-based machines, Linux was firmly rooted to its low-cost hardware platform. What the friend failed to report, however, was the sizable advantage Linux enjoyed as the only freely modifiable operating system in the marketplace. In other words, while Stallman spent the next three years listening to bug reports from his HURD team, Torvalds was winning over the programmers who would later uproot and replant the operating system onto new platforms. + +By 1993, the GNU Project's inability to deliver a working kernel was leading to problems both within the GNU Project and within the free software movement at large. A March, 1993, a Wired magazine article by Simson Garfinkel described the GNU Project as "bogged down" despite the success of the project's many tools.2 Those within the project and its nonprofit adjunct, the Free Software Foundation, remember the mood as being even worse than Garfinkel's article let on. "It was very clear, at least to me at the time, that there was a window of opportunity to introduce a new operating system," says Chassell. "And once that window was closed, people would become less interested. Which is in fact exactly what happened."3 + +Much has been made about the GNU Project's struggles during the 1990-1993 period. While some place the blame on Stallman for those struggles, Eric Raymond, an early member of the GNU Emacs team and later Stallman critic, says the problem was largely institutional. "The FSF got arrogant," Raymond says. "They moved away from the goal of doing a production-ready operating system to doing operating-system research." Even worse, "They thought nothing outside the FSF could affect them." + +Murdock, a person less privy to the inner dealings of the GNU Project, adopts a more charitable view. "I think part of the problem is they were a little too ambitious and they threw good money after bad," he says. "Micro-kernels in the late 80s and early 90s were a hot topic. Unfortunately, that was about the time that the GNU Project started to design their kernel. They ended up with alot of baggage and it would have taken a lot of backpedaling to lose it." + +Stallman cites a number of issues when explaining the delay. The Lotus and Apple lawsuits had provided political distractions, which, coupled with Stallman's inability to type, made it difficult for Stallman to lend a helping hand to the HURD team. Stallman also cites poor communication between various portions of the GNU Project. "We had to do a lot of work to get the debugging environment to work," he recalls. "And the people maintaining GDB at the time were not that cooperative." Mostly, however, Stallman says he and the other members of the GNU Project team underestimated the difficulty of expanding the Mach microkernal into a full-fledged Unix kernel. + +"I figured, OK, the [Mach] part that has to talk to the machine has already been debugged," Stallman says, recalling the HURD team's troubles in a 2000 speech. "With that head start, we should be able to get it done faster. But instead, it turned out that debugging these asynchronous multithreaded programs was really hard. There were timing books that would clobber the files, and that's no fun. The end result was that it took many, many years to produce a test version."4 + +Whatever the excuse, or excuses, the concurrent success of the Linux-kernel team created a tense situation. Sure, the Linux kernel had been licensed under the GPL, but as Murdock himself had noted, the desire to treat Linux as a purely free software operating system was far from uniform. By late 1993, the total Linux user population had grown from a dozen or so Minix enthusiasts to somewhere between 20,000 and 100,000.5 What had once been a hobby was now a marketplace ripe for exploitation. Like Winston Churchill watching Soviet troops sweep into Berlin, Stallman felt an understandable set of mixed emotions when it came time to celebrate the Linux "victory."6 + +Although late to the party, Stallman still had clout. As soon as the FSF announced that it would lend its money and moral support to Murdock's software project, other offers of support began rolling in. Murdock dubbed the new project Debian-a compression of his and his wife, Deborah's, names-and within a few weeks was rolling out the first distribution. "[Richard's support] catapulted Debian almost overnight from this interesting little project to something people within the community had to pay attention to," Murdock says. + +In January of 1994, Murdock issued the " Debian Manifesto." Written in the spirit of Stallman's "GNU Manifesto" from a decade before, it explained the importance of working closely with the Free Software Foundation. Murdock wrote: + + The Free Software Foundation plays an extremely important role in the future of Debian. By the simple fact that they will be distributing it, a message is sent to the world that Linux is not a commercial product and that it never should be, but that this does not mean that Linux will never be able to compete commercially. For those of you who disagree, I challenge you to rationalize the success of GNU Emacs and GCC, which are not commercial software but which have had quite an impact on the commercial market regardless of that fact. + + The time has come to concentrate on the future of Linux rather than on the destructive goal of enriching oneself at the expense of the entire Linux community and its future. The development and distribution of Debian may not be the answer to the problems that I have outlined in the Manifesto, but I hope that it will at least attract enough attention to these problems to allow them to be solved.7 + +Shortly after the Manifesto's release, the Free Software Foundation made its first major request. Stallman wanted Murdock to call its distribution "GNU/Linux." At first, Murdock says, Stallman had wanted to use the term " Lignux"-"as in Linux with GNU at the heart of it"-but a sample testing of the term on Usenet and in various impromptu hacker focus groups had merited enough catcalls to convince Stallman to go with the less awkward GNU/Linux. + +Although some would dismiss Stallman's attempt to add the "GNU" prefix as a belated quest for credit, Murdock saw it differently. Looking back, Murdock saw it as an attempt to counteract the growing tension between GNU Project and Linux-kernel developers. "There was a split emerging," Murdock recalls. "Richard was concerned." + +The deepest split, Murdock says, was over glibc. Short for GNU C Library, glibc is the package that lets programmers make "system calls" directed at the kernel. Over the course of 1993-1994, glibc emerged as a troublesome bottleneck in Linux development. Because so many new users were adding new functions to the Linux kernel, the GNU Project's glibc maintainers were soon overwhelmed with suggested changes. Frustrated by delays and the GNU Project's growing reputation for foot-dragging, some Linux developers suggested creating a " fork"-i.e., a Linux-specific C Library parallel to glibc. + +In the hacker world, forks are an interesting phenomenon. Although the hacker ethic permits a programmer to do anything he wants with a given program's source code, most hackers prefer to pour their innovations into a central source-code file or " tree" to ensure compatibility with other people's programs. To fork glibc this early in the development of Linux would have meant losing the potential input of hundreds, even thousands, of Linux developers. It would also mean growing incompatibility between Linux and the GNU system that Stallman and the GNU team still hoped to develop. + +As leader of the GNU Project, Stallman had already experienced the negative effects of a software fork in 1991. A group of Emacs developers working for a software company named Lucid had a falling out over Stallman's unwillingness to fold changes back into the GNU Emacs code base. The fork had given birth to a parallel version, Lucid Emacs, and hard feelings all around.8 + +Murdock says Debian was mounting work on a similar fork in glibc source code that motivated Stallman to insist on adding the GNU prefix when Debian rolled out its software distribution. "The fork has since converged. Still, at the time, there was a concern that if the Linux community saw itself as a different thing as the GNU community, it might be a force for disunity." + +Stallman seconds Murdock's recollection. In fact, he says there were nascent forks appearing in relation to every major GNU component. At first, Stallman says he considered the forks to be a product of sour grapes. In contrast to the fast and informal dynamics of the Linux-kernel team, GNU source-code maintainers tended to be slower and more circumspect in making changes that might affect a program's long-term viability. They also were unafraid of harshly critiquing other people's code. Over time, however, Stallman began to sense that there was an underlying lack of awareness of the GNU Project and its objectives when reading Linux developers' emails. + +"We discovered that the people who considered themselves Linux users didn't care about the GNU Project," Stallman says. "They said, `Why should I bother doing these things? I don't care about the GNU Project. It's working for me. It's working for us Linux users, and nothing else matters to us.' And that was quite surprising given that people were essentially using a variant of the GNU system, and they cared so little. They cared less than anybody else about GNU." + +While some viewed descriptions of Linux as a "variant" of the GNU Project as politically grasping, Murdock, already sympathetic to the free software cause, saw Stallman's request to call Debian's version GNU/Linux as reasonable. "It was more for unity than for credit," he says. + +Requests of a more technical nature quickly followed. Although Murdock had been accommodating on political issues, he struck a firmer pose when it came to the design and development model of the actual software. What had begun as a show of solidarity soon became of model of other GNU projects. + +"I can tell you that I've had my share of disagreements with him," says Murdock with a laugh. "In all honesty Richard can be a fairly difficult person to work with." + +In 1996, Murdock, following his graduation from Purdue, decided to hand over the reins of the growing Debian project. He had already been ceding management duties to Bruce Perens, the hacker best known for his work on Electric Fence, a Unix utility released under the GPL. Perens, like Murdock, was a Unix programmer who had become enamored of GNU/Linux as soon as the program's Unix-like abilities became manifest. Like Murdock, Perens sympathized with the political agenda of Stallman and the Free Software Foundation, albeit from afar. + +"I remember after Stallman had already come out with the GNU Manifesto, GNU Emacs, and GCC, I read an article that said he was working as a consultant for Intel," says Perens, recalling his first brush with Stallman in the late 1980s. "I wrote him asking how he could be advocating free software on the one hand and working for Intel on the other. He wrote back saying, `I work as a consultant to produce free software.' He was perfectly polite about it, and I thought his answer made perfect sense." + +As a prominent Debian developer, however, Perens regarded Murdock's design battles with Stallman with dismay. Upon assuming leadership of the development team, Perens says he made the command decision to distance Debian from the Free Software Foundation. "I decided we did not want Richard's style of micro-management," he says. + +According to Perens, Stallman was taken aback by the decision but had the wisdom to roll with it. "He gave it some time to cool off and sent a message that we really needed a relationship. He requested that we call it GNU/Linux and left it at that. I decided that was fine. I made the decision unilaterally. Everybody breathed a sigh of relief." + +Over time, Debian would develop a reputation as the hacker's version of Linux, alongside Slackware, another popular distribution founded during the same 1993-1994 period. Outside the realm of hacker-oriented systems, however, Linux was picking up steam in the commercial Unix marketplace. In North Carolina, a Unix company billing itself as Red Hat was revamping its business to focus on Linux. The chief executive officer was Robert Young, the former Linux Journal editor who in 1994 had put the question to Linus Torvalds, asking whether he had any regrets about putting the kernel under the GPL. To Young, Torvalds' response had a "profound" impact on his own view toward Linux. Instead of looking for a way to corner the GNU/Linux market via traditional software tactics, Young began to consider what might happen if a company adopted the same approach as Debian-i.e., building an operating system completely out of free software parts. Cygnus Solutions, the company founded by Michael Tiemann and John Gilmore in 1990, was already demonstrating the ability to sell free software based on quality and customizability. What if Red Hat took the same approach with GNU/Linux? + +"In the western scientific tradition we stand on the shoulders of giants," says Young, echoing both Torvalds and Sir Isaac Newton before him. "In business, this translates to not having to reinvent wheels as we go along. The beauty of [the GPL] model is you put your code into the public domain.9 If you're an independent software vendor and you're trying to build some application and you need a modem-dialer, well, why reinvent modem dialers? You can just steal PPP off of Red Hat Linux and use that as the core of your modem-dialing tool. If you need a graphic tool set, you don't have to write your own graphic library. Just download GTK. Suddenly you have the ability to reuse the best of what went before. And suddenly your focus as an application vendor is less on software management and more on writing the applications specific to your customer's needs." + +Young wasn't the only software executive intrigued by the business efficiencies of free software. By late 1996, most Unix companies were starting to wake up and smell the brewing source code. The Linux sector was still a good year or two away from full commercial breakout mode, but those close enough to the hacker community could feel it: something big was happening. The Intel 386 chip, the Internet, and the World Wide Web had hit the marketplace like a set of monster waves, and Linux-and the host of software programs that echoed it in terms of source-code accessibility and permissive licensing-seemed like the largest wave yet. + +For Ian Murdock, the programmer courted by Stallman and then later turned off by Stallman's micromanagement style, the wave seemed both a fitting tribute and a fitting punishment for the man who had spent so much time giving the free software movement an identity. Like many Linux aficionados, Murdock had seen the original postings. He'd seen Torvalds's original admonition that Linux was "just a hobby." He'd also seen Torvalds's admission to Minix creator Andrew Tanenbaum: "If the GNU kernel had been ready last spring, I'd not have bothered to even start my project." 10 Like many, Murdock knew the opportunities that had been squandered. He also knew the excitement of watching new opportunities come seeping out of the very fabric of the Internet. + +"Being involved with Linux in those early days was fun," recalls Murdock. "At the same time, it was something to do, something to pass the time. If you go back and read those old [comp.os.minix] exchanges, you'll see the sentiment: this is something we can play with until the HURD is ready. People were anxious. It's funny, but in a lot of ways, I suspect that Linux would never have happened if the HURD had come along more quickly." + +By the end of 1996, however, such "what if" questions were already moot. Call it Linux, call it GNU/Linux; the users had spoken. The 36-month window had closed, meaning that even if the GNU Project had rolled out its HURD kernel, chances were slim anybody outside the hard-core hacker community would have noticed. The first Unix-like free software operating system was here, and it had momentum. All hackers had left to do was sit back and wait for the next major wave to come crashing down on their heads. Even the shaggy-haired head of one Richard M. Stallman. + +Ready or not. + + +Chapter 11 +Open Source +In November , 1995, Peter Salus, a member of the Free Software Foundation and author of the 1994 book, A Quarter Century of Unix, issued a call for papers to members of the GNU Project's "system-discuss" mailing list. Salus, the conference's scheduled chairman, wanted to tip off fellow hackers about the upcoming Conference on Freely Redistributable Software in Cambridge, Massachusetts. Slated for February, 1996 and sponsored by the Free Software Foundation, the event promised to be the first engineering conference solely dedicated to free software and, in a show of unity with other free software programmers, welcomed papers on "any aspect of GNU, Linux, NetBSD, 386BSD, FreeBSD, Perl, Tcl/tk, and other tools for which the code is accessible and redistributable." Salus wrote: + + Over the past 15 years, free and low-cost software has become ubiquitous. This conference will bring together implementers of several different types of freely redistributable software and publishers of such software (on various media). There will be tutorials and refereed papers, as well as keynotes by Linus Torvalds and Richard Stallman.1 + +One of the first people to receive Salus' email was conference committee member Eric S. Raymond. Although not the leader of a project or company like the various other members of the list, Raymond had built a tidy reputation within the hacker community as a major contributor to GNU Emacs and as editor of The New Hacker Dictionary, a book version of the hacking community's decade-old Jargon File. + +For Raymond, the 1996 conference was a welcome event. Active in the GNU Project during the 1980s, Raymond had distanced himself from the project in 1992, citing, like many others before him, Stallman's "micro-management" style. "Richard kicked up a fuss about my making unauthorized modifications when I was cleaning up the Emacs LISP libraries," Raymond recalls. "It frustrated me so much that I decided I didn't want to work with him anymore." + +Despite the falling out, Raymond remained active in the free software community. So much so that when Salus suggested a conference pairing Stallman and Torvalds as keynote speakers, Raymond eagerly seconded the idea. With Stallman representing the older, wiser contingent of ITS/Unix hackers and Torvalds representing the younger, more energetic crop of Linux hackers, the pairing indicated a symbolic show of unity that could only be beneficial, especially to ambitious younger (i.e., below 40) hackers such as Raymond. "I sort of had a foot in both camps," Raymond says. + +By the time of the conference, the tension between those two camps had become palpable. Both groups had one thing in common, though: the conference was their first chance to meet the Finnish wunderkind in the flesh. Surprisingly, Torvalds proved himself to be a charming, affable speaker. Possessing only a slight Swedish accent, Torvalds surprised audience members with his quick, self-effacing wit.2 Even more surprising, says Raymond, was Torvalds' equal willingness to take potshots at other prominent hackers, including the most prominent hacker of all, Richard Stallman. By the end of the conference, Torvalds' half-hacker, half-slacker manner was winning over older and younger conference-goers alike. + +"It was a pivotal moment," recalls Raymond. "Before 1996, Richard was the only credible claimant to being the ideological leader of the entire culture. People who dissented didn't do so in public. The person who broke that taboo was Torvalds." + +The ultimate breach of taboo would come near the end of the show. During a discussion on the growing market dominance of Microsoft Windows or some similar topic, Torvalds admitted to being a fan of Microsoft's PowerPoint slideshow software program. From the perspective of old-line software purists, it was like a Mormon bragging in church about his fondness of whiskey. From the perspective of Torvalds and his growing band of followers, it was simply common sense. Why shun worthy proprietary software programs just to make a point? Being a hacker wasn't about suffering, it was about getting the job done. + +"That was a pretty shocking thing to say," Raymond remembers. "Then again, he was able to do that, because by 1995 and 1996, he was rapidly acquiring clout." + +Stallman, for his part, doesn't remember any tension at the 1996 conference, but he does remember later feeling the sting of Torvalds' celebrated cheekiness. "There was a thing in the Linux documentation which says print out the GNU coding standards and then tear them up," says Stallman, recalling one example. "OK, so he disagrees with some of our conventions. That's fine, but he picked a singularly nasty way of saying so. He could have just said `Here's the way I think you should indent your code.' Fine. There should be no hostility there." + +For Raymond, the warm reception other hackers gave to Torvalds' comments merely confirmed his suspicions. The dividing line separating Linux developers from GNU/Linux developers was largely generational. Many Linux hackers, like Torvalds, had grown up in a world of proprietary software. Unless a program was clearly inferior, most saw little reason to rail against a program on licensing issues alone. Somewhere in the universe of free software systems lurked a program that hackers might someday turn into a free software alternative to PowerPoint. Until then, why begrudge Microsoft the initiative of developing the program and reserving the rights to it? + +As a former GNU Project member, Raymond sensed an added dynamic to the tension between Stallman and Torvalds. In the decade since launching the GNU Project, Stallman had built up a fearsome reputation as a programmer. He had also built up a reputation for intransigence both in terms of software design and people management. Shortly before the 1996 conference, the Free Software Foundation would experience a full-scale staff defection, blamed in large part on Stallman. Brian Youmans, a current FSF staffer hired by Salus in the wake of the resignations, recalls the scene: "At one point, Peter [Salus] was the only staff member working in the office." + +For Raymond, the defection merely confirmed a growing suspicion: recent delays such as the HURD and recent troubles such as the Lucid-Emacs schism reflected problems normally associated with software project management, not software code development. Shortly after the Freely Redistributable Software Conference, Raymond began working on his own pet software project, a popmail utility called " fetchmail." Taking a cue from Torvalds, Raymond issued his program with a tacked-on promise to update the source code as early and as often as possible. When users began sending in bug reports and feature suggestions, Raymond, at first anticipating a tangled mess, found the resulting software surprisingly sturdy. Analyzing the success of the Torvalds approach, Raymond issued a quick analysis: using the Internet as his "petri dish" and the harsh scrutiny of the hacker community as a form of natural selection, Torvalds had created an evolutionary model free of central planning. + +What's more, Raymond decided, Torvalds had found a way around Brooks' Law. First articulated by Fred P. Brooks, manager of IBM's OS/360 project and author of the 1975 book, The Mythical Man-Month, Brooks' Law held that adding developers to a project only resulted in further project delays. Believing as most hackers that software, like soup, benefits from a limited number of cooks, Raymond sensed something revolutionary at work. In inviting more and more cooks into the kitchen, Torvalds had actually found away to make the resulting software better.3 + +Raymond put his observations on paper. He crafted them into a speech, which he promptly delivered before a group of friends and neighbors in Chester County, Pennsylvania. Dubbed " The Cathedral and the Bazaar," the speech contrasted the management styles of the GNU Project with the management style of Torvalds and the kernel hackers. Raymond says the response was enthusiastic, but not nearly as enthusiastic as the one he received during the 1997 Linux Kongress, a gathering of Linux users in Germany the next spring. + +"At the Kongress, they gave me a standing ovation at the end of the speech," Raymond recalls. "I took that as significant for two reasons. For one thing, it meant they were excited by what they were hearing. For another thing, it meant they were excited even after hearing the speech delivered through a language barrier." + +Eventually, Raymond would convert the speech into a paper, also titled "The Cathedral and the Bazaar." The paper drew its name from Raymond's central analogy. GNU programs were "cathedrals," impressive, centrally planned monuments to the hacker ethic, built to stand the test of time. Linux, on the other hand, was more like "a great babbling bazaar," a software program developed through the loose decentralizing dynamics of the Internet. + +Implicit within each analogy was a comparison of Stallman and Torvalds. Where Stallman served as the classic model of the cathedral architect-i.e., a programming "wizard" who could disappear for 18 months and return with something like the GNU C Compiler-Torvalds was more like a genial dinner-party host. In letting others lead the Linux design discussion and stepping in only when the entire table needed a referee, Torvalds had created a development model very much reflective of his own laid-back personality. From the Torvalds' perspective, the most important managerial task was not imposing control but keeping the ideas flowing. + +Summarized Raymond, "I think Linus's cleverest and most consequential hack was not the construction of the Linux kernel itself, but rather his invention of the Linux development model."4 + +In summarizing the secrets of Torvalds' managerial success, Raymond himself had pulled off a coup. One of the audience members at the Linux Kongress was Tim O'Reilly, publisher of O'Reilly & Associates, a company specializing in software manuals and software-related books (and the publisher of this book). After hearing Raymond's Kongress speech, O'Reilly promptly invited Raymond to deliver it again at the company's inaugural Perl Conference later that year in Monterey, California. + +Although the conference was supposed to focus on Perl, a scripting language created by Unix hacker Larry Wall, O'Reilly assured Raymond that the conference would address other free software technologies. Given the growing commercial interest in Linux and Apache, a popular free software web server, O'Reilly hoped to use the event to publicize the role of free software in creating the entire infrastructure of the Internet. From web-friendly languages such as Perl and Python to back-room programs such as BIND (the Berkeley Internet Naming Daemon), a software tool that lets users replace arcane IP numbers with the easy-to-remember domain-name addresses (e.g., amazon.com), and sendmail, the most popular mail program on the Internet, free software had become an emergent phenomenon. Like a colony of ants creating a beautiful nest one grain of sand at a time, the only thing missing was the communal self-awareness. O'Reilly saw Raymond's speech as a good way to inspire that self-awareness, to drive home the point that free software development didn't start and end with the GNU Project. Programming languages, such as Perl and Python, and Internet software, such as BIND, sendmail, and Apache, demonstrated that free software was already ubiquitous and influential. He also assured Raymond an even warmer reception than the one at Linux Kongress. + +O'Reilly was right. "This time, I got the standing ovation before the speech," says Raymond, laughing. + +As predicted, the audience was stocked not only with hackers, but with other people interested in the growing power of the free software movement. One contingent included a group from Netscape, the Mountain View, California startup then nearing the end game of its three-year battle with Microsoft for control of the web-browser market. + +Intrigued by Raymond's speech and anxious to win back lost market share, Netscape executives took the message back to corporate headquarters. A few months later, in January, 1998, the company announced its plan to publish the source code of its flagship Navigator web browser in the hopes of enlisting hacker support in future development. + +When Netscape CEO Jim Barksdale cited Raymond's "Cathedral and the Bazaar" essay as a major influence upon the company's decision, the company instantly elevated Raymond to the level of hacker celebrity. Determined not to squander the opportunity, Raymond traveled west to deliver interviews, advise Netscape executives, and take part in the eventual party celebrating the publication of Netscape Navigator's source code. The code name for Navigator's source code was "Mozilla": a reference both to the program's gargantuan size-30 million lines of code-and to its heritage. Developed as a proprietary offshoot of Mosaic, the web browser created by Marc Andreessen at the University of Illinois, Mozilla was proof, yet again, that when it came to building new programs, most programmers preferred to borrow on older, modifiable programs. + +While in California, Raymond also managed to squeeze in a visit to VA Research, a Santa Clara-based company selling workstations with the GNU/Linux operating system preinstalled. Convened by Raymond, the meeting was small. The invite list included VA founder Larry Augustin, a few VA employees, and Christine Peterson, president of the Foresight Institute, a Silicon Valley think tank specializing in nanotechnology. + +"The meeting's agenda boiled down to one item: how to take advantage of Netscape's decision so that other companies might follow suit?" Raymond doesn't recall the conversation that took place, but he does remember the first complaint addressed. Despite the best efforts of Stallman and other hackers to remind people that the word "free" in free software stood for freedom and not price, the message still wasn't getting through. Most business executives, upon hearing the term for the first time, interpreted the word as synonymous with "zero cost," tuning out any follow up messages in short order. Until hackers found a way to get past this cognitive dissonance, the free software movement faced an uphill climb, even after Netscape. + +Peterson, whose organization had taken an active interest in advancing the free software cause, offered an alternative: open source. + +Looking back, Peterson says she came up with the open source term while discussing Netscape's decision with a friend in the public relations industry. She doesn't remember where she came upon the term or if she borrowed it from another field, but she does remember her friend disliking the term.5 + +At the meeting, Peterson says, the response was dramatically different. "I was hesitant about suggesting it," Peterson recalls. "I had no standing with the group, so started using it casually, not highlighting it as a new term." To Peterson's surprise, the term caught on. By the end of the meeting, most of the attendees, including Raymond, seemed pleased by it. + +Raymond says he didn't publicly use the term "open source" as a substitute for free software until a day or two after the Mozilla launch party, when O'Reilly had scheduled a meeting to talk about free software. Calling his meeting "the Freeware Summit," O'Reilly says he wanted to direct media and community attention to the other deserving projects that had also encouraged Netscape to release Mozilla. "All these guys had so much in common, and I was surprised they didn't all know each other," says O'Reilly. "I also wanted to let the world know just how great an impact the free software culture had already made. People were missing out on a large part of the free software tradition." + +In putting together the invite list, however, O'Reilly made a decision that would have long-term political consequences. He decided to limit the list to west-coast developers such as Wall, Eric Allman, creator of sendmail, and Paul Vixie, creator of BIND. There were exceptions, of course: Pennsylvania-resident Raymond, who was already in town thanks to the Mozilla launch, earned a quick invite. So did Virginia-resident Guido van Rossum, creator of Python. "Frank Willison, my editor in chief and champion of Python within the company, invited him without first checking in with me," O'Reilly recalls. "I was happy to have him there, but when I started, it really was just a local gathering." + +For some observers, the unwillingness to include Stallman's name on the list qualified as a snub. "I decided not to go to the event because of it," says Perens, remembering the summit. Raymond, who did go, says he argued for Stallman's inclusion to no avail. The snub rumor gained additional strength from the fact that O'Reilly, the event's host, had feuded publicly with Stallman over the issue of software-manual copyrights. Prior to the meeting, Stallman had argued that free software manuals should be as freely copyable and modifiable as free software programs. O'Reilly, meanwhile, argued that a value-added market for nonfree books increased the utility of free software by making it more accessible to a wider community. The two had also disputed the title of the event, with Stallman insisting on "Free Software" over the less politically laden "Freeware." + +Looking back, O'Reilly doesn't see the decision to leave Stallman's name off the invite list as a snub. "At that time, I had never met Richard in person, but in our email interactions, he'd been inflexible and unwilling to engage in dialogue. I wanted to make sure the GNU tradition was represented at the meeting, so I invited John Gilmore and Michael Tiemann, whom I knew personally, and whom I knew were passionate about the value of the GPL but seemed more willing to engage in a frank back-and-forth about the strengths and weaknesses of the various free software projects and traditions. Given all the later brouhaha, I do wish I'd invited Richard as well, but I certainly don't think that my failure to do so should be interpreted as a lack of respect for the GNU Project or for Richard personally." + +Snub or no snub, both O'Reilly and Raymond say the term "open source" won over just enough summit-goers to qualify as a success. The attendees shared ideas and experiences and brainstormed on how to improve free software's image. Of key concern was how to point out the successes of free software, particularly in the realm of Internet infrastructure, as opposed to playing up the GNU/Linux challenge to Microsoft Windows. But like the earlier meeting at VA, the discussion soon turned to the problems associated with the term "free software." O'Reilly, the summit host, remembers a particularly insightful comment from Torvalds, a summit attendee. + +"Linus had just moved to Silicon Valley at that point, and he explained how only recently that he had learned that the word `free' had two meanings-free as in `libre' and free as in `gratis'-in English." + +Michael Tiemann, founder of Cygnus, proposed an alternative to the troublesome "free software" term: sourceware. "Nobody got too excited about it," O'Reilly recalls. "That's when Eric threw out the term `open source.'" + +Although the term appealed to some, support for a change in official terminology was far from unanimous. At the end of the one-day conference, attendees put the three terms-free software, open source, or sourceware-to a vote. According to O'Reilly, 9 out of the 15 attendees voted for "open source." Although some still quibbled with the term, all attendees agreed to use it in future discussions with the press. "We wanted to go out with a solidarity message," O'Reilly says. + +The term didn't take long to enter the national lexicon. Shortly after the summit, O'Reilly shepherded summit attendees to a press conference attended by reporters from the New York Times, the Wall Street Journal, and other prominent publications. Within a few months, Torvalds' face was appearing on the cover of Forbes magazine, with the faces of Stallman, Perl creator Larry Wall, and Apache team leader Brian Behlendorf featured in the interior spread. Open source was open for business. + +For summit attendees such as Tiemann, the solidarity message was the most important thing. Although his company had achieved a fair amount of success selling free software tools and services, he sensed the difficulty other programmers and entrepreneurs faced. + +"There's no question that the use of the word free was confusing in a lot of situations," Tiemann says. "Open source positioned itself as being business friendly and business sensible. Free software positioned itself as morally righteous. For better or worse we figured it was more advantageous to align with the open source crowd. + +For Stallman, the response to the new "open source" term was slow in coming. Raymond says Stallman briefly considered adopting the term, only to discard it. "I know because I had direct personal conversations about it," Raymond says. + +By the end of 1998, Stallman had formulated a position: open source, while helpful in communicating the technical advantages of free software, also encouraged speakers to soft-pedal the issue of software freedom. Given this drawback, Stallman would stick with the term free software. + +Summing up his position at the 1999 LinuxWorld Convention and Expo, an event billed by Torvalds himself as a "coming out party" for the Linux community, Stallman implored his fellow hackers to resist the lure of easy compromise. + +"Because we've shown how much we can do, we don't have to be desperate to work with companies or compromise our goals," Stallman said during a panel discussion. "Let them offer and we'll accept. We don't have to change what we're doing to get them to help us. You can take a single step towards a goal, then another and then more and more and you'll actually reach your goal. Or, you can take a half measure that means you don't ever take another step and you'll never get there." + +Even before the LinuxWorld show, however, Stallman was showing an increased willingness to alienate his more conciliatory peers. A few months after the Freeware Summit, O'Reilly hosted its second annual Perl Conference. This time around, Stallman was in attendance. During a panel discussion lauding IBM's decision to employ the free software Apache web server in its commercial offerings, Stallman, taking advantage of an audience microphone, disrupted the proceedings with a tirade against panelist John Ousterhout, creator of the Tcl scripting language. Stallman branded Ousterhout a "parasite" on the free software community for marketing a proprietary version of Tcl via Ousterhout's startup company, Scriptics. "I don't think Scriptics is necessary for the continued existence of Tcl," Stallman said to hisses from the fellow audience members.5 + +"It was a pretty ugly scene," recalls Prime Time Freeware's Rich Morin. "John's done some pretty respectable things: Tcl, Tk, Sprite. He's a real contributor." + +Despite his sympathies for Stallman and Stallman's position, Morin felt empathy for those troubled by Stallman's discordant behavior. + +Stallman's Perl Conference outburst would momentarily chase off another potential sympathizer, Bruce Perens. In 1998, Eric Raymond proposed launching the Open Source Initiative, or OSI, an organization that would police the use of the term "open source" and provide a definition for companies interested in making their own programs. Raymond recruited Perens to draft the definition.6 + +Perens would later resign from the OSI, expressing regret that the organization had set itself up in opposition to Stallman and the FSF. Still, looking back on the need for a free software definition outside the Free Software Foundation's auspices, Perens understands why other hackers might still feel the need for distance. "I really like and admire Richard," says Perens. "I do think Richard would do his job better if Richard had more balance. That includes going away from free software for a couple of months." + +Stallman's monomaniacal energies would do little to counteract the public-relations momentum of open source proponents. In August of 1998, when chip-maker Intel purchased a stake in GNU/Linux vendor Red Hat, an accompanying New York Times article described the company as the product of a movement "known alternatively as free software and open source."7 Six months later, a John Markoff article on Apple Computer was proclaiming the company's adoption of the "open source" Apache server in the article headline.8 + +Such momentum would coincide with the growing momentum of companies that actively embraced the "open source" term. By August of 1999, Red Hat, a company that now eagerly billed itself as "open source," was selling shares on Nasdaq. In December, VA Linux-formerly VA Research-was floating its own IPO to historical effect. Opening at $30 per share, the company's stock price exploded past the $300 mark in initial trading only to settle back down to the $239 level. Shareholders lucky enough to get in at the bottom and stay until the end experienced a 698% increase in paper wealth, a Nasdaq record. + +Among those lucky shareholders was Eric Raymond, who, as a company board member since the Mozilla launch, had received 150,000 shares of VA Linux stock. Stunned by the realization that his essay contrasting the Stallman-Torvalds managerial styles had netted him $36 million in potential wealth, Raymond penned a follow-up essay. In it, Raymond mused on the relationship between the hacker ethic and monetary wealth: + + Reporters often ask me these days if I think the open-source community will be corrupted by the influx of big money. I tell them what I believe, which is this: commercial demand for programmers has been so intense for so long that anyone who can be seriously distracted by money is already gone. Our community has been self-selected for caring about other things-accomplishment, pride, artistic passion, and each other.9 + +Whether or not such comments allayed suspicions that Raymond and other open source proponents had simply been in it for the money, they drove home the open source community's ultimate message: all you needed to sell the free software concept is a friendly face and a sensible message. Instead of fighting the marketplace head-on as Stallman had done, Raymond, Torvalds, and other new leaders of the hacker community had adopted a more relaxed approach-ignoring the marketplace in some areas, leveraging it in others. Instead of playing the role of high-school outcasts, they had played the game of celebrity, magnifying their power in the process. + +"On his worst days Richard believes that Linus Torvalds and I conspired to hijack his revolution," Raymond says. "Richard's rejection of the term open source and his deliberate creation of an ideological fissure in my view comes from an odd mix of idealism and territoriality. There are people out there who think it's all Richard's personal ego. I don't believe that. It's more that he so personally associates himself with the free software idea that he sees any threat to that as a threat to himself." + +Ironically, the success of open source and open source advocates such as Raymond would not diminish Stallman's role as a leader. If anything, it gave Stallman new followers to convert. Still, the Raymond territoriality charge is a damning one. There are numerous instances of Stallman sticking to his guns more out of habit than out of principle: his initial dismissal of the Linux kernel, for example, and his current unwillingness as a political figure to venture outside the realm of software issues. + +Then again, as the recent debate over open source also shows, in instances when Stallman has stuck to his guns, he's usually found a way to gain ground because of it. "One of Stallman's primary character traits is the fact he doesn't budge," says Ian Murdock. "He'll wait up to a decade for people to come around to his point of view if that's what it takes." + +Murdock, for one, finds that unbudgeable nature both refreshing and valuable. Stallman may no longer be the solitary leader of the free software movement, but he is still the polestar of the free software community. "You always know that he's going to be consistent in his views," Murdock says. "Most people aren't like that. Whether you agree with him or not, you really have to respect that." + + +Chapter 12 +A Brief Journey Through Hacker Hell +Richard Stallman stares, unblinking, through the windshield of a rental car, waiting for the light to change as we make our way through downtown Kihei. + +The two of us are headed to the nearby town of Pa'ia, where we are scheduled to meet up with some software programmers and their wives for dinner in about an hour or so. + +It's about two hours after Stallman's speech at the Maui High Performance Center, and Kihei, a town that seemed so inviting before the speech, now seems profoundly uncooperative. Like most beach cities, Kihei is a one-dimensional exercise in suburban sprawl. Driving down its main drag, with its endless succession of burger stands, realty agencies, and bikini shops, it's hard not to feel like a steel-coated morsel passing through the alimentary canal of a giant commercial tapeworm. The feeling is exacerbated by the lack of side roads. With nowhere to go but forward, traffic moves in spring-like lurches. 200 yards ahead, a light turns green. By the time we are moving, the light is yellow again. + +For Stallman, a lifetime resident of the east coast, the prospect of spending the better part of a sunny Hawaiian afternoon trapped in slow traffic is enough to trigger an embolism. Even worse is the knowledge that, with just a few quick right turns a quarter mile back, this whole situation easily could have been avoided. Unfortunately, we are at the mercy of the driver ahead of us, a programmer from the lab who knows the way and who has decided to take us to Pa'ia via the scenic route instead of via the nearby Pilani Highway. + +"This is terrible," says Stallman between frustrated sighs. "Why didn't we take the other route?" + +Again, the light a quarter mile ahead of us turns green. Again, we creep forward a few more car lengths. This process continues for another 10 minutes, until we finally reach a major crossroad promising access to the adjacent highway. + +The driver ahead of us ignores it and continues through the intersection. + +"Why isn't he turning?" moans Stallman, throwing up his hands in frustration. "Can you believe this?" + +I decide not to answer either. I find the fact that I am sitting in a car with Stallman in the driver seat, in Maui no less, unbelievable enough. Until two hours ago, I didn't even know Stallman knew how to drive. Now, listening to Yo-Yo Ma's cello playing the mournful bass notes of "Appalachian Journey" on the car stereo and watching the sunset pass by on our left, I do my best to fade into the upholstery. + +When the next opportunity to turn finally comes up, Stallman hits his right turn signal in an attempt to cue the driver ahead of us. No such luck. Once again, we creep slowly through the intersection, coming to a stop a good 200 yards before the next light. By now, Stallman is livid. + +"It's like he's deliberately ignoring us," he says, gesturing and pantomiming like an air craft carrier landing-signals officer in a futile attempt to catch our guide's eye. The guide appears unfazed, and for the next five minutes all we see is a small portion of his head in the rearview mirror. + +I look out Stallman's window. Nearby Kahoolawe and Lanai Islands provide an ideal frame for the setting sun. It's a breathtaking view, the kind that makes moments like this a bit more bearable if you're a Hawaiian native, I suppose. I try to direct Stallman's attention to it, but Stallman, by now obsessed by the inattentiveness of the driver ahead of us, blows me off. + +When the driver passes through another green light, completely ignoring a "Pilani Highway Next Right," I grit my teeth. I remember an early warning relayed to me by BSD programmer Keith Bostic. "Stallman does not suffer fools gladly," Bostic warned me. "If somebody says or does something stupid, he'll look them in the eye and say, `That's stupid.'" + +Looking at the oblivious driver ahead of us, I realize that it's the stupidity, not the inconvenience, that's killing Stallman right now. + +"It's as if he picked this route with absolutely no thought on how to get there efficiently," Stallman says. + +The word "efficiently" hangs in the air like a bad odor. Few things irritate the hacker mind more than inefficiency. It was the inefficiency of checking the Xerox laser printer two or three times a day that triggered Stallman's initial inquiry into the printer source code. It was the inefficiency of rewriting software tools hijacked by commercial software vendors that led Stallman to battle Symbolics and to launch the GNU Project. If, as Jean Paul Sartre once opined, hell is other people, hacker hell is duplicating other people's stupid mistakes, and it's no exaggeration to say that Stallman's entire life has been an attempt to save mankind from these fiery depths. + +This hell metaphor becomes all the more apparent as we take in the slowly passing scenery. With its multitude of shops, parking lots, and poorly timed street lights, Kihei seems less like a city and more like a poorly designed software program writ large. Instead of rerouting traffic and distributing vehicles through side streets and expressways, city planners have elected to run everything through a single main drag. From a hacker perspective, sitting in a car amidst all this mess is like listening to a CD rendition of nails on a chalkboard at full volume. + +"Imperfect systems infuriate hackers," observes Steven Levy, another warning I should have listened to before climbing into the car with Stallman. "This is one reason why hackers generally hate driving cars-the system of randomly programmed red lights and oddly laid out one-way streets causes delays which are so goddamn unnecessary [Levy's emphasis] that the impulse is to rearrange signs, open up traffic-light control boxes . . . redesign the entire system."1 + +More frustrating, however, is the duplicity of our trusted guide. Instead of searching out a clever shortcut-as any true hacker would do on instinct-the driver ahead of us has instead chosen to play along with the city planners' game. Like Virgil in Dante's Inferno, our guide is determined to give us the full guided tour of this hacker hell whether we want it or not. + +Before I can make this observation to Stallman, the driver finally hits his right turn signal. Stallman's hunched shoulders relax slightly, and for a moment the air of tension within the car dissipates. The tension comes back, however, as the driver in front of us slows down. "Construction Ahead" signs line both sides of the street, and even though the Pilani Highway lies less than a quarter mile off in the distance, the two-lane road between us and the highway is blocked by a dormant bulldozer and two large mounds of dirt. + +It takes Stallman a few seconds to register what's going on as our guide begins executing a clumsy five-point U-turn in front of us. When he catches a glimpse of the bulldozer and the "No Through Access" signs just beyond, Stallman finally boils over. + +"Why, why, why?" he whines, throwing his head back. "You should have known the road was blocked. You should have known this way wouldn't work. You did this deliberately." + +The driver finishes the turn and passes us on the way back toward the main drag. As he does so, he shakes his head and gives us an apologetic shrug. Coupled with a toothy grin, the driver's gesture reveals a touch of mainlander frustration but is tempered with a protective dose of islander fatalism. Coming through the sealed windows of our rental car, it spells out a succinct message: "Hey, it's Maui; what are you gonna do?" + +Stallman can take it no longer. + +"Don't you fucking smile!" he shouts, fogging up the glass as he does so. "It's your fucking fault. This all could have been so much easier if we had just done it my way." + +Stallman accents the words "my way" by gripping the steering wheel and pulling himself towards it twice. The image of Stallman's lurching frame is like that of a child throwing a temper tantrum in a car seat, an image further underlined by the tone of Stallman's voice. Halfway between anger and anguish, Stallman seems to be on the verge of tears. + +Fortunately, the tears do not arrive. Like a summer cloudburst, the tantrum ends almost as soon as it begins. After a few whiny gasps, Stallman shifts the car into reverse and begins executing his own U-turn. By the time we are back on the main drag, his face is as impassive as it was when we left the hotel 30 minutes earlier. + +It takes less than five minutes to reach the next cross-street. This one offers easy highway access, and within seconds, we are soon speeding off toward Pa'ia at a relaxing rate of speed. The sun that once loomed bright and yellow over Stallman's left shoulder is now burning a cool orange-red in our rearview mirror. It lends its color to the gauntlet wili wili trees flying past us on both sides of the highway. + +For the next 20 minutes, the only sound in our vehicle, aside from the ambient hum of the car's engine and tires, is the sound of a cello and a violin trio playing the mournful strains of an Appalachian folk tune. + + +Chapter 13 +Continuing the Fight +For Richard Stallman, time may not heal all wounds, but it does provide a convenient ally. + +Four years after " The Cathedral and the Bazaar," Stallman still chafes over the Raymond critique. He also grumbles over Linus Torvalds' elevation to the role of world's most famous hacker. He recalls a popular T-shirt that began showing at Linux tradeshows around 1999. Designed to mimic the original promotional poster for Star Wars, the shirt depicted Torvalds brandishing a lightsaber like Luke Skywalker, while Stallman's face rides atop R2D2. The shirt still grates on Stallmans nerves not only because it depicts him as a Torvalds' sidekick, but also because it elevates Torvalds to the leadership role in the free software/open source community, a role even Torvalds himself is loath to accept. "It's ironic," says Stallman mournfully. "Picking up that sword is exactly what Linus refuses to do. He gets everybody focusing on him as the symbol of the movement, and then he won't fight. What good is it?" + +Then again, it is that same unwillingness to "pick up the sword," on Torvalds part, that has left the door open for Stallman to bolster his reputation as the hacker community's ethical arbiter. Despite his grievances, Stallman has to admit that the last few years have been quite good, both to himself and to his organization. Relegated to the periphery by the unforeseen success of GNU/Linux, Stallman has nonetheless successfully recaptured the initiative. His speaking schedule between January 2000 and December 2001 included stops on six continents and visits to countries where the notion of software freedom carries heavy overtones-China and India, for example. + +Outside the bully pulpit, Stallman has also learned how to leverage his power as costeward of the GNU General Public License (GPL). During the summer of 2000, while the air was rapidly leaking out of the 1999 Linux IPO bubble, Stallman and the Free Software Foundation scored two major victories. In July, 2000, Troll Tech, a Norwegian software company and developer of Qt, a valuable suite of graphics tools for the GNU/Linux operating system, announced it was licensing its software under the GPL. A few weeks later, Sun Microsystems, a company that, until then, had been warily trying to ride the open source bandwagon without giving up total control of its software properties, finally relented and announced that it, too, was dual licensing its new OpenOffice application suite under the Lesser GNU Public License (LGPL) and the Sun Industry Standards Source License (SISSL). + +Underlining each victory was the fact that Stallman had done little to fight for them. In the case of Troll Tech, Stallman had simply played the role of free software pontiff. In 1999, the company had come up with a license that met the conditions laid out by the Free Software Foundation, but in examining the license further, Stallman detected legal incompatibles that would make it impossible to bundle Qt with GPL-protected software programs. Tired of battling Stallman, Troll Tech management finally decided to split the Qt into two versions, one GPL-protected and one QPL-protected, giving developers a way around the compatibility issues cited by Stallman. + +In the case of Sun, they desired to play according to the Free Software Foundation's conditions. At the 1999 O'Reilly Open Source Conference, Sun Microsystems cofounder and chief scientist Bill Joy defended his company's "community source" license, essentially a watered-down compromise letting users copy and modify Sun-owned software but not charge a fee for said software without negotiating a royalty agreement with Sun. A year after Joy's speech, Sun Microsystems vice president Marco Boerries was appearing on the same stage spelling out the company's new licensing compromise in the case of OpenOffice, an office-application suite designed specifically for the GNU/Linux operating system. + +"I can spell it out in three letters," said Boerries. "GPL." + +At the time, Boerries said his company's decision had little to do with Stallman and more to do with the momentum of GPL-protected programs. "What basically happened was the recognition that different products attracted different communities, and the license you use depends on what type of community you want to attract," said Boerries. "With [OpenOffice], it was clear we had the highest correlation with the GPL community."1 + +Such comments point out the under-recognized strength of the GPL and, indirectly, the political genius of man who played the largest role in creating it. "There isn't a lawyer on earth who would have drafted the GPL the way it is," says Eben Moglen, Columbia University law professor and Free Software Foundation general counsel. "But it works. And it works because of Richard's philosophy of design." + +A former professional programmer, Moglen traces his pro bono work with Stallman back to 1990 when Stallman requested Moglen's legal assistance on a private affair. Moglen, then working with encryption expert Phillip Zimmerman during Zimmerman's legal battles with the National Security Administration, says he was honored by the request. "I told him I used Emacs every day of my life, and it would take an awful lot of lawyering on my part to pay off the debt." + +Since then, Moglen, perhaps more than any other individual, has had the best chance to observe the crossover of Stallman's hacker philosophies into the legal realm. Moglen says the difference between Stallman's approach to legal code and software code are largely the same. "I have to say, as a lawyer, the idea that what you should do with a legal document is to take out all the bugs doesn't make much sense," Moglen says. "There is uncertainty in every legal process, and what most lawyers want to do is to capture the benefits of uncertainty for their client. Richard's goal is the complete opposite. His goal is to remove uncertainty, which is inherently impossible. It is inherently impossible to draft one license to control all circumstances in all legal systems all over the world. But if you were to go at it, you would have to go at it his way. And the resulting elegance, the resulting simplicity in design almost achieves what it has to achieve. And from there a little lawyering will carry you quite far." + +As the person charged with pushing the Stallman agenda, Moglen understands the frustration of would-be allies. "Richard is a man who does not want to compromise over matters that he thinks of as fundamental," Moglen says, "and he does not take easily the twisting of words or even just the seeking of artful ambiguity, which human society often requires from a lot of people." + +Because of the Free Software Foundation's unwillingness to weigh in on issues outside the purview of GNU development and GPL enforcement, Moglen has taken to devoting his excess energies to assisting the Electronic Frontier Foundation, the organization providing legal aid to recent copyright defendants such as Dmitri Skylarov. In 2000, Moglen also served as direct counsel to a collection of hackers that were joined together from circulating the DVD decryption program deCSS. Despite the silence of his main client in both cases, Moglen has learned to appreciate the value of Stallman's stubbornness. "There have been times over the years where I've gone to Richard and said, `We have to do this. We have to do that. Here's the strategic situation. Here's the next move. Here's what he have to do.' And Richard's response has always been, `We don't have to do anything.' Just wait. What needs doing will get done." + +"And you know what?" Moglen adds. "Generally, he's been right." + +Such comments disavow Stallman's own self-assessment: "I'm not good at playing games," Stallman says, addressing the many unseen critics who see him as a shrewd strategist. "I'm not good at looking ahead and anticipating what somebody else might do. My approach has always been to focus on the foundation, to say `Let's make the foundation as strong as we can make it.'" + +The GPL's expanding popularity and continuing gravitational strength are the best tributes to the foundation laid by Stallman and his GNU colleagues. While no longer capable of billing himself as the "last true hacker," Stallman nevertheless can take sole credit for building the free software movement's ethical framework. Whether or not other modern programmers feel comfortable working inside that framework is immaterial. The fact that they even have a choice at all is Stallman's greatest legacy. + +Discussing Stallman's legacy at this point seems a bit premature. Stallman, 48 at the time of this writing, still has a few years left to add to or subtract from that legacy. Still, the autopilot nature of the free software movement makes it tempting to examine Stallman's life outside the day-to-day battles of the software industry and within a more august, historical setting. + +To his credit, Stallman refuses all opportunities to speculate. "I've never been able to work out detailed plans of what the future was going to be like," says Stallman, offering his own premature epitaph. "I just said `I'm going to fight. Who knows where I'll get?'" + +There's no question that in picking his fights, Stallman has alienated the very people who might otherwise have been his greatest champions. It is also a testament to his forthright, ethical nature that many of Stallman's erstwhile political opponents still manage to put in a few good words for him when pressed. The tension between Stallman the ideologue and Stallman the hacker genius, however, leads a biographer to wonder: how will people view Stallman when Stallman's own personality is no longer there to get in the way? + +In early drafts of this book, I dubbed this question the "100 year" question. Hoping to stimulate an objective view of Stallman and his work, I asked various software-industry luminaries to take themselves out of the current timeframe and put themselves in a position of a historian looking back on the free software movement 100 years in the future. From the current vantage point, it is easy to see similarities between Stallman and past Americans who, while somewhat marginal during their lifetime, have attained heightened historical importance in relation to their age. Easy comparisons include Henry David Thoreau, transcendentalist philosopher and author of On Civil Disobedience, and John Muir, founder of the Sierra Club and progenitor of the modern environmental movement. It is also easy to see similarities in men like William Jennings Bryan, a.k.a. "The Great Commoner," leader of the populist movement, enemy of monopolies, and a man who, though powerful, seems to have faded into historical insignificance. + +Although not the first person to view software as public property, Stallman is guaranteed a footnote in future history books thanks to the GPL. Given that fact, it seems worthwhile to step back and examine Richard Stallman's legacy outside the current time frame. Will the GPL still be something software programmers use in the year 2102, or will it have long since fallen by the wayside? Will the term "free software" seem as politically quaint as "free silver" does today, or will it seem eerily prescient in light of later political events? + +Predicting the future is risky sport, but most people, when presented with the question, seemed eager to bite. "One hundred years from now, Richard and a couple of other people are going to deserve more than a footnote," says Moglen. "They're going to be viewed as the main line of the story." + +The "couple other people" Moglen nominates for future textbook chapters include John Gilmore, Stallman's GPL advisor and future founder of the Electronic Frontier Foundation, and Theodor Holm Nelson, a.k.a. Ted Nelson, author of the 1982 book, Literary Machines. Moglen says Stallman, Nelson, and Gilmore each stand out in historically significant, nonoverlapping ways. He credits Nelson, commonly considered to have coined the term "hypertext," for identifying the predicament of information ownership in the digital age. Gilmore and Stallman, meanwhile, earn notable credit for identifying the negative political effects of information control and building organizations-the Electronic Frontier Foundation in the case of Gilmore and the Free Software Foundation in the case of Stallman-to counteract those effects. Of the two, however, Moglen sees Stallman's activities as more personal and less political in nature. + +"Richard was unique in that the ethical implications of unfree software were particularly clear to him at an early moment," says Moglen. "This has a lot to do with Richard's personality, which lots of people will, when writing about him, try to depict as epiphenomenal or even a drawback in Richard Stallman's own life work." + +Gilmore, who describes his inclusion between the erratic Nelson and the irascible Stallman as something of a "mixed honor," nevertheless seconds the Moglen argument. Writes Gilmore: + + My guess is that Stallman's writings will stand up as well as Thomas Jefferson's have; he's a pretty clear writer and also clear on his principles . . . Whether Richard will be as influential as Jefferson will depend on whether the abstractions we call "civil rights" end up more important a hundred years from now than the abstractions that we call "software" or "technically imposed restrictions." + +Another element of the Stallman legacy not to be overlooked, Gilmore writes, is the collaborative software-development model pioneered by the GNU Project. Although flawed at times, the model has nevertheless evolved into a standard within the software-development industry. All told, Gilmore says, this collaborative software-development model may end up being even more influential than the GNU Project, the GPL License, or any particular software program developed by Stallman: + + Before the Internet, it was quite hard to collaborate over distance on software, even among teams that know and trust each other. Richard pioneered collaborative development of software, particularly by disorganized volunteers who seldom meet each other. Richard didn't build any of the basic tools for doing this (the TCP protocol, email lists, diff and patch, tar files, RCS or CVS or remote-CVS), but he used the ones that were available to form social groups of programmers who could effectively collaborate. + +Lawrence Lessig, Stanford law professor and author of the 2001 book, The Future of Ideas, is similarly bullish. Like many legal scholars, Lessig sees the GPL as a major bulwark of the current so-called "digital commons," the vast agglomeration of community-owned software programs, network and telecommunication standards that have triggered the Internet's exponential growth over the last three decades. Rather than connect Stallman with other Internet pioneers, men such as Vannevar Bush, Vinton Cerf, and J. C. R. Licklider who convinced others to see computer technology on a wider scale, Lessig sees Stallman's impact as more personal, introspective, and, ultimately, unique: + + [Stallman] changed the debate from is to ought. He made people see how much was at stake, and he built a device to carry these ideals forward . . . That said, I don't quite know how to place him in the context of Cerf or Licklider. The innovation is different. It is not just about a certain kind of code, or enabling the Internet. [It's] much more about getting people to see the value in a certain kind of Internet. I don't think there is anyone else in that class, before or after. + +Not everybody sees the Stallman legacy as set in stone, of course. Eric Raymond, the open source proponent who feels that Stallman's leadership role has diminished significantly since 1996, sees mixed signals when looking into the 2102 crystal ball: + + I think Stallman's artifacts (GPL, Emacs, GCC) will be seen as revolutionary works, as foundation-stones of the information world. I think history will be less kind to some of the theories from which RMS operated, and not kind at all to his personal tendency towards territorial, cult-leader behavior. + +As for Stallman himself, he, too, sees mixed signals: + + What history says about the GNU Project, twenty years from now, will depend on who wins the battle of freedom to use public knowledge. If we lose, we will be just a footnote. If we win, it is uncertain whether people will know the role of the GNU operating system-if they think the system is "Linux," they will build a false picture of what happened and why. + + But even if we win, what history people learn a hundred years from now is likely to depend on who dominates politically. + +Searching for his own 19th-century historical analogy, Stallman summons the figure of John Brown, the militant abolitionist regarded as a hero on one side of the Mason Dixon line and a madman on the other. + +John Brown's slave revolt never got going, but during his subsequent trial he effectively roused national demand for abolition. During the Civil War, John Brown was a hero; 100 years after, and for much of the 1900s, history textbooks taught that he was crazy. During the era of legal segregation, while bigotry was shameless, the US partly accepted the story that the South wanted to tell about itself, and history textbooks said many untrue things about the Civil War and related events. + +Such comparisons document both the self-perceived peripheral nature of Stallman's current work and the binary nature of his current reputation. Although it's hard to see Stallman's reputation falling to the level of infamy as Brown's did during the post-Reconstruction period-Stallman, despite his occasional war-like analogies, has done little to inspire violence-it's easy to envision a future in which Stallman's ideas wind up on the ash-heap. In fashioning the free software cause not as a mass movement but as a collection of private battles against the forces of proprietary temptation, Stallman seems to have created a unwinnable situation, especially for the many acolytes with the same stubborn will. + +Then again, it is that very will that may someday prove to be Stallman's greatest lasting legacy. Moglen, a close observer over the last decade, warns those who mistake the Stallman personality as counter-productive or epiphenomenal to the "artifacts" of Stalllman's life. Without that personality, Moglen says, there would be precious few artifiacts to discuss. Says Moglen, a former Supreme Court clerk: + + Look, the greatest man I ever worked for was Thurgood Marshall. I knew what made him a great man. I knew why he had been able to change the world in his possible way. I would be going out on a limb a little bit if I were to make a comparison, because they could not be more different. Thurgood Marshall was a man in society, representing an outcast society to the society that enclosed it, but still a man in society. His skill was social skills. But he was all of a piece, too. Different as they were in every other respect, that the person I most now compare him to in that sense, all of a piece, compact, made of the substance that makes stars, all the way through, is Stallman. + +In an effort to drive that image home, Moglen reflects on a shared moment in the spring of 2000. The success of the VA Linux IPO was still resonating in the business media, and a half dozen free software-related issues were swimming through the news. Surrounded by a swirling hurricane of issues and stories each begging for comment, Moglen recalls sitting down for lunch with Stallman and feeling like a castaway dropped into the eye of the storm. For the next hour, he says, the conversation calmly revolved around a single topic: strengthening the GPL. + +"We were sitting there talking about what we were going to do about some problems in Eastern Europe and what we were going to do when the problem of the ownership of content began to threaten free software," Moglen recalls. "As we were talking, I briefly thought about how we must have looked to people passing by. Here we are, these two little bearded anarchists, plotting and planning the next steps. And, of course, Richard is plucking the knots from his hair and dropping them in the soup and behaving in his usual way. Anybody listening in on our conversation would have thought we were crazy, but I knew: I knew the revolution's right here at this table. This is what's making it happen. And this man is the person making it happen." + +Moglen says that moment, more than any other, drove home the elemental simplicity of the Stallman style. + +"It was funny," recalls Moglen. "I said to him, `Richard, you know, you and I are the two guys who didn't make any money out of this revolution.' And then I paid for the lunch, because I knew he didn't have the money to pay for it .'" + + +Chapter 14 +Epilogue: Crushing Loneliness +Writing the biography of a living person is a bit like producing a play. The drama in front of the curtain often pales in comparison to the drama backstage. + +In The Autobiography of Malcolm X, Alex Haley gives readers a rare glimpse of that backstage drama. Stepping out of the ghostwriter role, Haley delivers the book's epilogue in his own voice. The epilogue explains how a freelance reporter originally dismissed as a "tool" and "spy" by the Nation of Islam spokesperson managed to work through personal and political barriers to get Malcolm X's life story on paper. + +While I hesitate to compare this book with The Autobiography of Malcolm X, I do owe a debt of gratitude to Haley for his candid epilogue. Over the last 12 months, it has served as a sort of instruction manual on how to deal with a biographical subject who has built an entire career on being disagreeable. From the outset, I envisioned closing this biography with a similar epilogue, both as an homage to Haley and as a way to let readers know how this book came to be. + +The story behind this story starts in an Oakland apartment, winding its way through the various locales mentioned in the book-Silicon Valley, Maui, Boston, and Cambridge. Ultimately, however, it is a tale of two cities: New York, New York, the book-publishing capital of the world, and Sebastopol, California, the book-publishing capital of Sonoma County. + +The story starts in April, 2000. At the time, I was writing stories for the ill-fated BeOpen web site (http://www.beopen.com/). One of my first assignments was a phone interview with Richard M. Stallman. The interview went well, so well that Slashdot (http://www.slashdot.org/), the popular "news for nerds" site owned by VA Software, Inc. (formerly VA Linux Systems and before that, VA Research), gave it a link in its daily list of feature stories. Within hours, the web servers at BeOpen were heating up as readers clicked over to the site. + +For all intents and purposes, the story should have ended there. Three months after the interview, while attending the O'Reilly Open Source Conference in Monterey, California, I received the following email message from Tracy Pattison, foreign-rights manager at a large New York publishing house: + +To: sam@BeOpen.com Subject: +RMS InterviewDate: Mon, 10 Jul 2000 15:56:37 -0400Dear Mr. Williams, + +I read your interview with Richard Stallman on BeOpen with great +interest. I've been intrigued by RMS and his work for some time now +and was delighted to find your piece which I really think you did a +great job of capturing some of the spirit of what Stallman is trying +to do with GNU-Linux and the Free Software Foundation. + +What I'd love to do, however, is read more - and I don't think I'm +alone. Do you think there is more information and/or sources out there +to expand and update your interview and adapt it into more of a +profile of Stallman? Perhaps including some more anecdotal information +about his personality and background that might really interest and +enlighten readers outside the more hardcore programming scene? + +The email asked that I give Tracy a call to discuss the idea further. I did just that. Tracy told me her company was launching a new electronic book line, and it wanted stories that appealed to an early-adopter audience. The e-book format was 30,000 words, about 100 pages, and she had pitched her bosses on the idea of profiling a major figure in the hacker community. Her bosses liked the idea, and in the process of searching for interesting people to profile, she had come across my BeOpen interview with Stallman. Hence her email to me. + +That's when Tracy asked me: would I be willing to expand the interview into a full-length feature profile? + +My answer was instant: yes. Before accepting it, Tracy suggested I put together a story proposal she could show her superiors. Two days later, I sent her a polished proposal. A week later, Tracy sent me a follow up email. Her bosses had given it the green light. + +I have to admit, getting Stallman to participate in an e-book project was an afterthought on my part. As a reporter who covered the open source beat, I knew Stallman was a stickler. I'd already received a half dozen emails at that point upbraiding me for the use of "Linux" instead of "GNU/Linux." + +Then again, I also knew Stallman was looking for ways to get his message out to the general public. Perhaps if I presented the project to him that way, he would be more receptive. If not, I could always rely upon the copious amounts of documents, interviews, and recorded online conversations Stallman had left lying around the Internet and do an unauthorized biography. + +During my research, I came across an essay titled "Freedom-Or Copyright?" Written by Stallman and published in the June, 2000, edition of the MIT Technology Review, the essay blasted e-books for an assortment of software sins. Not only did readers have to use proprietary software programs to read them, Stallman lamented, but the methods used to prevent unauthorized copying were overly harsh. Instead of downloading a transferable HTML or PDF file, readers downloaded an encrypted file. In essence, purchasing an e-book meant purchasing a nontransferable key to unscramble the encrypted content. Any attempt to open a book's content without an authorized key constituted a criminal violation of the Digital Millennium Copyright Act, the 1998 law designed to bolster copyright enforcement on the Internet. Similar penalties held for readers who converted a book's content into an open file format, even if their only intention was to read the book on a different computer in their home. Unlike a normal book, the reader no longer held the right to lend, copy, or resell an e-book. They only had the right to read it on an authorized machine, warned Stallman: + + We still have the same old freedoms in using paper books. But if e-books replace printed books, that exception will do little good. With "electronic ink," which makes it possible to download new text onto an apparently printed piece of paper, even newspapers could become ephemeral. Imagine: no more used book stores; no more lending a book to your friend; no more borrowing one from the public library-no more "leaks" that might give someone a chance to read without paying. (And judging from the ads for Microsoft Reader, no more anonymous purchasing of books either.) This is the world publishers have in mind for us.1 + +Needless to say, the essay caused some concern. Neither Tracy nor I had discussed the software her company would use nor had we discussed the type of copyright that would govern the e-book's usage. I mentioned the Technology Review article and asked if she could give me information on her company's e-book policies. Tracy promised to get back to me. + +Eager to get started, I decided to call Stallman anyway and mention the book idea to him. When I did, he expressed immediate interest and immediate concern. "Did you read my essay on e-books?" he asked. + +When I told him, yes, I had read the essay and was waiting to hear back from the publisher, Stallman laid out two conditions: he didn't want to lend support to an e-book licensing mechanism he fundamentally opposed, and he didn't want to come off as lending support. "I don't want to participate in anything that makes me look like a hypocrite," he said. + +For Stallman, the software issue was secondary to the copyright issue. He said he was willing to ignore whatever software the publisher or its third-party vendors employed just so long as the company specified within the copyright that readers were free to make and distribute verbatim copies of the e-book's content. Stallman pointed to Stephen King's The Plant as a possible model. In June, 2000, King announced on his official web site that he was self-publishing The Plant in serial form. According to the announcement, the book's total cost would be $13, spread out over a series of $1 installments. As long as at least 75% of the readers paid for each chapter, King promised to continue releasing new installments. By August, the plan seemed to be working, as King had published the first two chapters with a third on the way. + +"I'd be willing to accept something like that," Stallman said. "As long as it also permitted verbatim copying." + +I forwarded the information to Tracy. Feeling confident that she and I might be able to work out an equitable arrangement, I called up Stallman and set up the first interview for the book. Stallman agreed to the interview without making a second inquiry into the status issue. Shortly after the first interview, I raced to set up a second interview (this one in Kihei), squeezing it in before Stallman headed off on a 14-day vacation to Tahiti. + +It was during Stallman's vacation that the bad news came from Tracy. Her company's legal department didn't want to adjust its copyright notice on the e-books. Readers who wanted to make their books transferable would either have to crack the encryption code or convert the book to an open format such as HTML. Either way, the would be breaking the law and facing criminal penalties. + +With two fresh interviews under my belt, I didn't see any way to write the book without resorting to the new material. I quickly set up a trip to New York to meet with my agent and with Tracy to see if there was a compromise solution. + +When I flew to New York, I met my agent, Henning Guttman. It was our first face-to-face meeting, and Henning seemed pessimistic about our chances of forcing a compromise, at least on the publisher's end. The large, established publishing houses already viewed the e-book format with enough suspicion and weren't in the mood to experiment with copyright language that made it easier for readers to avoid payment. As an agent who specialized in technology books, however, Henning was intrigued by the novel nature of my predicament. I told him about the two interviews I'd already gathered and the promise not to publish the book in a way that made Stallman "look like a hypocrite." Agreeing that I was in an ethical bind, Henning suggested we make that our negotiating point. + +Barring that, Henning said, we could always take the carrot-and-stick approach. The carrot would be the publicity that came with publishing an e-book that honored the hacker community's internal ethics. The stick would be the risks associated with publishing an e-book that didn't. Nine months before Dmitri Skylarov became an Internet cause cČlËbre, we knew it was only a matter of time before an enterprising programmer revealed how to hack e-books. We also knew that a major publishing house releasing an encryption-protected e-book on Richard M. Stallman was the software equivalent of putting "Steal This E-Book" on the cover. + +After my meeting with Henning, I put a call into Stallman. Hoping to make the carrot more enticing, I discussed a number of potential compromises. What if the publisher released the book's content under a split license, something similar to what Sun Microsystems had done with Open Office, the free software desktop applications suite? The publisher could then release commercial versions of the e-book under a normal format, taking advantage of all the bells and whistles that went with the e-book software, while releasing the copyable version under a less aesthetically pleasing HTML format. + +Stallman told me he didn't mind the split-license idea, but he did dislike the idea of making the freely copyable version inferior to the restricted version. Besides, he said, the idea was too cumbersome. Split licenses worked in the case of Sun's Open Office only because he had no control over the decision making. In this case, Stallman said, he did have a way to control the outcome. He could refuse to cooperate. + +I made a few more suggestions with little effect. About the only thing I could get out of Stallman was a concession that the e-book's copyright restrict all forms of file sharing to "noncommercial redistribution." + +Before I signed off, Stallman suggested I tell the publisher that I'd promised Stallman that the work would be free. I told Stallman I couldn't agree to that statement but that I did view the book as unfinishable without his cooperation. Seemingly satisfied, Stallman hung up with his usual sign-off line: "Happy hacking." + +Henning and I met with Tracy the next day. Tracy said her company was willing to publish copyable excerpts in a unencrypted format but would limit the excerpts to 500 words. Henning informed her that this wouldn't be enough for me to get around my ethical obligation to Stallman. Tracy mentioned her own company's contractual obligation to online vendors such as Amazon.com. Even if the company decided to open up its e-book content this one time, it faced the risk of its partners calling it a breach of contract. Barring a change of heart in the executive suite or on the part of Stallman, the decision was up to me. I could use the interviews and go against my earlier agreement with Stallman, or I could plead journalistic ethics and back out of the verbal agreement to do the book. + +Following the meeting, my agent and I relocated to a pub on Third Ave. I used his cell phone to call Stallman, leaving a message when nobody answered. Henning left for a moment, giving me time to collect my thoughts. When he returned, he was holding up the cell phone. + +"It's Stallman," Henning said. + +The conversation got off badly from the start. I relayed Tracy's comment about the publisher's contractual obligations. + +"So," Stallman said bluntly. "Why should I give a damn about their contractual obligations?" + +Because asking a major publishing house to risk a legal battle with its vendors over a 30,000 word e-book is a tall order, I suggested. + +"Don't you see?" Stallman said. "That's exactly why I'm doing this. I want a signal victory. I want them to make a choice between freedom and business as usual." + +As the words "signal victory" echoed in my head, I felt my attention wander momentarily to the passing foot traffic on the sidewalk. Coming into the bar, I had been pleased to notice that the location was less than half a block away from the street corner memorialized in the 1976 Ramones song, "53rd and 3rd," a song I always enjoyed playing in my days as a musician. Like the perpetually frustrated street hustler depicted in that song, I could feel things falling apart as quickly as they had come together. The irony was palpable. After weeks of gleefully recording other people's laments, I found myself in the position of trying to pull off the rarest of feats: a Richard Stallman compromise. + +When I continued hemming and hawing, pleading the publisher's position and revealing my growing sympathy for it, Stallman, like an animal smelling blood, attacked. + +"So that's it? You're just going to screw me? You're just going to bend to their will?" + +I brought up the issue of a dual-copyright again. + +"You mean license," Stallman said curtly. + +"Yeah, license. Copyright. Whatever," I said, feeling suddenly like a wounded tuna trailing a rich plume of plasma in the water. + +"Aw, why didn't you just fucking do what I told you to do!" he shouted. + +I must have been arguing on behalf of the publisher to the very end, because in my notes I managed to save a final Stallman chestnut: "I don't care. What they're doing is evil. I can't support evil. Good-bye." + +As soon as I put the phone down, my agent slid a freshly poured Guinness to me. "I figured you might need this," he said with a laugh. "I could see you shaking there towards the end." + +I was indeed shaking. The shaking wouldn't stop until the Guinness was more than halfway gone. It felt weird, hearing myself characterized as an emissary of "evil." It felt weirder still, knowing that three months before, I was sitting in an Oakland apartment trying to come up with my next story idea. Now, I was sitting in a part of the world I'd only known through rock songs, taking meetings with publishing executives and drinking beer with an agent I'd never even laid eyes on until the day before. It was all too surreal, like watching my life reflected back as a movie montage. + +About that time, my internal absurdity meter kicked in. The initial shaking gave way to convulsions of laughter. To my agent, I must have looked like a another fragile author undergoing an untimely emotional breakdown. To me, I was just starting to appreciate the cynical beauty of my situation. Deal or no deal, I already had the makings of a pretty good story. It was only a matter of finding a place to tell it. When my laughing convulsions finally subsided, I held up my drink in a toast. + +"Welcome to the front lines, my friend," I said, clinking pints with my agent. "Might as well enjoy it." + +If this story really were a play, here's where it would take a momentary, romantic interlude. Disheartened by the tense nature of our meeting, Tracy invited Henning and I to go out for drinks with her and some of her coworkers. We left the bar on Third Ave., headed down to the East Village, and caught up with Tracy and her friends. + +Once there, I spoke with Tracy, careful to avoid shop talk. Our conversation was pleasant, relaxed. Before parting, we agreed to meet the next night. Once again, the conversation was pleasant, so pleasant that the Stallman e-book became almost a distant memory. + +When I got back to Oakland, I called around to various journalist friends and acquaintances. I recounted my predicament. Most upbraided me for giving up too much ground to Stallman in the preinterview negotiation. A former j-school professor suggested I ignore Stallman's "hypocrite" comment and just write the story. Reporters who knew of Stallman's media-savviness expressed sympathy but uniformly offered the same response: it's your call. + +I decided to put the book on the back burner. Even with the interviews, I wasn't making much progress. Besides, it gave me a chance to speak with Tracy without running things past Henning first. By Christmas we had traded visits: she flying out to the west coast once, me flying out to New York a second time. The day before New Year's Eve, I proposed. Deciding which coast to live on, I picked New York. By February, I packed up my laptop computer and all my research notes related to the Stallman biography, and we winged our way to JFK Airport. Tracy and I were married on May 11. So much for failed book deals. + +During the summer, I began to contemplate turning my interview notes into a magazine article. Ethically, I felt in the clear doing so, since the original interview terms said nothing about traditional print media. To be honest, I also felt a bit more comfortable writing about Stallman after eight months of radio silence. Since our telephone conversation in September, I'd only received two emails from Stallman. Both chastised me for using "Linux" instead of "GNU/Linux" in a pair of articles for the web magazine Upside Today. Aside from that, I had enjoyed the silence. In June, about a week after the New York University speech, I took a crack at writing a 5,000-word magazine-length story about Stallman. This time, the words flowed. The distance had helped restore my lost sense of emotional perspective, I suppose. + +In July, a full year after the original email from Tracy, I got a call from Henning. He told me that O'Reilly & Associates, a publishing house out of Sebastopol, California, was interested in the running the Stallman story as a biography. The news pleased me. Of all the publishing houses in the world, O'Reilly, the same company that had published Eric Raymond's The Cathedral and the Bazaar, seemed the most sensitive to the issues that had killed the earlier e-book. As a reporter, I had relied heavily on the O'Reilly book Open Sources as a historical reference. I also knew that various chapters of the book, including a chapter written by Stallman, had been published with copyright notices that permitted redistribution. Such knowledge would come in handy if the issue of electronic publication ever came up again. + +Sure enough, the issue did come up. I learned through Henning that O'Reilly intended to publish the biography both as a book and as part of its new Safari Tech Books Online subscription service. The Safari user license would involve special restrictions,1 Henning warned, but O'Reilly was willing to allow for a copyright that permitted users to copy and share and the book's text regardless of medium. Basically, as author, I had the choice between two licenses: the Open Publication License or the GNU Free Documentation License. + +I checked out the contents and background of each license. The Open Publication License (OPL)2 gives readers the right to reproduce and distribute a work, in whole or in part, in any medium "physical or electronic," provided the copied work retains the Open Publication License. It also permits modification of a work, provided certain conditions are met. Finally, the Open Publication License includes a number of options, which, if selected by the author, can limit the creation of "substantively modified" versions or book-form derivatives without prior author approval. + +The GNU Free Documentation License (GFDL),3 meanwhile, permits the copying and distribution of a document in any medium, provided the resulting work carries the same license. It also permits the modification of a document provided certain conditions. Unlike the OPL, however, it does not give authors the option to restrict certain modifications. It also does not give authors the right to reject modifications that might result in a competitive book product. It does require certain forms of front- and back-cover information if a party other than the copyright holder wishes to publish more than 100 copies of a protected work, however. + +In the course of researching the licenses, I also made sure to visit the GNU Project web page titled "Various Licenses and Comments About Them."4 On that page, I found a Stallman critique of the Open Publication License. Stallman's critique related to the creation of modified works and the ability of an author to select either one of the OPL's options to restrict modification. If an author didn't want to select either option, it was better to use the GFDL instead, Stallman noted, since it minimized the risk of the nonselected options popping up in modified versions of a document. + +The importance of modification in both licenses was a reflection of their original purpose-namely, to give software-manual owners a chance to improve their manuals and publicize those improvements to the rest of the community. Since my book wasn't a manual, I had little concern about the modification clause in either license. My only concern was giving users the freedom to exchange copies of the book or make copies of the content, the same freedom they would have enjoyed if they purchased a hardcover book. Deeming either license suitable for this purpose, I signed the O'Reilly contract when it came to me. + +Still, the notion of unrestricted modification intrigued me. In my early negotiations with Tracy, I had pitched the merits of a GPL-style license for the e-book's content. At worst, I said, the license would guarantee a lot of positive publicity for the e-book. At best, it would encourage readers to participate in the book-writing process. As an author, I was willing to let other people amend my work just so long as my name always got top billing. Besides, it might even be interesting to watch the book evolve. I pictured later editions looking much like online versions of the Talmud, my original text in a central column surrounded by illuminating, third-party commentary in the margins. + +My idea drew inspiration from Project Xanadu (http://www.xanadu.com/), the legendary software concept originally conceived by Ted Nelson in 1960. During the O'Reilly Open Source Conference in 1999, I had seen the first demonstration of the project's open source offshoot Udanax and had been wowed by the result. In one demonstration sequence, Udanax displayed a parent document and a derivative work in a similar two-column, plain-text format. With a click of the button, the program introduced lines linking each sentence in the parent to its conceptual offshoot in the derivative. An e-book biography of Richard M. Stallman didn't have to be Udanax-enabled, but given such technological possibilities, why not give users a chance to play around?5 + +When Laurie Petrycki, my editor at O'Reilly, gave me a choice between the OPL or the GFDL, I indulged the fantasy once again. By September of 2001, the month I signed the contract, e-books had become almost a dead topic. Many publishing houses, Tracy's included, were shutting down their e-book imprints for lack of interest. I had to wonder. If these companies had treated e-books not as a form of publication but as a form of community building, would those imprints have survived? + +After I signed the contract, I notified Stallman that the book project was back on. I mentioned the choice O'Reilly was giving me between the Open Publication License and the GNU Free Documentation License. I told him I was leaning toward the OPL, if only for the fact I saw no reason to give O'Reilly's competitors a chance to print the same book under a different cover. Stallman wrote back, arguing in favor of the GFDL, noting that O'Reilly had already used it several times in the past. Despite the events of the past year, I suggested a deal. I would choose the GFDL if it gave me the possibility to do more interviews and if Stallman agreed to help O'Reilly publicize the book. Stallman agreed to participate in more interviews but said that his participation in publicity-related events would depend on the content of the book. Viewing this as only fair, I set up an interview for December 17, 2001 in Cambridge. + +I set up the interview to coincide with a business trip my wife Tracy was taking to Boston. Two days before leaving, Tracy suggested I invite Stallman out to dinner. + +"After all," she said, "he is the one who brought us together." + +I sent an email to Stallman, who promptly sent a return email accepting the offer. When I drove up to Boston the next day, I met Tracy at her hotel and hopped the T to head over to MIT. When we got to Tech Square, I found Stallman in the middle of a conversation just as we knocked on the door. + +"I hope you don't mind," he said, pulling the door open far enough so that Tracy and I could just barely hear Stallman's conversational counterpart. It was a youngish woman, mid-20s I'd say, named Sarah. + +"I took the liberty of inviting somebody else to have dinner with us," Stallman said, matter-of-factly, giving me the same cat-like smile he gave me back in that Palo Alto restaurant. + +To be honest, I wasn't too surprised. The news that Stallman had a new female friend had reached me a few weeks before, courtesy of Stallman's mother. "In fact, they both went to Japan last month when Richard went over to accept the Takeda Award," Lippman told me at the time.6 + +On the way over to the restaurant, I learned the circumstances of Sarah and Richard's first meeting. Interestingly, the circumstances were very familiar. Working on her own fictional book, Sarah said she heard about Stallman and what an interesting character he was. She promptly decided to create a character in her book on Stallman and, in the interests of researching the character, set up an interview with Stallman. Things quickly went from there. The two had been dating since the beginning of 2001, she said. + +"I really admired the way Richard built up an entire political movement to address an issue of profound personal concern," Sarah said, explaining her attraction to Stallman. + +My wife immediately threw back the question: "What was the issue?" + +"Crushing loneliness." + +During dinner, I let the women do the talking and spent most of the time trying to detect clues as to whether the last 12 months had softened Stallman in any significant way. I didn't see anything to suggest they had. Although more flirtatious than I remembered-a flirtatiousness spoiled somewhat by the number of times Stallman's eyes seemed to fixate on my wife's chest-Stallman retained the same general level of prickliness. At one point, my wife uttered an emphatic "God forbid" only to receive a typical Stallman rebuke. + +"I hate to break it to you, but there is no God," Stallman said. + +Afterwards, when the dinner was complete and Sarah had departed, Stallman seemed to let his guard down a little. As we walked to a nearby bookstore, he admitted that the last 12 months had dramatically changed his outlook on life. "I thought I was going to be alone forever," he said. "I'm glad I was wrong." + +Before parting, Stallman handed me his "pleasure card," a business card listing Stallman's address, phone number, and favorite pastimes ("sharing good books, good food and exotic music and dance") so that I might set up a final interview. + + +Stallman's "pleasure" card, handed to me the night of our dinner. + +The next day, over another meal of dim sum, Stallman seemed even more lovestruck than the night before. Recalling his debates with Currier House dorm maters over the benefits and drawbacks of an immortality serum, Stallman expressed hope that scientists might some day come up with the key to immortality. "Now that I'm finally starting to have happiness in my life, I want to have more," he said. + +When I mentioned Sarah's "crushing loneliness" comment, Stallman failed to see a connection between loneliness on a physical or spiritual level and loneliness on a hacker level. "The impulse to share code is about friendship but friendship at a much lower level," he said. Later, however, when the subject came up again, Stallman did admit that loneliness, or the fear of perpetual loneliness, had played a major role in fueling his determination during the earliest days of the GNU Project. + +"My fascination with computers was not a consequence of anything else," he said. "I wouldn't have been less fascinated with computers if I had been popular and all the women flocked to me. However, it's certainly true the experience of feeling I didn't have a home, finding one and losing it, finding another and having it destroyed, affected me deeply. The one I lost was the dorm. The one that was destroyed was the AI Lab. The precariousness of not having any kind of home or community was very powerful. It made me want to fight to get it back." + +After the interview, I couldn't help but feel a certain sense of emotional symmetry. Hearing Sarah describe what attracted her to Stallman and hearing Stallman himself describe the emotions that prompted him to take up the free software cause, I was reminded of my own reasons for writing this book. Since July, 2000, I have learned to appreciate both the seductive and the repellent sides of the Richard Stallman persona. Like Eben Moglen before me, I feel that dismissing that persona as epiphenomenal or distracting in relation to the overall free software movement would be a grievous mistake. In many ways the two are so mutually defining as to be indistinguishable. + +While I'm sure not every reader feels the same level of affinity for Stallman-indeed, after reading this book, some might feel zero affinity-I'm sure most will agree. Few individuals offer as singular a human portrait as Richard M. Stallman. It is my sincere hope that, with this initial portrait complete and with the help of the GFDL, others will feel a similar urge to add their own perspective to that portrait. diff --git a/examples/txt/.svn/text-base/stallman-pl.txt.svn-base b/examples/txt/.svn/text-base/stallman-pl.txt.svn-base new file mode 100755 index 0000000..23949b2 --- /dev/null +++ b/examples/txt/.svn/text-base/stallman-pl.txt.svn-base @@ -0,0 +1,1847 @@ + Podziękowania + + Specjalne podziękowania należą się Henningowi Gutmannowi za zainspirowanie mnie do napisania tej książki. Dziękuję także Baronowi Oasowi za uprzednie zasugerowanie tego pomysłu Tracy. Dziękuję Laurie Petrycki, Jeffreyowi Holcombowi i pozostałym osobom z O'Reilly & Associates, a szczególnie Timowi O'Reilly za poparcie udzielone tej książce. Wyrazy uznania należą się grupie osób spraw-dzających tekst, a byli to: Bruce Perens, Eric Raymond, Eric Allman, Jon Orwant, Julie i Gerard Jay Sussman, Hal Abelson oraz Guy Steele. Mam nadzieję, że obecna wolna od błędów wersja dała Wam wiele radości. Dziękuję również Alice Lippman za wywiady, ciasteczka i fotografie. Wreszcie moja rodzina: Steve, Jane, Tish i Dave - im składam równie gorące podziękowania. Na koniec wyrażam wdzięczność Richardowi Stallmanowi za to, że nie zabrakło mu serca ani cierpliwości, gdy "pokazywał mi kod". + + - Sam Williams + + +Wstęp +Działalność Richarda M. Stallmana mówi sama za siebie: od udokumentowanych kodów źródłowych, przez liczne publikacje, po zarejestrowane rozmowy i wywiady. Niewiele jest osób, które tyle wysiłku wkładają w przekazanie innym swoich myśli i przekonań. + +Taka otwartość - użyjmy na chwilę tego niestallmanowskiego określenia - jest niecodzienna. Żyjemy przecież w społeczeństwie, które traktuje informację, a zwłaszcza informację osobistą, jako towar. Zatem rodzi się pytanie, dlaczego istnieje ktoś, kto chce dzielić się z innymi taką masą informacji, nie żądając nic w zamian. + +Jak przekonamy się w kolejnych rozdziałach, poczynania Stallmana nie są w pełni altruistyczne. Każdy program, przemówienie i zapisany bon mot ma przypisaną cenę, która jednak nie określa płatności w znaczeniu, do jakiego ludzie przywykli. + +Nie jest to ostrzeżenie lecz zwykłe stwierdzenie faktu. Jako ktoś, kto spędził ostatni rok na wygrzebywaniu faktów z życia Stallmana, mogę się obawiać wystąpienia z krytyką jego dorobku. "Nigdy nie podejmuj walki z kimś, kto kupuje atrament beczkami" - mawiał Mark Twain. Trudno się pokusić o napisanie wyczerpującej biografii kogoś takiego jak Stallman, który każdą swą myśl podaje do publicznej wiadomości. + +Czytelników, którzy zdecydują się poświęcić kilka godzin na przewertowanie tej książki, zapewniam, że znajdą tu fakty i cytaty, których nie da się odszukać na stronach internetowych za pomocą Google lub innej wyszukiwarki. Ale dostęp do tych informacji kosztuje. Kupując książkę, płacicie zań w tradycyjny sposób, zaś w przypadku wersji elektronicznej opłata jest pobierana jak za wolne oprogramowanie1. Dzięki wydawnictwu O'Reilly & Associates książka ta jest rozprowadzana na zasadzie Licencji Wolnej Dokumentacji GNU2, co oznacza, że każdy może jej tekst poprawiać, tworzyć własną wersję i upowszechniać na zasadzie tej samej licencji. + +Jeżeli czytacie wersję elektroniczną i wybieracie drugi rodzaj płatności, tzn. chcecie przyczynić się do poprawienia treści ku pożytkowi następnych czytelników, czekam na Wasze teksty. Wersję w formacie html publikuję od czerwca 2002 r. pod adresem internetowym http://www.faifzilla.org/. Celem jest regularne uaktualnianie i rozszerzanie tekstu Free as In Freedom. Jeżeli zamierzacie wziąć udział w tym przedsięwzięciu, czyli wybieracie drugą formę płatności, przeczytajcie dodatek C, gdzie zostały podane Wasze prawa wynikające z Licencji Wolnej Dokumentacji GNU. + +I jeszcze uwaga końcowa: książka, którą trzymacie w ręku, to robota dziennikarska lecz również dokumentalna. Podczas jej pisanie i przygotowywania do druku korzystałem z licznych uwag i komentarzy wielu uczestników opisywanych wydarzeń, łącznie z samym Richardem Stallmanem. Uświadomiliśmy sobie wówczas, że w tekście zostało zawarte wiele informacji technicznych, których dokładniejsze lub lepsze wyjaśnienie bardzo ułatwiłoby lekturę. Ponieważ książka została wydana na zasadach Licencji Wolnej Dokumentacji GNU, akceptujemy wszelkie poprawki, tak jakbyśmy robili w przypadku opublikowania wolnego oprogramowania. Zaakceptowane zmiany zostaną włączone do wersji elektroniczne oraz, być może, także do przyszłej wersji drukowanej. Jeżeli chcecie się przyczynić do podniesienia jakości i wartości tej książki, możecie przesłać mi informację na adres sam@inow.com.. + + +Rozdział 1. +Gdy potrzebna drukarka + +Obawiam się Greków, nawet gdy przynoszą dary +- Wergiliusz +Eneida + +Nowa drukarka znowu się zacięła. + +Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + +Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + +Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + +Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. Urządzenie było darem Xerox Corporation. Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + +Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. Natychmiast osiągnięto zadawalające rezultaty. Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + +Był to ze pod każdym względem dar, który należało docenić. + +Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. W ich założeniach czujna obecność użytkownika było częścią systemu. + +Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + +Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + +Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + +"Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + +Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + +Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + +Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + +Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. Jednakże jako haker miał do dyspozycji inne źródła informacji. Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + +Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + +Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + +W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + +"Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + +Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + +Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + +Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. Był to zwiastun HTML-a, lingua franca Word Wide Web. W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + +Dla Reida była to procedura doskonała. Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. Natomiast dla Stallmana była to oczywista zdrada etosu programisty. Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + +Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + +Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + +Nie musiał długo czekać. W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + +Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + +"Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + +Pamięć jest ciekawą rzeczą. Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + +"Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. - "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + +Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + +Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + +Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + +Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. Na początku uznał odmowę za skierowaną przeciwko sobie. Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. Być może nawet trzasnąłem drzwiami. Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + +Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + +"Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + +Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + +Teraz nowa drukarka stała się oznaką zmian, które nastały. Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. Z punktu widzenia Stallmana drukarka była koniem trojańskim. W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. Pojawiło się w postaci daru. + +Stallman musiał przełknąć dwie gorzkie pigułki. Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + +"Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + +Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. Dla Stallmana był to początek staczania się po równi pochyłej. + +"Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + +Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + +"Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + +Rozdział 2. +2001: Odyseja hakerska + +Wydział nauk komputerowych New York University (NYU)1 znajduje się w Warren Weaver Hall, przypominającym fortecę gmaszysku oddalonym o dwa kwartały ulic na wschód od Washington Square Park. Wyloty instalacji klimatyzacyjnych dużej mocy tworzą wokół niego wał gorącego powietrza zniechęcający w równej mierze łazików, jak i radców prawnych. Przełamawszy barierę gorącego powietrza, odwiedzający trafiają na następną, równie nieprzyjemną - kontrolę straży pilnującej jedynego wejścia. + +Za punktem kontrolnym atmosfera łagodnieje. Nadal jednak liczne znaki rozsiane na pierwszym piętrze przypominają o zagrożeniu ze strony niezabezpieczonych drzwi i niezaplombowanych wyjść awaryjnych. Nawet w niezmąconej atmosferze Nowego Jorku sprzed 11 września 2001 roku wszystko to uświadamiało, że nikt nie jest zbyt bezpieczny lub zbyt podejrzliwy. + +Znaki te stanowiły tematyczny kontrapunkt dla gęstniejącego tłumu gości zbierających się w wewnętrznym atrium. Nieliczni wyglądali na studentów NYU. Większość przypominała raczej rozchełstanych fanów muzyki współczesnej tłoczących się przed salą koncertową w oczekiwaniu na główny punkt programu. Na jedno krótkie przedpołudnie masy te zawładnęły Warren Weaver Hall, ograniczając zadania pilnującej bezpieczeństwa portierki do oglądania telewizji i wskazywania ruchem ramienia audytorium, w którym odbywa się "przemówienie". + +Wewnątrz audytorium przybywający mogli zobaczyć osobę, która spowodowała czasowe zawieszenie zwykłych procedur bezpieczeństwa. Był to Richard M. Stallman, twórca projektu GNU, prezes Fundacji Wolnego Oprogramowania2, zdobywca MacArthur Fellowship3 w 1990, Association of Computing Machinery's Grace Murray Hopper Award4 (także w roku 1990), współzdobywca Takeda Award5 za rok 2001 i były haker z AI Lab. Zapowiedziany jako gospodarz "okołohakerskich" stron internetowych, w tym http://www.gnu.org, Stallman zjawił się na Manhattanie, gdzie się urodził, by wygłosić przemówienie o łatwej do przewidzenia treści, w którym wystąpił przeciwko prowadzonej przez Microsoft kampanii zwalczania projektu Powszechnej Licencji Publicznej GNU6. + +Tematem wykładu Stallmana była historia i przyszłość ruchu wolnego oprogramowania. Istotne jest miejsce jego wygłoszenia. Mniej niż miesiąc wcześniej w należącej również do NYU, położonej nieopodal Stern School of Business przemawiał Craig Mundie, jeden z prezesów Microsoft Corporation, grzmiąc i odsądzając od czci i wiary Powszechną Licencję Publiczną GNU wymyśloną przed Stallmana przed 16 laty, po perypetiach z drukarką laserową Xeroxa w r. 1980. Stworzona w celu przeciwdziałania narastającej fali utajniania oprogramowania, GPL ewoluowała, by stać się głównym narzędziem społeczności zwolenników wolnego oprogramowania. Mówiąc prościej, GPL nadaje programom komputerowym status własności społecznej lub, jak kto woli, powszechnej z zachowaniem legalności praw autorskich ((c) copyright). Nadanie tych praw jest nieusuwalne. Wszystkie wersje pochodne podlegają tej samej zasadzie ochrony praw autorskich, nawet te, które zawierają jedynie niewielki wycinek oryginalnego kodu źródłowego. Z tego powodu licencja ta w świecie przemysłu programistycznego została nazwana "wirusową", gdyż zarażała każdy program, którego dotknęła7. + +W biznesie informacyjnym, coraz bardziej zależnym od standardów oprogramowania, do GPL przywarła nazwa straszaka. Nawet firmy, które z początku z lekceważeniem naśmiewały się z niej, traktując ją jako programistyczną odmianę socjalizmu, zaczęły z wolna zmieniać zdanie i zauważać niesione przez nią korzyści. Linux - uniksopodobne jądro systemu stworzone przez fińskiego studenta Linusa Torvaldsa w roku 1991 - jest rozpowszechniany z licencją GPL, tak samo jak wiele powszechnie w świecie stosowanych narzędzi: GNU Emacs, GNU Debugger, GNU C Compiler itd. Razem narzędzia te tworzą wolny system operacyjny zbudowany przez hakerów i będący własnością ich światowej społeczności. Zamiast uważać tę społeczność za groźbę firmy najnowszej technologii, jak IBM, Hewlett Packard i Sun Microsystems, zaczęły polegać na jej osiągnięciach i sprzedawać aplikacje i usługi, korzystając ze wciąż rosnących zasobów wolnego oprogramowania. + +Jako broń strategiczną wykorzystują również wieczną wojnę społeczności hakerskiej z Microsoft Corporation, firmą programistyczną z Redmond w stanie Washington, która w latach osiemdziesiątych zdominowała rynek oprogramowania komputerów PC. Jako właściciel popularnego systemu operacyjnego Windows, Microsoft ma najwięcej do stracenia w przypadku przesuwania się światowego przemysłu w stronę oprogramowania z licencją GPL. Niemal każda linia kodu źródłowego Windows jest chroniona prawami autorskimi potwierdzającymi prywatną naturę własności lub przynajmniej prywatne prawa Microsoftu do korzystania z tego oprogramowania. Z punktu widzenia Microsoftu włączanie do Windows programów na licencji GNU byłoby podobne do zażywania tabletek poronnych zmniejszających populację własnych programów i klientów. Konkurencyjne firmy zdobyłyby nagle prawo kopiowania, modyfikowania i sprzedawania poprawionych wersji Windows, podkopując pozycję Microsoftu jako firmy numer 1 na rynku oprogramowania, dostarczającej wciąż nowe wersje pełnego luk i błędów systemu. Zatem wiele firm z coraz większym zainteresowaniem zaczęło się zastanawiać nad możliwością "adopcji" oprogramowania GPL. Z tego powodu Mundie w swoim przemówieniu wyklinał oprogramowanie z "ogólnie dostępnymi kodami źródłowymi", jego rozwój i rosnącą sprzedaż. Dlatego Stallman postanowił publicznie odpowiedzieć na te zarzuty w tym samym campusie uniwersyteckim. + +20 lat to dla przemysłu programistycznego bardzo długi okres. W roku 1980, gdy Stallman w AI Lab miał kłopoty z drukarką laserową Xeroxa, Microsoft, postrzegany obecnie przez hakerów jako główne zagrożenie, dopiero raczkował jako niewielka prywatna firma. IBM, wówczas najpotężniejsza firma przemysłu komputerowego na świecie, wprowadził właśnie na rynek swój pierwszy komputer osobisty, dając początek tworzeniu rynku taniego sprzętu komputerowego. Wiele technologii, których istnienie przyjmujemy teraz za rzecz oczywistą: Word Wide Web, telewizja satelitarna, 32-bitowe konsole gier wideo, w ogóle wówczas nie istniało. To samo dotyczy wielu firm znajdujących się obecnie w czołówce establishmentu, jak np. AOL, Sun Microsystems, Amazon.com i Dell. To wyliczanie można długo kontynuować. + +Fakt, że rynek wysokich technologii rozwinął się tak bardzo w tak krótkim czasie, przyczynił się do wzmocnienia obu stron biorących udział w debacie na temat GPL. Zwolennicy GPL wskazują na krótki żywot większości typów sprzętu komputerowego. Obawiając się ryzyka kupienia przestarzałego produktu, konsumenci biegną do firm, które od lat potrafią się utrzymać na rynku. Z tego powodu rynek oprogramowania stał się areną, na której słabsi są dobijani, a zwycięzcy biorą wszystko8. Zwolennicy GPL twierdzą, że rozpowszechnianie oprogramowania z zastrzeżonymi prawami własności prowadzi do monopolu i stagnacji. Silniejsze firmy zużywają całe zapasy życiodajnego tlenu i mniejsze, innowacyjne firmy nie mogą na rynku nawet odetchnąć. + +Oponenci GPL argumentują, że jest wprost przeciwnie. Sprzedaż oprogramowania jest tak samo lub nawet bardziej ryzykowna niż jego kupowanie. Bez legalnych gwarancji przypisanych do prywatnych licencji, nie wspominając już o ekonomicznych perspektywach tzw. killer app (tzn. przełomowych technologii pobudzających do życia nowe rynki)9, firmy tracą zainteresowanie udziałem w tych przedsięwzięciach. Powoduje to stagnację na rynku i zanikanie innowacji. W przemówieniu wygłoszonym 3 maja w tym samym campusie Mundie twierdził, że "wirusowa" natura GPL "stanowi zagrożenie" dla wszystkich firm, których konkurencyjność zależy od unikalności ich oprogramowania. Mówił: + + Podkopuje to fundamenty działalności niezależnego sektora komercyjnego przemysłu programistycznego, gdyż efektywnie uniemożliwia sprzedaż oprogramowania, gdy klienci są zmuszeni do płacenia za produkt, a nie tylko za jego dystrybucję10. + +Znaczny sukces GNU/Linux - systemu operacyjnego będącego połączeniem elementów skupionych wokół jądra chronionego licencją GPL - oraz osiągnięcia Windows w ciągu ostatnich 10 lat wskazują na znaczenie i perspektywy obu typów licencjonowania. Tak czy inaczej walka bieżąca jest wciąż ważnym elementem działania przemysłu oprogramowania. Nawet najwięksi dostawcy, jak Microsoft, korzystają ze wsparcia firm trzecich, których narzędzia, aplikacje i gry wspierają i uatrakcyjniają główne platformy systemowe, np. Windows. Opowiadając o gwałtownej ewolucji rynku technologii w ciągu ostatnich 20 lat, nawet bez brania pod uwagę osiągnięć jego własnej firmy, Mundie przestrzegał słuchaczy, by nie dali się uwieść owczemu pędowi do stosowania wolnego oprogramowania: + + Dwie dekady doświadczenia wskazują, że model ekonomiczny, w którym własność intelektualna podlega ochronie prawnej, zapewnia zwrot kosztów badań i prac rozwojowych oraz przynosi korzyści ekonomiczne, które stają się udziałem szerokich rzesz odbiorców. + +Te ostrzeżenia posłużyły Stallmanowi za punkt wyjścia dzisiejszego przemówienia. Mniej niż miesiąc po ich sformułowaniu rozdrażniony i gotów do rozpoczęcia ataku stanął na podium sali wykładowej. + +Dwie ostatnie dekady przyniosły dramatyczne zmiany rynku oprogramowania, a pewnie jeszcze silniej zmieniły samego Stallmana. Zniknął chuderlawy, gładko wygolony haker spędzający całe dnie w towarzystwie ukochanego PDP-10. Zamiast niego przed słuchaczami pojawił się mężczyzna w średnim wieku, o przeciętnej tuszy, z długą rabiniczną brodą; człowiek spędzający większość czasu na pisaniu e-maili i odpowiadaniu na nie, zwracający się do kolegów programistów i wygłaszający przemówienia takie jak dzisiejsze. Ubrany w kolorowy T-shirt i poliestrowe brązowe spodnie, wyglądał jak pustynny eremita, który właśnie opuścił siedzibę Armii Zbawienia. + +Tłum słuchaczy wyglądał podobnie. Wiele osób przyszło z laptopami i modemami komórkowymi, aby usłyszane słowa zapisywać i przekazywać na użytek społeczności internetowej. Na jedną kobietę przypadało piętnastu mężczyzn, a jedna na siedem lub osiem kobiet przyszła z wypchanym pingwinem, oficjalną linuksową maskotką, lub z wypchanym niedźwiadkiem "teddy bear11". + +Podniecony Stallman opuścił miejsce na mównicy i zasiadłszy w pierwszym rzędzie, zaczął wystukiwać polecenia na klawiaturze przygotowanego laptopa. Robił to przez następnych 10 minut niepomny obecności wzrastającej liczby krążących wokół niego studentów, profesorów i fanów. + +Przed rozpoczęciem wykładu musiała zostać dopełniona akademicka celebra. Ukazanie się Stallmana poprzedziły dwie, zamiast zwyczajowej jednej, zapowiedzi. Pierwszy wystąpił Mike Uretsky, jeden z dyrektorów Stern School's Center for Advanced Technology12. + + +Richard Stallman około roku 2000. "Zdecydowałem, że stworzę wolny system operacyjny lub polegnę próbując... oczywiście dożywszy słusznego wieku". Zdjęcie dzięki uprzejmości: http://www.stallman.org. + +Stwierdził, że "zadaniem uniwersytetu jest popieranie debat i podtrzymywanie interesujących dyskusji. To szczególne seminarium spełnia doskonale ten cel. Dyskusja na temat oprogramowania z otwartym kodem źródłowym jest bardzo interesująca." + +Zanim przeszedł do następnego zdania, Stallman zerwał się na równe nogi i zamachał rękami jak autostopowicz usiłujący zatrzymać samochód. + +"Ja robię wolne oprogramowanie" - rzekł wzbudzając wybuch śmiechu. - "Otwarty kod źródłowy to co innego". + +Śmiech przerodził się w aplauz. Sala była wypełniona zwolennikami Stallmana znającymi jego reputację człowieka zwracającego uwagę na ścisłe wysławianie się. Pamiętali też o jego publikacji z roku 1998, w której odżegnał się od propozycji zwolenników ruchu otwartego kodu źródłowego. Większość oczekiwała podobnych wybuchów, tak jak fani Jacka Benny'ego oczekują na jego słynną frazę "Nie wycinaj tego" wygłaszaną w czasie popularnych audycji radiowych. + +Uretsky szybko skończył swoją przedmowę, ustępując miejsca Edmundowi Schonbergowi, profesorowi wydziału nauk komputerowych NYU. Jako programista i uczestnik projektu GNU Schonberg wiedział, jak omijać lingwistyczne "miny". Składnie podsumował karierę Stallmana jako współczesnego programisty. + +"Richard jest doskonałym przykładem kogoś, kto przeszedł od działania lokalnego do myślenia o globalnym problemie dostępności kodów źródłowych." - mówił Schonberg. "Stworzył zgodną wewnętrznie filozofię, która zmusiła nas do ponownego przemyślenia problemów dotyczących produkcji oprogramowania, znaczenia własności intelektualnej i tego, co obecnie reprezentuje społeczność programistów." + +Gorąco powitał Stallmana, który po chwili potrzebnej do zamknięcia laptopa powstał z krzesła i wszedł na podium. + +Początek tego wystąpienia bardziej przypominał komedię Catskills13 niż przemówienie polityczne. "Chciałbym podziękować firmie Microsoft za danie mi okazji do dzisiejszego wystąpienia" - rozpoczął od dowcipu Stallman. "Przez kilka ostatnich tygodni czułem się jak autor książki przypadkowo zakazanej". + +Dla niewtajemniczonych wygłosił krótką, choć konkretną, gorącą pochwałę wolnego oprogramowania. Porównał program komputerowy do kucharskiej recepty. W obu przypadkach mamy do czynienia z dokładnym przepisem, który krok po kroku prowadzi nas aż do wykonania całego zadania, ale pozwala na dokonanie pożądanych modyfikacji - jeżeli mamy na to ochotę lub okoliczności tego wymagają. "Nikt was nie zmusza do dokładnego przestrzegania receptury. Możecie coś opuścić lub coś dodać. Jeżeli lubicie grzyby, możecie włożyć więcej grzybów, a jeżeli nie lubicie soli lub lekarz zabronił wam jej używać, możecie dać jej mniej niż w przepisie." + +Twierdził, że najważniejsze, by programy komputerowe, tak jak przepisy kucharskie, były ogólnodostępne. Dając gościowi przepis, kucharz traci niewiele ponad czas i papier potrzebny do jego zapisania. W przypadku programów komputerowych wysiłek jest jeszcze mniejszy; zwykle wystarcza kilka kliknięć myszą i nieco elektryczności. W obu przypadkach osoba dająca informacje korzysta podwójnie: wzmacnia przyjaźń i zwiększa prawdopodobieństwo uzyskania w rewanżu innych przepisów/programów. + +"Wyobraźcie sobie, co by się działo, gdyby przepisy kucharskie zapakować w szczelne czarne pudełka" - pytał Stallman, podnosząc głos. - "Nie wiedzielibyście, jakie składniki zostały użyte, więc nie wiedzielibyście również, co możecie zmienić. A gdybyście mimo to jakichś zmian dokonali albo sporządzili kopię dla przyjaciela, bylibyście ścigani jako piraci, a ścigający staraliby się osadzić was w więzieniu na długie lata. Taki świat może się wydawać straszny dla tych, którzy przywykli do dzielenia się z innymi posiadanymi informacjami. Ale właśnie taki jest świat własności prywatnej oprogramowania. Jest to świat, w którym zwykła ludzka przyzwoitość została zakazana". + +Dla uzasadnienia swojego zdania opowiedział epizod z drukarką laserową Xeroxa. Historia ta była chwytem retorycznym równie użytecznym jak porównanie z przepisem kucharskim. Pełniąc funkcję przypowieści, uświadamiała, jak dramatycznie szybkie zmiany następują w świecie oprogramowania. Cofnął słuchaczy myślą do czasów sprzed "jednokliknięciowego" dokonywania zakupów w Amazon.com, czasów bez Windows i bez baz danych Oracle'a, gdy znaki firmowe nie przypominały o prawach własności oprogramowania. + +Opowiedział to wszystko z wprawą i praktyką oskarżyciela publicznego dostarczającego ostatecznych, przygważdżających przeciwnika argumentów. Gdy doszedł do historii z drukarką laserową i odmawiającym mu udostępnienia kodu źródłowego profesorem Carnegie Mellon, zrobił efektowną pauzę. + +"On nas zdradził" - powiedział, - "ale krzywdę uczynił nie tylko nam. Prawdopodobnie uczynił ją każdemu z was". + +Mówiąc "was", skierował palec wskazujący w stronę jednego z nic niepodejrzewających słuchaczy. Brwi wskazanego uniosły się w zdziwieniu, ale wzrok Stallmana już przesunął się dalej. Powoli i z rozwagą wskazał kogoś innego, chichoczącego nerwowo: "I sądzę, że skrzywdził również ciebie" - rzekł do jegomościa w trzecim rzędzie. + +Wskazany przestał chichotać, co widownia przyjęła śmiechem. Gest wyglądał scenicznie i taki był w rzeczywistości. Zawsze, gdy dochodził do końca historii o drukarce laserowej, czynił to z doskonałością showmana. "Wyrządził zło prawdopodobnie każdemu z obecnych tu na sali, za wyjątkiem tych niewielu, którzy w roku 1980 jeszcze się nie narodzili" - mówił dalej, wzbudzając gromki śmiech. "Twierdzę tak, gdyż odmówił współpracy z całą ludzkością, ze wszystkimi mieszkańcami planety Ziemia". + +Poczekał aż komentarz dotrze do świadomości słuchaczy i dodał "Zdradził was, podpisując umowę o nieujawnianiu informacji". + +Przekształcenie Richarda Matthew Stallmana ze sfrustrowanego akademika w politycznego przywódcę przemawiającego już od 20 lat świadczy o jego upartej naturze i wyjątkowej woli oraz jasno określonej wizji i wartościach, które głosi, wytrwale budując ruch wolnego oprogramowania. Dodać do tego należy autorstwo programów najwyższej jakości, które ustaliły jego legendarną reputację programisty. Wielu zwolenników uważa jednak ruch wolnego oprogramowania za jego największe osiągnięcie. + +Co najważniejsze, Stallman działa w świecie o zmiennej naturze potęg politycznych, który jednak coraz bardziej uzależnia się od komputerów i sterujących ich działaniem programów. + +Być może dlatego w czasach, gdy wiele osobistości związanych z najnowszą technologią odchodzi w zapomnienie, jego gwiazda błyszczy coraz silniejszym światłem. Od czasu rozpoczęcia projektu GNU w roku 198414, Stallman był kolejno ignorowany, wyśmiewany, oczerniany i atakowany wewnątrz ruchu wolnego oprogramowania i poza nim. Pomimo to projekt GNU pokonuje na swej drodze kolejne kamienie milowe, aczkolwiek czasem z pewnym opóźnieniem wynikającym z coraz większych wymagań rynku, o wiele bardziej złożonego niż w chwili rozpoczęcia działania przed 18 laty. To samo można powiedzieć o ideologii GNU drobiazgowo dopracowywanej przez samego Stallmana. + +Aby zrozumieć ukryte mechanizmy tego działania, należy dokładnie poznać wypowiedzi zarówno samego Stallmana, jak i ludzi z nim współpracujących oraz tych, którzy go zwalczają. Jego charakter nie jest skomplikowany i pasuje do starego powiedzenia: "koń jaki jest, każdy widzi". + +Eden Moglen, doradca prawny Fundacji Wolnego Oprogramowania i profesor prawa na w Columbia University, twierdzi, że "aby poznać ludzką naturę Stallmana, wystarczy się przyjrzeć poszczególnym jej częściom i złożyć wszystko w całość. Ekscentryczność, którą niektórzy uważają za barierę utrudniającą poznanie go, jest jego właściwą naturą. Prawdziwe są jego silne poczucie frustracji i nadawanie wielkiego znaczenia przestrzeganiu zasad etycznych oraz całkowita niezdolność do kompromisu. Jest to podstawa jego działań i fundament tego, co zbudował". + +Wytłumaczenie drogi, która doprowadziła go od epizodu z drukarką laserową do walki z najbogatszą korporacją świata, nie jest łatwym zadaniem. Wymaga szczegółowego przemyślenia powodów, dla których sprawa własności oprogramowania stała się tak istotna dla współczesnego społeczeństwa. Wymaga także przemyślanej oceny człowieka, który jak wielu przywódców politycznych przed nim zrozumiał podatność ludzkiej świadomości. Wymaga to umiejętności interpretowania mitów i politycznych obciążeń słów kojarzonych z jego osobą. Na koniec, wymaga to zrozumienia geniuszu programistycznego Stallmana oraz wzlotów i upadków na drodze wykorzystania tego geniuszu w innych dziedzinach. + +Poproszony o podsumowanie swojej drogi, Stallman zgadza się, że istotą jest spostrzeżona przez Moglena fuzja osobowości i zasad. "Upór to moja mocna strona" - przyznaje. "Wielu ludzi biorących się za rzeczy trudne zniechęca się i rezygnuje w wyniku piętrzących się trudności. Ja nigdy nie rezygnuję". + +Wierzy także w ślepy traf. Mógł nigdy nie mieć kłopotów z drukarką Xeroxa, mógł nie doznać osobistych i politycznych problemów, które zakończyły jego karierę pracownika MIT, mogło nie mieć miejsca pół tuzina innych zdarzeń, które stały się istotnymi czynnikami w jego życiu. Z łatwością wyobraża sobie swoje życie przebiegające zgoła odmiennie. Jak już powiedzieliśmy, Stallman jest wdzięczny siłom i okolicznościom, które odmieniły jego los. + +"Po prostu mam odpowiednie uzdolnienia i skłonności" - mówi do słuchaczy, podsumowując rozpoczęcie projektu GNU. "Nikt oprócz mnie się tym mnie zajął, więc zapewne byłem przeznaczony do tej roli. Muszę podołać zadaniu. Jeżeli nie ja, to kto?" + + +Rozdział 3. +Portret hakera w wieku młodzieńczym + +Matka Richarda Stallmana, Alice Lippman, pamięta moment, w którym uświadomiła sobie, że jej syn posiada szczególny dar. + + "Myślę, że miał wtedy osiem lat" - wspomina. + +Był rok 1961 i Lippman, świeżo po rozwodzie, chciała spędzić weekend z rodziną w niewielkim jednopokojowym mieszkaniu na manhattańskim Upper West Side. Kartkując Scientific American, dotarła do ulubionego działu, prowadzonej przez Martina Gardnera kolumny autorskiej pod tytułem "Gry matematyczne". Jako pracująca na zastępstwie nauczycielka sztuki lubiła kolumnę Gardnera, gdyż drażniąc trudnymi pytaniami, zmuszała do myślenia. Richard z nosem ukrytym w książce siedział na sąsiedniej sofie, więc postanowiła wziąć się za rozwiązywanie cotygodniowej łamigłówki. + +"Nie byłam w tym najlepsza" - przyznaje, - "ale jako artystka, uważałam, że pomaga mi to w przełamywaniu barier myślowych". + +Przypomina sobie, że wówczas nie wiedziała, jak "ugryźć" łamigłówkę, i gdy już miała zamiar z niesmakiem odrzucić pismo, poczuła delikatne pociągnięcie za rękaw bluzki. + +"To był Richard" - wspomina, - który chciał się dowiedzieć, czy nie potrzebuję pomocy". + +Spoglądając na przemian na łamigłówkę i syna, na początku podeszła sceptycznie do propozycji. "Spytałam go, czy już przeczytał pismo. Potwierdził i dodał, że rozwiązał łamigłówkę, po czym zaczął mi wyjaśniać, jak to zrobił". + +W miarę słuchania wyjaśnień syna jej sceptycyzm szybko przeradzał się w niedowierzanie. "Zawsze wiedziałam, że z niego zdolne dziecko, ale po raz pierwszy uświadomiłam sobie, jak bardzo jest rozwinięty". + +Trzydzieści lat później kwituje to wspomnienie uśmiechem. "Prawdę mówiąc, nie sądzę, abym kiedykolwiek pojęła, jak należało rozwiązać tamtą łamigłówkę. Pamiętam jedynie swoje zdumienie, że on to potrafi". + +Siedząc w jadalni trzypokojowego mieszkania, tego samego, do którego przeniosła się wraz z synem w roku 1967, po ślubie z nieżyjącym już drugim mężem Mauricem Lippmannem, promienieje mieszaniną dumy żydowskiej matki i radości, jaką jej sprawia wspominanie dziecięcych lat syna. Na stojącej opodal komodzie widnieje zdjęcie o wymiarach 8 na 10 cali przedstawiające Stallmana w dostojeństwie długiej brody i togi doktora honoris causa. W jego cieniu pozostają zdjęcia bratanicy i siostrzeńców, ale nim gość zdoła się przyjrzeć, Alice Lippman rozluźnia nastrój dowcipną uwagą. + +"Po otrzymaniu doktoratu University of Glasgow Richard upierał się, abym wzięła to zdjęcie, mówiąc: Wiesz, mamo, to mój pierwszy stopień naukowy"1. + +Takie komentarze ukazują rodzaj humoru, który towarzyszył wzrastaniu cudownego dziecka. Na każdą wzmiankę o uporze i niezwyczajnym zachowaniu syna Alice potrafi opowiedzieć tuzin anegdot. + +"Był bardzo konserwatywny" - opowiada, zacierając ręce żartobliwym gestem. "Najostrzejsze dyskusje odbywały się przy tym stole. Należałam do pierwszej grupy nauczycieli szkół publicznych, którzy założyli związek zawodowy, za co Richard bardzo się na mnie gniewał. Uważał, że związki zawodowe powodują korupcję. Był także przeciwnikiem ubezpieczeń społecznych. Uważał, że ludzie mogą osiągnąć znacznie więcej, samodzielnie inwestując pieniądze. Kto się mógł spodziewać, że po 10 latach wyrośnie z niego idealista. Pamiętam, że jego przyrodnia siostra mówiła: Co z niego będzie? Wyrośnie na faszystę". + +Alice Lippman wyszła za Daniela Stallmana w roku 1948. Rozeszła się z nim w 1958 i przez niemal 10 lat samotnie wychowując Richarda, wpoiła mu awersję do autorytetów oraz żądzę wiedzy. Był to czas ścierania się dwóch sił, ona i syn staczali ciągłe boje. + +"Nigdy nie chciał jeść" - wspomina. "Trwało to od skończenia 8 lat do końca szkoły średniej w roku 1970. Gdy wołałam go na obiad, nigdy nie słyszał. Zanim to do niego dotarło, musiałam krzyczeć dziewięć lub dziesięć razy. Całkowicie zatapiał się w myślach". + +Stallman pamięta to podobnie, ale z pewnym podtekstem. "Lubiłem czytać" - wspomina. - "Jeżeli miałem ochotę poczytać, a matka wołała mnie do kuchni albo kazała iść spać, nie miałem ochoty słuchać. Nie rozumiałem, dlaczego mam przerywać czytanie. Nie było żadnego powodu, dla którego miała prawo mi nakazywać, co mam robić. Podstawowe idee demokracji, o których czytałem, stosowałem do siebie samego. Nie rozumiałem, dlaczego nie miałyby dotyczyć dzieci". + +Wiarę w osobistą wolność wyłamywania się spod władzy autorytetów rozciągał na szkołę. Wyprzedzając kolegów klasowych o dwa lata, już w wieku 11 lat doświadczył frustracji, które zwykle są udziałem utalentowanego ucznia szkoły publicznej. Niedługo po rozwiązaniu przez Richarda prasowej łamigłówki jego matka przeżyła pierwszą z wielu wywiadówek. + +"W ogóle odmawiał pisania wypracowań" - wspomina dawne problemy. "Myślę, że ostatnie, jakie napisał przed klasą maturalną, było esejem na temat historii systemów liczbowych przygotowanym na polecenie nauczyciela w czwartej klasie". + +Uzdolniony we wszystkich dziedzinach, które wymagały myślenia analitycznego, ciążył ku matematyce i naukom ścisłym, zaniedbując wszystkie pozostałe. To, co inni nauczyciele traktowali jako jednostronne ograniczenie, matka uważała za głód wiedzy. Matematyka i nauki ścisłe oferowały tak wiele do poznania w porównaniu z przedmiotami, do których jej syn miał mniej zdolności. W wieku 10 lub 11 lat, gdy inni chłopcy z jego klasy rozpoczęli naukę gry w futbol, jej syn - jak wspomina - zaczął wracać do domu sfrustrowany. "Nie chciał grać tak fatalnie, ale po prostu miał kłopoty z koordynacją ruchów. To go wprawiało we wściekłość". + +Złość spowodowała jeszcze silniejsze skupienie się na matematyce i naukach ścisłych. Jego pasja nawet przy rzeczywistej pracy naukowej mogła sprawiać kłopoty. Pochłaniając książki matematyczne w wieku siedmiu lat, nie odczuwał potrzeby wdawania się w rozmowy z dorosłymi. W latach nauki w middle-school2 matka wpadła na pomysł, by wynająć studenta z sąsiedniego Columbia University, który mógłby zajmować się Richardem jak starszy brat. Po pierwszym spotkaniu student wyszedł i nigdy nie powrócił. "Wyobrażam sobie, co Richard musiał mu nagadać" - spekuluje matka. + +Kolejna matczyna anegdota dotyczy lat sześćdziesiątych, czasu tuż po zdarzeniu z łamigłówką. Mniej więcej w wieku lat siedmiu, w dwa lata po rozwodzie matki, Richard zajął się puszczaniem modeli rakiet w sąsiednim Riverside Drive Park. To, co zaczęło się jako niewinna zabawa, rychło stało się poważnym zadaniem badawczym połączonym z zapisywaniem danych o każdym starcie. Podobnie jak zainteresowanie grami matematycznymi, tak i ta pasja syna nie wzbudzała jej zbytniego zainteresowania. Było tak do czasu ważnego wystrzelenia rakiety przez NASA. Spytała wówczas Richarda, czy zamierza to oglądać w telewizji. + +"Wściekł się i jedyne, co mogłam zrozumieć, to to, że jeszcze czegoś nie opublikował" - wspomina. - "Naprawdę uważał, że ma coś istotnego do zakomunikowania NASA". + +Takie anegdoty świadczą o jego wczesnym silnym angażowaniu się w wykonywane zadania. Będzie go to cechowało przez całe życie. Gdy inne dzieci bawiły się, on siedział w pokoju i czytał. Gdy inne dzieci naśladowały Johnny'ego Unitasa3, on naśladował Wernera von Brauna. "Byłem dziwakiem" - zwięźle podsumował swoje młodzieńcze lata w wywiadzie z 1999 r. - "W pewnym wieku nie miałem żadnych przyjaciół poza nauczycielami4". + +Choć oznaczało to dla niej częstsze starcia ze szkołą, Alice Lippman zdecydowała się pozwalać synowi na realizowanie jego pasji. W wieku 12 lat Richard uczestniczył w letnich obozach naukowych, a w ciągu roku szkolnego - w dodatkowych zajęciach w szkole prywatnej. Nauczyciel poradził jej zapisanie syna do uczestnictwa w Columbia Science Honors Program5, który w erze posputnikowej uruchomiono dla uzdolnionej młodzieży z nowojorskich szkół średnich i college'ów. W ten sposób Stallman zaczął sobotnie wędrówki do campusu Columbia University. Jak wspomina Dan Chess, kolega z wykładów w Columbia Science Honors Program, Stallman wydawał się być "zakręcony" nawet w tej grupie miłośników matematyki i nauk ścisłych. "Wszyscy byliśmy dziwacznymi, nieprzystosowanymi do życia młokosami, zakochanymi w matematyce i naukach ścisłych, ale Richard wyróżniał się nawet wśród nas" - wspomina Chess, obecnie profesor matematyki w Hunter College. "Był bystry jak diabli. Widziałem wielu bystrych ludzi, ale on był ze wszystkich najbystrzejszy". + +Inny kolega z Columbia Science Honors Program, Seth Breidbart, potwierdza tę opinię. Programista, którego ze Stallmanem łączyły wspólne zainteresowania science-fiction i konwencjami tego gatunku, wspomina go jako krótko wystrzyżonego "strasznego" piętnastolatka. + +"Ciężko to opisać" - mówi Breidbart. - "Nie był niedostępny. Był strasznie spięty. O dużej wiedzy, ale pod pewnymi względami niereformowalny". + +Takie opinie rodzą spekulacje: czy określenia "spięty" i "niereformowalny" to cechy, które możemy dzisiaj uznać za zwykłe dziecięce wyłamywanie się z reguł środowiska? Pismo Wired z grudnia 2001 r. w artykule "The Geek Syndrome6"7 kreśli portrety kilku naukowo uzdolnionych dzieci, u których zdiagnozowano zespół Aspergera8 z cechami silnego autyzmu. Pod wieloma względami przytoczone przez Wired wspomnienia rodziców tych dzieci niejasno kojarzą się z tym, co opowiada matka Stallmana. Nawet on sam czasem pozwala sobie na psychiatryczne konotacje. W roku 2000, kreśląc swą sylwetkę dla Toronto Star, opisał siebie jako "będącego na granicy autyzmu"9, co odpowiada jego wykazywanej przez całe życie chęci społecznego i emocjonalnego izolowania się od otoczenia i równie długotrwałym usiłowaniom przezwyciężenia tych skłonności. + +Takie spekulacje wynikają, oczywiście, z częstych ostatnio rozważań na temat swobodnego i nieodpowiedzialnego zachowania związanego z tzw. behavioral disorder10. Jak twierdzi Steve Silberman, autor The Geek Syndrome, amerykańscy psychiatrzy używają ostatnio nazwy zespołu Aspergera jako wygodnego parasola kryjącego wiele różnorakich cech behawioralnych: od ograniczonych zdolności motorycznych i niemożności współżycia z otoczeniem po wybitną inteligencję połączoną ze szczególnym zainteresowaniem liczbami, komputerami i systemami11. Biorąc pod uwagę tak szeroki zasięg "parasola" zwanego zespołem Aspergera, Stallman może przypuszczać, że gdyby urodził się 40 lat później, w ten sposób zostałby zdiagnozowany. Zapewne spotkałoby to wielu jego kolegów-komputerowców. + +"Możliwe, że miałem coś takiego" - stwierdza - "ale z drugiej strony jedną z cech charakterystycznych tego zespołu są trudności w zachowaniu rytmu. Ja umiem tańczyć, a nawet sprawia mi przyjemność poruszanie się w takt melodii o najbardziej skomplikowanym rytmie. Ale to wszystko nie jest do końca wyjaśnione". + +Chess wyklucza tego rodzaju diagnozę: "Nigdy nie przypuszczałem, że cierpi na coś takiego. Był po prostu nietowarzyski, ale wszyscy byliśmy tacy". + +Matka Richarda uznaje tę interpretację za zabawną. Jednakże wspomina kilka historii z jego dzieciństwa, które mogą stanowić pożywkę dla dalszych spekulacji. Dwie spośród opowiadanych przez nią anegdot pasują do ważnej cechy autyzmu, jaką jest nadwrażliwość na dźwięki i kolory. "Gdy Richard był dzieckiem, zabraliśmy go na plażę" - powiada matka. - "Zaczął marudzić o dwie lub trzy przecznice wcześniej, nim dotarliśmy do wody. Dopiero gdy to się powtórzyło, za trzecim razem zrozumieliśmy, jaka była przyczyna jego narzekania. Szum fal ranił jego uszy". Pamięta również podobną reakcję na kolory. "Moja matka miała intensywnie rude włosy i zawsze, gdy się pochylała nad Richardem, aby go wziąć na ręce, uderzał w płacz". + +Ostatnio zaczęła czytać książki o autyzmie i sądzi, że zdarzenia te były czymś więcej niż zwykłym zbiegiem okoliczności. "Sądzę, że Richard miał pewne skłonności autystyczne. Szkoda, że wówczas tak niewiele o tym wiedziano". + +Jednakże uważa, że z czasem jej syn przystosował się. W wieku siedmiu lat lubił stawać w pobliżu przedniej szyby wagonu metra, odczytywać, zapamiętywać i porządkować w głowie podziemny labirynt komunikacyjny. Było to jego hobby połączone z przystosowywaniem się do słuchania dźwięków towarzyszących ruchowi wagonów. "W pierwszej chwili hałas wywoływał w nim odrazę, po czym jego nerwy uspokajały się". + +Jak wspomina, jej syn prawie zawsze wykazywał podniecenie, energię i umiejętność kontaktowania się z innymi, taką samą jak wszyscy normalni chłopcy. Dopiero po serii traumatycznych zdarzeń, które spadły na ich rodzinę, zamknął się w sobie i stał się introwertykiem. + +Pierwszym zdarzeniem traumatycznym był jej rozwód z Danielem Stallmanem, ojcem Richarda. Choć oboje starali się przygotować chłopca na ten cios, spowodował on spustoszenia w jego psychice. "Gdy po raz pierwszy powiedzieliśmy mu o tym, co ma nastąpić, zdawał się nie przywiązywać do tego wagi" - wspomina. "Rzeczywistym uderzeniem była dla niego moja i jego przeprowadzka do nowego mieszkania. Pierwszym jego pytaniem było A gdzie meble tatusia?". + +W ciągu następnych dziesięciu lat pięć dni w tygodniu spędzał w mieszkaniu matki na Manhattanie, a weekendy - w domu ojca w Queens. Te odejścia i powroty pozwoliły mu na ocenę różnego stylu życia obojga rodziców i wywołały trwały uraz przejawiający się w niechęci do posiadania i wychowywania dzieci. Gdy mówi o ojcu, weteranie II wojny światowej, który zmarł w roku 2001, wyraża na przemian złość i szacunek. Z jednej strony pamięta go jako człowieka, który z moralnego obowiązku, aby być bardziej użytecznym dla aliantów, nauczył się francuskiego, a z drugiej - jako ojca, który zawsze wiedział, w jaki sposób sformułować odmowę, aby cios był najokrutniejszy12. + +"Mój ojciec miał straszny charakter" - twierdzi Richard. - "Nigdy nie narzekał, ale zawsze znalazł sposób, aby krytykować spokojnie, na zimno i miażdżąco." + +Na temat mieszkania z matką wyraża się mniej dwuznacznie. "To była wojna" - powiada. - "W swym nieszczęściu, mówiąc Idę do domu, mówiłem o czymś nieistniejącym, o czymś, czego nigdy nie miałem". + +W ciągu kilku lat po rozwodzie rodziców azylem stał się dla niego dom dziadków ze strony ojca. Gdy miał około dziesięciu lat, dziadkowie zmarli - jedno wkrótce po drugim. Był to dla niego wielki cios. "Uciekałem tam, do miejsca, gdzie znajdowałem spokój i gdzie mnie kochano" - wspomina. - "Przed pójściem do college'u było to jedyne moje miejsce na świecie". + +Matka uważa śmierć dziadków za drugie traumatyczne zdarzenie, które spotkało syna. "Bardzo się tym przejął" - twierdzi. "Był do nich bardzo przywiązany. Do czasu ich śmierci był bardzo otwarty, przewodził paczce rówieśników. Potem zamknął się w sobie, stał się wyobcowany". + +Z perspektywy samego Stallmana emocjonalna izolacja była jedynie próbą poradzenia sobie z końcem okresu dojrzewania. Nazywa swoje młodzieńcze lata "czystym horrorem" i twierdzi, że często czuł się jak głuchy wśród tłumu dyskutującego o muzyce. + +"Często wydawało mi się, że nie jestem w stanie pojąć, co inni mówią" - wspomina, uważając, że emocjonalna zasłona odgrodziła go od świata rówieśników i dorosłych. "Pojmowałem słowa, ale coś tkwiącego głębiej nie pozwalało mi złożyć ich w zrozumiałą całość. Nie mogłem pojąć, dlaczego jedni są zainteresowani tym, co mówią inni." + +Kończący się okres dojrzewania wzmocnił jego poczucie indywidualizmu. Gdy większość jego rówieśników zapuszczała wówczas długie włosy, on strzygł się krótko. Gdy całe pokolenie słuchało rocka, on wolał muzykę klasyczną. Zawołany miłośnik science-fiction, magazynu "Mad"13 i późnonocnych programów telewizyjnych, kultywował swą odrębność hodowaną na gruncie niezrozumienia rodziców i rówieśników. + +"A te kalambury" - matka Richarda wspomina z przerażeniem okres, gdy był nastolatkiem - "przy stole nie można było słowa powiedzieć, bo wszystko przekręcał w jakiś kalambur zwrócony przeciw mówiącemu". + +Zapamiętywał dowcipy i zabawy słowne, by poza domem opowiadać je dorosłym, którzy byli skłonni pobłażać utalentowanemu dzieciakowi. Pierwszym był instruktor na obozie letnim, który wręczył dwunastolatkowi drukowaną instrukcję obsługi komputera IBM 7094. Dla chłopaka zafascynowanego liczbami i nauką był to dar niebios14. Przed końcem lata potrafił już pisać na papierze programy zgodne ze specyfikacjami wewnętrznymi 7094, zakładając, że znajdzie okazję do ich uruchomienia. + +Pierwszy komputer osobisty miał się pojawić dopiero po dekadzie, więc wszystko wskazywało na to, że przyjdzie mu długo czekać na ziszczenie pragnień. Okazja trafiła się, gdy był w pierwszej klasie junior high school. Po rozdaniu świadectw zaczął pracę w obecnie już nieistniejącym IBM New York Scientific Center w centrum Manhattanu. Spędził tam lato, pisząc swój pierwszy program: preprocesor dla 7094 w języku PL/I. "Najpierw pisałem w PL/I, by potem przejść na asembler, gdy okazało się, że program w PL/I jest za duży do uruchomienia na tym komputerze" - wspomina. + +Po opuszczeniu IBM Scientific Center zatrudnił się jako asystent laboratoryjny na wydziale biologii Rockefeller University. Choć jego zainteresowania już wyraźnie zaczęły się skupiać na matematyce i fizyce, jego analityczny sposób myślenia wywarł wrażenie na dyrektorze laboratorium, który w kilka lat później niespodzianie zadzwonił do matki Richarda. "Chciał się dowiedzieć, co Richard robi. Był zdumiony, że zajmuje się komputerami, bowiem przypuszczał, że wyrośnie z niego doskonały biolog". + +Jego zdolności analitycznego myślenia wzbudzały podziw także na zajęciach Columbia Science Honors Program, nawet wówczas gdy zachowywał się irytująco. "Zwykle raz lub dwa w ciągu godziny znajdował jakiś błąd w wykładzie" - wspomina Breidbart "i nie brakowało mu śmiałości do natychmiastowego wytknięcia go wykładowcy. Dzięki temu cieszył się wielkim respektem, ale znacznie mniejszą popularnością". + +Przypomnienie przytoczonej przez Breidbarta anegdoty wywołuje krzywy uśmiech na twarzy Stallmana. "Może czasem się ich czepiałem" - twierdzi, - "ale właśnie wśród nauczycieli znajdowałem bratnie dusze, bo w przeciwieństwie do uczniów chcieli się uczyć. Szczeniaki w większości nie miały na to ochoty, przynajmniej nie w tym samym stopniu". + +Sobotnie przebywanie wśród uzdolnionej młodzieży niewątpliwie zwiększyło jego pewność siebie i chęć kontaktowania się z rówieśnikami. W miarę zbliżania się czasu studiów jego zainteresowania, tak samo jak większości kolegów z Columbia Science Honors Program, stawały się coraz bardziej ukierunkowane, co powodowało zawężanie możliwości wyboru uczelni. W końcu pozostały tylko dwie: Harvard i MIT. Słysząc, że syn wybiera się na uczelnię należącą do Ivy League15, Alice Lippman poważnie zainteresowała się tą sprawą. Jako piętnastoletni uczeń junior high school Stallman wciąż miewał starcia z nauczycielami i administracją szkoły, wciąż z nimi polemizował. W poprzednim roku otrzymał ocenę A z historii Ameryki, chemii, francuskiego i algebry, ale te osiągnięcia przyćmiewało F16 z angielskiego, co było wynikiem bojkotowania przez niego wszelkich wypracowań. Coś takiego mogło być przełknięte przez MIT, ale nigdy przez Harvard. + +W czasie nauki w junior school matka zwróciła się o pomoc do terapeuty, który polecił skupić się na niechęci do pisania wypracowań i na wymądrzaniu się przy nauczycielach. Syn miał predyspozycje intelektualne do studiowania na Harvardzie, ale nie było pewne, czy starczy mu cierpliwości, by tak jak inni koledzy pisać na czas okresowe prace. Terapeuta zaproponował zrobienie próby. Jeżeli Richard przebrnie rok nauki w nowojorskiej szkole publicznej, w której jest wymagane pisanie prac okresowych z angielskiego, prawdopodobnie da sobie radę również na Harvardzie. Po zakończeniu nauki w junior high school Stallman zapisał się na letnie zajęcia prowadzone w Louis D. Bradeis High School na 84-tej ulicy i zaczął się uczyć trudnej sztuki pisania obowiązkowych prac klasowych, czego unikał w swojej dotychczasowej karierze szkolnej. + +Jesienią powrócił w szeregi zwykłych uczniów szkoły. Ciężko mu przychodziło cierpliwe przesiadywanie na lekcjach, które, w porównaniu z sobotnimi zajęciami w Columbia University, wydawały mu się pokutą, ale matka wspomina z dumą, że zdołał się podporządkować. + +"Do pewnego stopnia czuł się upokorzony, ale dał radę" - wspomina. "Graniczyło z cudem, że tylko raz wezwano mnie do szkoły. Nauczyciel matematyki narzekał, że Richard wciąż przerywa lekcje. Spytałam, w jaki sposób. Oskarża mnie, że źle przeprowadzam dowody. Ma rację, ale właściwych rozwiązań nikt, prócz niego, by nie zrozumiał". + +Na koniec pierwszego semestru w Brandeis wszystko się ułożyło. Ocena A 96 z angielskiego wymazała piętno wcześniejszych niepowodzeń i 60 punktów otrzymanych 2 lata temu. Podtrzymał dobrą opinię świetnymi ocenami z historii amerykańskiej, matematyki i mikrobiologii. Ukoronowaniem osiągnięć było 100 punktów z fizyki. Choć nadal stronił od innych, 11 miesięcy nauki w Brandeis zakończył 4. lokatą wśród 789 rówieśników. + + +Kopia świadectwa Stallmana z Louis D. Brandeis High School z listopada 1969. Należy zwrócić uwagę na doskonałą ocenę z angielskiego. "Do pewnego stopnia czuł się upokorzony, ale dał radę" - wspomina matka. + +Poza szkołą uczył się z jeszcze większą niż dotychczas pilnością, wykonując swe obowiązki asystenta laboratoryjnego w Rockefeller University i uczęszczając na sobotnie zajęcia w Columbia University, gdzie po drodze musiał mijać protestujących przeciw wojnie w Wietnamie. Wszyscy biorący udział w Science Honors Program od dawna dyskutowali nad wyborem uczelni, aż wreszcie przyszedł moment, gdy i on musiał się zdecydować. + +Breidbart wspomina: "Większość z nas wybierała się, oczywiście, na Harvard lub MIT, choć było kilku decydujących się na inne uczelnie Ivy League. Z rozmów wynikało, że Richard jeszcze nie pisnął słowa, gdzie zamierza studiować. Nie wiem, kto wreszcie zdobył się na odwagę, by spytać go o to". + +Trzydzieści lat później Breidbart dokładnie pamięta ten moment. Po oświadczeniu Stallmana, że również wybiera się na Harvard, w sali zapadła krępująca cisza. Wargi Richarda z wolna wgięły się w pełnym samozadowolenia uśmiechu. + +To było jego milczące stwierdzenie: "Tak... jeszcze się mnie nie pozbyliście". + + +Rozdział 4. +Impeach God1 + +Choć stosunki między nimi były napięte, Richard odziedziczył po matce istotną i wartą odnotowania cechę: pełne pasji zainteresowanie polityką. + +Jednakże cecha ta objawiła się w pełni dopiero po dziesięcioleciach. Kilka pierwszych lat życia spędził, jak teraz przyznaje, w "politycznej próżni"2. Jak większość Amerykanów w czasach Eisenhowera, rodzina Stallmanów starała się w latach pięćdziesiątych powrócić do normalnego życia utraconego w wojennych czasach lat czterdziestych. + +"Ojciec Richarda i ja należeliśmy do partii demokratycznej i to nam wystarczało" - mówi Alice Stallman, wspominając lata spędzone w Queens. - "Nie angażowaliśmy się ani w politykę lokalną, ani państwową". + +Zaczęło się to zmieniać w późnych latach pięćdziesiątych, po rozwodzie Alice i Daniela Stallmanów. Powrót na Manhattan był czymś więcej niż zwykłą zmianą adresu, była to również zmiana dotychczasowego stylu życia i wytrącenie z błogiego spokoju. + +"Myślę, że moje spotkanie z polityką zaczęło się od wizyty w bibliotece publicznej, gdzie znalazłam tylko jedną książkę na temat rozwodów" - wspomina Alice. - "Biblioteka była ściśle nadzorowana przez Kościół katolicki, przynajmniej w Elmhurst, gdzie mieszkaliśmy. Myślę, że wówczas po raz pierwszy uświadomiłam sobie istnienie sił, które nieśpiesznie i z ukrycia sterują naszym życiem". + +Wracając na manhattański Upper West Side, w okolice znane z dzieciństwa, była zaskoczona zmianami, które zaszły tam od czasu, gdy przed piętnastu laty opuściła Hunter College. Powojenny głód mieszkaniowy zamienił okolicę w arenę walk politycznych. Z jednej strony byli prorozwojowi politycy z rady miejskiej dążący do przebudowy i rozbudowy kwartałów miasta i zasiedlenia ich tłumem napływających do miasta urzędników. Po drugiej stronie stała biedota irlandzkich i portorykańskich dzierżawców i podnajemców, która w okolicy znalazła nędzną przystań. + +Na początku Alice Lippman nie wiedziała, po której stronie ma stanąć. Jako świeżo zamieszkała w tej okolicy rozumiała, czym jest chęć posiadania mieszkania. Jako samotna matka z minimalnymi dochodami podzielała punkt widzenia biedaków zaniepokojonych planami budownictwa przeznaczonego dla bogatych. Oburzenie skłoniło ją do szukania sposobów walki z machiną polityczną dążącą do zamiany sąsiedztwa w kopię Upper East Side. + +Wspomina swą pierwszą wizytę w lokalnej siedzibie Partii Demokratycznej w roku 1958. Szukała instytucji, gdzie idąc do pracy, mogłaby pozostawiać syna, ale przeraziły ją warunki panujące w jednym z utrzymywanych przez miasto ośrodków pomocy dla ubogiej ludności. "Wszystko, co pamiętam, to stęchły zapach skwaśniałego mleka, ciemne zakamarki i ogólny niedostatek. Byłam nauczycielką w prywatnej szkole opiekunek do dzieci. Kontrast był tak wielki, że po zajrzeniu do środka uciekłam. Bardzo mnie to wzburzyło". + +Wizyta w lokalnej siedzibie partii, którą zapamiętała jako "pomieszczenie przesiąknięte zapachem tytoniowego dymu" przyniosła rozczarowanie. Jak wspomina, po tej wizycie uświadomiła sobie, że korupcja w partii może być rzeczywistą przyczyną wrogości miasta wobec ubogich. Nie zajrzała więcej do siedziby władz partyjnych, gdyż uznała, że lepiej przyłączyć się do jednego z klubów działających na rzecz zreformowania machiny partyjnej demokratów i usunięcia z niej wpływów Tammany Hall3. Zapisała się do klubu, który szedł w ślady Woodrow Wilson4/FDR5 Reform Democratic Club i wraz z innymi członkami zaczęła bywać na różnych zebraniach dotyczących planów zagospodarowania miasta oraz na zebraniach rady miejskiej, domagając się większej jawności działań. + +"Naszym podstawowym celem była walka z Tammany Hall, Carminem DeSapio6 i jego pachołkiem" - wspomina. "Reprezentowałam klub w radzie miejskiej i brałam aktywny udział w przygotowaniu realnych planów zagospodarowania trenów miasta, które byłyby czymś więcej niż planem budowy kolejnych domów dla zamożnej ludności". + +Ta działalność zaowocowała nasileniem działalności politycznej w latach sześćdziesiątych. W roku 1965 otwarcie wspierała kandydatów do władz politycznych z ramienia Partii Demokratycznej, wśród nich wybranego do Kongresu Williama Fittsa Ryana, który jako pierwszy z reprezentantów wypowiedział się przeciw wojnie w Wietnamie. + +Wkrótce ona sama stała się jawną kontestatorką polityki USA w Indochinach. "Byłam przeciwniczką wojny w Wietnamie od czasu, gdy Kennedy posłał tam nasze wojska" - mówi. - "Czytałam informacje prasowe i historie opisywane przez dziennikarzy we wczesnych fazach konfliktu. Uwierzyłam ich zapowiedziom, że pakujemy się w bagno". + +Takie opinie przenikały do domu. W roku 1967 matka Richarda ponownie wyszła za mąż. Nowy mąż, Maurice Lippman, szef Air National Guard7, zrezygnował ze stanowiska dla zademonstrowania postawy antywojennej. Jej pasierb, Andrew Lippman, studiował na MIT i korzystał ze studenckiego odroczenia służby, ale wisiała nad nim groźba powołania w przypadku eskalacji działań i sięgnięcia USA po kolejne zasoby ludzkie. Był wreszcie Richard, przed którym stanęła perspektywa wyjazdu do Wietnamu lub Kanady, gdyby wojna miała się przeciągnąć na lata 1970. + +"Wietnam stał się głównym problemem naszego domu" - wspomina Alice Lippman. - "Rozmawialiśmy o tym bez ustanku: co poczniemy, jeżeli wojna będzie się przeciągać, co powinien zrobić Richard lub jego przyrodni brat w przypadku zaciągu. Byliśmy wszyscy przeciwnikami wojny i poboru. Uważaliśmy to za niemoralne". + +Dla Stallmana wojna wietnamska była przyczyną wielu sprzecznych i złożonych uczuć: zakłopotania, przerażenia i głębokiej politycznej bezradności. Jako chłopak, który ledwo potrafił znaleźć swoje miejsce w autorytarnej rzeczywistości szkoły prywatnej, odczuwał dreszcz przerażenia na samą myśl o wdzianiu munduru. + +"Strach mnie paraliżował i nie wiedziałem, co począć, a jednocześnie nie mogłem się zdobyć na wzięcie udziału w demonstracjach antywojennych" - wspomina, jak na swoje, przypadające w marcu, 18 urodziny otrzymał przerażająco niski numer w loterii poborowej, gdy rząd w roku 1971 ostatecznie skasował odroczenia studenckie. "Nie mogłem sobie wyobrazić wyjazdu do Kanady lub Szwecji. W jaki sposób miałem się stąd zabrać i wyjechać? Nie wiedziałem, jak można żyć, polegając jedynie na sobie. Nie należałem do osób, dla których takie rzeczy są proste i oczywiste". + +Przypomina sobie, że był jednocześnie podbudowany i zawstydzony postawą członków rodziny. Poczynając od przyklejonej przez ojca nalepki na zderzaku, która porównywała masakrę w My Lai do podobnych okropności z czasów II wojny światowej. Był bardzo podekscytowany tym aktem odwagi ojca. "Podziwiałem to, co zrobił, i jednocześnie zdawałem sobie sprawę, że mnie nie byłoby na to stać. Obawiałem się, że porażający strachem potwór poboru dosięgnie mnie i zniszczy". + +Choć w opisach niechęci do wypowiadania własnych przekonań tkwi nuta zawstydzenia, od udziału w manifestacjach studenckich odstręczał Stallmana ton i kierunek ruchu antywojennego. Podobnie jak inni członkowie Science Honors Program postrzegał sobotnie manifestacje w Columbia University raczej jako zabawny spektakl8. Nie bez znaczenia był fakt, że irracjonalne siły kierujące ruchem antywojennym trudno było oddzielić od irracjonalnych podstaw kultury młodzieżowej. Wśród dziewcząt w wieku Stallmana uwielbienie dla Beatlesów przerodziło się w uwielbienie dla przywódców rewolty w rodzaju Abbiego Hoffmana i Jerry'ego Rubina. Chłopakowi usiłującemu zrozumieć swych rówieśników eskapistyczne slogany w rodzaju make love not war9 wydawały się mocno naciągane. Do Stallmana, krótko wystrzyżonego outsidera, nienawidzącego rocka i narkotyków, omijającego wszelkie odbywające się w campusach demonstracje, nie przemawiało nie tylko polityczne, lecz równie seksualne znaczenie hasła. + +"Nigdy zbytnio nie lubiłem kontrkultury" - przyznaje. - "Nie lubiłem muzyki. Nie lubiłem narkotyków. Do narkotyków miałem uraz. Nie lubiłem postawy antyintelektualnej ani uprzedzeń do technologii. Ponad wszystko kochałem komputery. Nie cierpiałem również bezmyślnego antyamerykanizmu, z którym często się spotykałem. Wielu ludzi myślało w sposób tak uproszczony, że uważali, iż każda dezaprobata dla poczynań amerykańskich w Wietnamie musi pociągać za sobą wspieranie Wietnamczyków z północy. Nie mogli sobie wyobrazić bardziej złożonego punktu widzenia". + +Takie komentarze łagodzą wrażenie nieśmiałości. Podkreślają również cechę, która stanie się kluczem do zrozumienia późniejszego politycznego dojrzewania Stallmana. Jego polityczna pewność siebie była wprost proporcjonalna do osobistej. Przed rokiem 1970 niewiele do niego docierało spoza świata matematyki i nauk ścisłych. Jednakże znajomość matematyki okazała się być solidnym fundamentem pozwalającym na ocenę ruchu antywojennego za pomocą rozważań logicznych. Czyniąc to, zauważył brak logiki działań. Choć sprzeciwiał się wojnie w Wietnamie, nie widział żadnej przyczyny, która dezawuowałaby wojnę jako środek obrony wolności lub przestrzegania sprawiedliwości. Nie zmniejszało to dystansu oddzielającego go od rówieśników, a nawet go powiększało, postanowił więc wyniki swych przemyśleń zachowywać wyłącznie dla siebie. + +W roku 1970, rozpoczynając studia w Harvardzie, pozostawił za sobą wieczorne rozmowy przy kolacji o polityce i wojnie w Wietnamie. Patrząc wstecz, to przejście z matczynego domu do akademika w Cambridge nazywa "ucieczką". Rówieśnicy, którzy byli świadkami tej "ucieczki", nie zauważyli u niego żadnych oznak świadczących o wyzwoleniu. + +"Na początku pobytu w Harvardzie wyglądał bardzo mizernie" - twierdzi Dan Chess, jeden z kolegów z Science Honors Program, który też znalazł się na tej samej uczelni. - "Kontakty z innymi istotami ludzkimi sprawiały mu wyraźne trudności, a w Harvardzie nie mógł ich uniknąć. Panowała tam wyjątkowo towarzyska atmosfera". + +Aby łatwiej znieść odmianę życia, Stallman zagłębił się w matematyce i naukach ścisłych. Jak większość kolegów z Science Honors Program z łatwością zaliczył egzamin kwalifikacyjny na Math 55, legendarny kurs startowy dla żądnych wiedzy początkujących matematyków. "My, koledzy z SHP, stworzyliśmy trwały związek, rodzaj matematycznej mafii" - śmieje się Chess, twierdząc, że "Harvard był drobnostką w porównaniu z SHP". + +Łatwe zaliczenie Math 55 dla Stallmana, Chessa i innych absolwentów SHP mogło być powodem do dumy. Wiedza matematyczna, rozkładana zwykle na 4 lata nauki, została tu skondensowana w dwusemestrowym kursie, który znieść mogli tylko najlepsi zakochani w tym przedmiocie. "Była to zdumiewająca grupa" - wspomina David Harbater, wówczas jeden z członków "mafii", a dzisiaj profesor matematyki w Pennsylvania University. "Można prawdopodobnie stwierdzić, że w historii tej uczelni nie było nigdy grupy początkujących studentów studiujących z takim zapałem i tak zaawansowanych. "Ludzie robili okrągłe oczy, gdy mówiłem, że przed końcem drugiego semestru dyskutowaliśmy między innymi o geometrii rozmaitości różniczkowych Banacha. Zwykle na wykładach nie wspomina się o tym przed końcem drugiego roku studiów". + +Kurs rozpoczynało 75 studentów, którzy rychło poczęli się wykruszać, aż pozostało ledwo 20, z czego, jak twierdzi Harber "może 10 wiedziało dokładnie, co robi. Z tych dziesięciu ośmiu zostało w przyszłości profesorami matematyki, jeden zajął się nauczaniem fizyki, a ostatni to Richard Stallman". + +Jak wspomina Seth Breidbart, jeden z kursantów Math 55, Stallman wyróżniał się nawet w tym gronie. + +"W pewien swoisty sposób ściślej od innych przestrzegał procedur i dyscypliny działania" - mówi Breidbart. - "Istnieje w matematyce standardowa technika, zwykle błędnie przez wszystkich stosowana. Jest to nadużywanie notacji funkcji podczas jej definiowania. Najpierw funkcję definiujemy, a potem sprawdzamy, czy definicja jest właściwa. On zrobił tak tylko za pierwszym razem. Potem definiował relację i sprawdzał, że jest ona funkcją. Przebieg dowodu był, oczywiście, taki sam, ale używał właściwej terminologii. Był właśnie taki". + +Od czasu Math 55 zaczęła się utrwalać renoma jego błyskotliwości. Zgadza się z tym Breidbert, zaś Chess u którego wyczuwa się wspomnienie współzawodnictwa, uważa, że Stallman został uznany za najlepszego matematyka dopiero na następnym roku. "Stało się to w czasie wykładów z analizy funkcji rzeczywistych, które mieliśmy na drugim roku" - twierdzi Chess, obecnie profesor matematyki w Hunter College. - "Pamiętam złożony dowód dotyczący miar zespolonych, o którym Richard powiedział, że jest to w zasadzie analogia do rachunku wariacyjnego. Wtedy po raz pierwszy zobaczyłem kogoś, kto potrafi rozwiązać problem w sposób naprawdę oryginalny i błyskotliwy". + +Chess nie ma wątpliwości: rozwiązanie, które Stallman napisał na tablicy, robiło wielkie wrażenie. Dla chłopaka, który przywykł, że zawsze uważano go za najlepszego matematyka w klasie, to, co zobaczył, wyglądało jak wyrok. Wiele lat później powoli zdobył markę świetnego profesjonalnego matematyka, ale pamięta, że tamten dowód Stallmana odczuł jako drwinę z siebie i z innych. + +"W matematyce nie trzeba samemu być najlepszym" - twierdzi, - "by od pierwszego rzutu oka poznać prawdziwy matematyczny talent. Gdyby Richard został matematykiem, byłby matematykiem najwyższego lotu". + +Naukowym sukcesom Stallmana towarzyszył brak sukcesów towarzyskich. Choć inni członkowie matematycznej mafii z Math 55 wspólnie omawiali rozwiązania i problemy, on wolał pracować samotnie. Tak samo było z życiem prywatnym. Składając prośbę o zakwaterowanie w Harvardzie, wyraźnie wypowiedział swoje preferencje. "Powiedziałem, że najlepiej odpowiada mi współlokator, którego nie będzie można ani zobaczyć, ani usłyszeć, ani dotknąć" - wspomina. Harvardzkie biuro kwater wykazało się tu rzadką biurokratyczną przenikliwością, przydzielając mu jedyną jednopokojową kwaterę przeznaczoną dla studentów pierwszego roku. + +Breidbart, jedyny z mafii matematycznej współlokator z pierwszego roku, wspomina że Stallman powoli uczył się kontaktowania się z innymi studentami. Wspomina, jak inni koledzy z internatu, będąc pod wrażeniem logiczności jego rozumowania, coraz chętniej go słuchali podczas intelektualnych debat w stołówce lub innych pomieszczeniach ogólnego użytku. + +"Wiedliśmy mnóstwo nieformalnych dyskusji o możliwościach rozwiązywania światowych problemów i o ewentualnych skutkach tych rozwiązań" - mówi Breidbart. - "Powiedzmy, że ktoś wynalazłby eliksir nieśmiertelności. Co byście zrobili? Jaki miałoby to wpływ na politykę? Gdyby dać go wszystkim, świat uległby przeludnieniu i wszyscy by wyginęli. Gdyby dostęp do eliksiru ograniczyć do wybranej grupy, na przykład udostępnić go obecnie żyjącym, ale dawać go ich dzieciom, nastąpiłoby podzielenie ludzkości na klasę wyższą i niższą. Richard był najlepszy w przewidywaniu ukrytych skutków i okoliczności ewentualnych decyzji." + +Stallman żywo pamięta ówczesne dyskusje. "Zawsze podobała mi się idea nieśmiertelności i zdumiewało mnie, że większości widziała tylko jej złe strony. W jaki sposób inaczej moglibyśmy zobaczyć, jak świat będzie wyglądać za 200 lat?" - pyta. + +Choć był matematykiem i dyskutantem najwyższej klasy, konsekwentnie unikał otwartego współzawodnictwa, które mogłoby utwierdzić jego wybitną pozycję. Pod koniec pierwszego roku w Harvardzie jawnie uchylił się od zdawania egzaminu Putnama, prestiżowego sprawdzianu otwartego dla wszystkich studentów matematyki w USA i w Kanadzie. Oprócz możliwości porównania własnych umiejętności z rówieśnikami egzamin Putnama10 jest istotnym narzędziem rekrutacji najlepszych. Zwyczajowo zdobywca największej liczby punktów ma otwartą drogę na dalsze studia na dowolnie wybranej uczelni, łącznie z Harvardem. + +Egzamin Putnama, podobnie jak Math 55, jest trudnym testem merytorycznym. Wydaje się, że pytania, na które trzeba odpowiedzieć w ciągu sześciu godzin podzielonych na dwie trzygodzinne sesje, są obmyślone tak, by skutecznie odsiać ziarno od plew. Breidbart, mający za sobą również Math 55, wspomina go jako najtrudniejszy egzamin, jaki kiedykolwiek przyszło mu zdawać. "Abyście mieli pojęcie, jakie to trudne" - mówi - "powiem tylko, że na możliwych 120 punktów dostałem trzydzieści parę, co wystarczyło do zajęcia 102 miejsca w kraju". + +Breidbart zdziwiony nieprzystąpieniem do egzaminu Stallmana, uznawanego za najlepszego matematyka na roku, wraz z innym kolegą przyparł go do muru, żądając wyjaśnienia. "Powiedział, że obawiał się, że nie pójdzie mu dobrze". Twierdzą, że gdy napisali z pamięci zadania egzaminacyjne, Stallman rozwiązał wszystkie. "Przypuszczam, że przez "nie pójdzie dobrze" Stallman rozumiał zrobienie jakiegoś błędu i zajęcie drugiego miejsca" - twierdzi Breidbart. + +Stallman pamięta ten epizod nieco inaczej. Mówi: "Przypominam sobie, że przynieśli mi pytania i być może odpowiedziałem na część z nich, ale na pewno nie na wszystkie". Ale zgadza się z opinią Breidbarta, że strach był główną przyczyną nieprzystąpienia do egzaminu. Mimo iż często wykazywał intelektualną niedoskonałość rówieśników i wykładowców, nie cierpiał stawania do otwartej rywalizacji. + +"Z tego samego powodu nie lubiłem szachów" - twierdzi. - "Gdy tylko przystępowałem do gry, przede wszystkim się bałem, że zrobię głupi ruch na samym początku. I, oczywiście, stawało się to samospełniającą się przepowiednią". + +Jest rzeczą dyskusyjną, czy ten strach powstrzymał Stallmana przed zrobieniem kariery matematycznej. Pod koniec pierwszego roku studiów zainteresował się zagadnieniami z innych dziedzin. Programowanie komputerowe, fascynacja z ostatnich klas szkoły średniej, zaczynało powoli stawać się jego główną pasją. Podczas gdy inni studenci matematyki szukali intelektualnego oddechu na wykładach z historii i sztuk pięknych, on znajdował go w laboratorium komputerowym. + +Pierwsze zetknięcie z prawdziwym programowaniem w IBM New York Scientific Center pobudziło chęć pogłębiania wiedzy. "Pod koniec pierwszego roku studiów nabrałem wystarczająco dużo odwagi, by odwiedzać laboratoria komputerowe i patrzeć, co mają do zaoferowania. Pytałem, czy mają dodatkowe egzemplarze podręczników i dokumentacji, które mógłbym spokojnie przeczytać w domu". + +Studiując je, poznawał specyfikacje komputerów, porównywał z już znanymi i przygotowywał programy próbne, które zanosił do laboratorium wraz ze zwracanymi podręcznikami. Choć niektóre laboratoria wzdragały się przed zaakceptowaniem dziwacznego chłopaka zjawiającego się z prosto ulicy i z dopuszczeniem go do pracy z maszyną, część rozpoznała i uznała jego kompetencje i pozwalała uruchamiać napisane programy. + +Pewnego dnia, gdzieś pod koniec pierwszego roku studiów, usłyszał o specjalnym laboratorium w pobliżu MIT. Znajdowało się ono na dziewiątym piętrze nienależącego do campusu budynku na Tech Square - nowo zbudowanego specjalnie dla badań nad zaawansowanymi technologiami. Wedle krążących pogłosek, laboratorium to zajmowało się sztuczną inteligencją - wówczas najnowszą dziedziną badań komputerowych i programistycznych. + +Zaintrygowany, postanowił złożyć tam wizytę. + +Podróż nie była długa, wszystkiego dwie mile spacerem lub 10 minut pociągiem, ale jak się przekonał, MIT i Harvard znajdowały się na przeciwnych biegunach tej samej planety. Labirynt splątanych budynków campusu MIT stanowił yin dla yang11 harwardzkiego przestronnego stylu kolonialnego. To samo można było powiedzieć o studentach, dziwacznym skupisku odmieńców niegdyś niedopasowanych do wymagań szkół średnich, znanych bardziej z predylekcji do wygłupów niż poważnych zainteresowań politycznych. + +Ta yin-yangowa zależność rozciągała się także na AI Lab - laboratorium zajmujące się zagadnieniami sztucznej inteligencji. W przeciwieństwie do tego, do czego Stallman był przyzwyczajony w Harvardzie, nie było tu żadnego stopniowania dostępu studentów do komputera, żadnych list z wyznaczonymi terminami dostępu i nawet śladu atmosfery w stylu "patrz i nie dotykaj". Zamiast tego wszystkiego zobaczył jedynie rząd terminali i modeli ramion, zapewne artefakty z jakiegoś niedawnego doświadczenia prowadzonego przez AI Lab. + +Choć było widoczne, że każdy może usiąść przy jednym ze stojących terminali, Stallman postanowił trzymać się powziętego planu. Gdy spotkał pracownika laboratorium, spytał, czy mają zapasowe instrukcje i podręczniki, które mógłby pożyczyć jako dociekliwy student. "Coś tam mieli, ale wiele rzeczy nie miało jeszcze żadnej dokumentacji" - wspomina. "Oni byli przede wszystkim hakerami". + +Znalazł tam coś lepszego od podręczników - pracę. Choć nie pamięta, czego dotyczył pierwszy projekt, pamięta, że w następnym tygodniu zjawił się ponownie w AI Lab, zasiadł przy terminalu i zaczął pisać program. + +Patrząc wstecz, nie widzi nic dziwnego w chęci zaakceptowania widzianego po raz pierwszy, nieznanego osobnika z zewnątrz. "Tak wówczas postępowano" - mówi. - "Tak również postępuje się teraz. Przyjmuję kogoś do pracy, jeżeli widzę, że jest dobry. Po co mam czekać? Tylko sztywniacy naciskają na przestrzeganie reguł administracyjnych w każdym punkcie. Jeżeli ktoś jest dobry, nie trzeba go zmuszać do przechodzenia przez całą żmudną i nudną procedurę przyjmowania do pracy; należy go posadzić przy komputerze i niech się zabiera do roboty". + +Aby posmakować "biurokratycznego sztywniactwa", wystarczyło odwiedzić któreś z laboratoriów komputerowych Harvardu. Dostęp do komputerów był ustalany zgodnie z pozycją akademicką delikwenta. Jako student pierwszego roku Stallman musiał zwykle wpisywać się na listę oczekujących lub czekać do północy, gdy profesorowie i studenci zrobią, co mieli zrobić, i pójdą spać. Czekanie nie było trudne ale frustrujące. Oczekiwanie na dostęp do publicznego terminala w tym samym czasie, gdy połowa terminali umieszczonych w gabinetach profesorów stała bezczynnie, wydawało mu się rzeczą pozbawioną wszelkiej logiki. Choć od czasu do czasu odwiedzał laboratoria komputerowe w Harvardzie, wolał egalitarną atmosferę AI Lab. "Był to powiew świeżego powietrza" - mówi. - " W AI Lab bardziej zwracano uwagę na pracę niż na rangi". + +Wkrótce przekonał się, że zasada "pierwszy ten, kto pierwszy przyszedł" jest zasługą kilku osób czujnie pilnujących jej przestrzegania. Wielu z nich przeszło do AI Lab z projektu MAC12, finansowanego przez Departament Obrony projektu badawczego, który doprowadził do powstania pierwszego systemu operacyjnego z podziałem czasu. Kilku z nich było już legendą w świecie komputerowym, np. Richard Greenblatt, ekspert od Lispa13 i autor MackHacka, programu do gry w szachy, który upokorzył Huberta Dreyfusa, krytyka sztucznej inteligencji. Był też Gerard Sussman, autor oryginalnego programu HACKER sterującego robotem układającym klocki14, oraz Bill Gosper, szczególnie uzdolniony matematyk już od 18 miesięcy tkwiący w hakerskich zagadnieniach wywodzących się z filozoficznych implikacji komputerowej gry LIFE15. + +Członkowie tej ścisłej grupy nazywali siebie hakerami. Po pewnym czasie objęli tym określeniem również Stallmana. Najpierw jednak wpoili mu zasady "hakerskiej etyki". Bycie hakerem to coś więcej niż pisanie programów, to pisanie możliwie najlepszych programów, to przesiadywanie bez przerwy przy monitorze przez 36 godzin tylko po to, aby napisany program był możliwie najlepszy, to również posiadanie dostępu do możliwie najlepszych maszyn i informacji. Hakerzy mówią otwarcie o zmienianiu świata za pomocą oprogramowania i, jak nauczyli Stallmana, pogardzają wszystkim, co staje na drodze do zrealizowania tego wzniosłego celu. Przeszkodami stającymi na ich drodze są między innymi byle jakie programy, biurokracja i samolubne zachowanie części programistów. + +Nauczono go także, w jaki sposób należy twórczo obchodzić te przeszkody. Nauczono go otwierania zamków, sztuki potrzebnej do dostawania się do zamkniętych gabinetów profesorów i "uwalniania" stojących tam bezużytecznie terminali. W przeciwieństwie do swoich rozpieszczonych odpowiedników z Harvardu, kadra naukowa MIT wiedziała, że nie należy terminali traktować jak prywatnej własności. Jeżeli któryś z nich o tym zapomniał, hakerzy rychło korygowali ten błąd. Jeżeli "błąd" miał tendencję do powtarzania się, wysyłano dość ostrą reprymendę. "Widziałem wózek z ciężkim metalowym cylindrem użyty do otwarcia drzwi jednego upartego profesora" - twierdzi Stallman16. + +Takie pozbawione subtelności metody osiągały cel. Choć profesorowie i administratorzy przewyższali liczbą hakerów w stosunku dwa do jednego, w AI Lab kierowano się hakerską etyką. W czasie przybycia Stallmana obie grupy żyły w symbiozie. W zamian za utrzymywanie w ruchu komputerów i usuwanie wszelkich usterek oprogramowania hakerzy uzyskali pozycję uprzywilejowanych pupilów pracujących nad najlepszymi projektami. Często prowadziło to do istotnych ulepszeń sprzętu i oprogramowania. Jak nastolatki cieszące się przebudową i rozbudową samochodów ze złomowiska, hakerzy klecili i "wiązali drutem" komputery, bawiąc się tym jak dzieci. + +Nigdzie to naprawianie drobiazgów nie było tak widoczne jak w systemie operacyjnym pracującym w AI Lab na głównym minikomputerze PDP-6. System ITS (skrót od Incompatible Time Sharing - niezgodne dzielenie czasu), miał w swoją architekturę wbudowane cechy wynikające z hakerskiej etyki. Hakerzy zbudowali go jako protest przeciw oficjalnemu systemowi CTSS (Compatible Time Sharing System - system zgodnego dzielenia czasu) stworzonemu w ramach projektu MAC i odpowiednio go nazwali. W owym czasie hakerom wydawało się, że system CTSS jest zbytnio restryktywny i ogranicza programistom możliwości poprawiania jego architektury według potrzeb. Zgodnie z rozpowszechnianą przez hakerów legendą, decyzja o budowie ITS miała swoje polityczne podłoże. W przeciwieństwie do CTSS zaprojektowanego dla IBM 7094, ITS został zbudowany z myślą o PDP-6. Zezwolenie hakerom na zbudowanie własnego systemu oznaczało, że tylko oni będą mogli swobodnie korzystać z PDP-6. I rzeczywiście, gambit działał. Chociaż maszyna była współwłasnością kilku wydziałów, ludzie z A. I. mieli ją wkrótce dla siebie17. + +System ITS miał funkcje, na które systemy komercyjne musiały czekać jeszcze przez lata, np. wielozadaniowość, debugging i możliwości edycji pełnoekranowej. Używając go jako głównego systemu PDP-6, AI Lab mogło korzystać z pełnej niezależności od projektu MAC już przed przybyciem tam Stallmana. + +Jako rasowy adept hakerski Stallman wkrótce zakochał się w ITS. Zakazany dla większości nowicjuszy system zawierał wiele wbudowanych cech będących doskonałą szkołą dla terminatorów hakerskich w rodzaju Stallmana. + +"ITS miał bardzo elegancki mechanizm wewnętrzny pozwalający na badanie jednego programu przez inny." - twierdzi Stallman - "Można było analizować wszystkie stany programu w bardzo specyficzny ale przejrzysty sposób". + +Korzystając z tego, mógł śledzić, w jaki sposób pisane przez hakerów instrukcje są wykonywane. Drugą wspaniałą cechą była możliwość "zamrożenia" działania programu między poszczególnymi instrukcjami. W innych systemach operacyjnych takie polecenie prowadziło do ogólnego bałaganu i zawieszenia systemu. W ITS pozwalało to na śledzenie działania programu krok po kroku. + +"Jeżeli wydawałem polecenie zatrzymania, system zawsze zatrzymywał się w trybie użytkownika. Można go było zatrzymać między wykonaniem dwóch kolejnych instrukcji użytkownika i wszystko było ze sobą zgodne i zdatne do prześledzenia" - wspomina. - "Po wydaniu polecenia kontynuacji zadanie było dalej wykonywane bez zakłóceń. Ponadto można było zmieniać status działania tam i z powrotem, i wszystko zgodnie pracowało. Nigdzie nie pojawiały się żadne stany ukryte". + +Przed końcem roku 1970 działalność hakerska w AI Lab stała się stałym elementem tygodniowego planu zajęć Stallmana. Od poniedziałku do czwartku uczęszczał na zajęcia w Harvardzie. W piątek po południu jechał do MIT na weekend. Zwykle czas przybycia dopasowywał do pory wieczornego posiłku i z pięcioma lub sześcioma innymi hakerami pakował się do samochodu, by przejechać przez most harvardzki do sąsiedniego Bostonu i zjeść coś w chińskiej restauracji. Prze dwie lub trzy godziny dyskutowali o wszystkim - od ITS do wewnętrznej logiki języka chińskiego i stosowanego w nim zapisu piktograficznego. Potem wracali do MIT i do świtu pisali hakerskie programy. + +Dla samotnika rzadko potrafiącego się dopasować do swych rówieśników w Harvardzie było to istotne doświadczenie: spotkanie z grupą ludzi podzielających jego zainteresowania komputerami, science-fiction i chińską kuchnią. "Pamiętam wiele świtów, które nas zastawały w drodze powrotnej z Chinatown" - wspominał z nostalgią 15 lat później podczas przemówienia w Szwedzkim Królewskim Instytucie Technologicznym. - "Oglądanie wschodu słońca było rzeczą piękną, dającą spokój przez cały dzień. To wspaniała pora, by pójść spać. Wspaniale jest wracać do domu, gdy ptaki śpiewają. Daje to wspaniałe uczucie łagodnej, pełnej spokoju satysfakcji i zadowolenia z pracy wykonanej nocą18". + +Im dłużej przebywał z hakerami, tym bardziej przesiąkał ich wizją świata. Od dawna przekonany do idei wolności osobistej, zaczął rozważać swe poczynania z punktu widzenia społecznej odpowiedzialności. Szybko zaczął oponować, gdy inni naruszali zasady społecznego współżycia. W rok od swego przybycia był jednym z włamujących się do zamkniętych pokojów, w których stały "zasekwestrowane" terminale będące przecież wspólną własnością całej społeczności. Zgodnie z hakerskim stylem chciał mieć swój udział we włamaniach do zamkniętych gabinetów. Jeden z najbardziej artystycznych sposobów otwierania zamkniętych drzwi, którego wymyślenie zwykle przypisuje się Greenblatowi, polegał na wygięciu twardego drutu na kształt laski i przytwierdzeniu do dłuższego końca pętli z taśmy klejącej. Po wsunięciu drutu pod drzwiami można go było obracać, trzymając za krótszy koniec, aż dłuższy koniec dotknął do gałki zamka. Wówczas, dzięki przytwierdzonej na końcu taśmie klejącej można było kilkoma szybkimi obrotami otworzyć zamek. + +Gdy Stallman spróbował tego tricku, uznał go za dobry ale wymagający kilku ulepszeń. Przytwierdzenie taśmy do końca pręta nie zawsze było łatwe, a obracanie prętem tak, by spowodować otwarcie zamka również wymagało sporej zręczności. Pamiętał, że na suficie korytarza znajdowały się płyty, które można było łatwo odsunąć. Niektórzy hakerzy rzeczywiście korzystali z tej drogi, by dostać się do zamkniętych pomieszczeń, co dawało efekty lecz powodowało pokrycie delikwenta kurzem. + +Stallman pomyślał o rozwiązaniu alternatywnym. Zamiast wsuwania pręta pod drzwiami należy usunąć płytę sufitową nad nimi, by móc spojrzeć na gałkę zamkniętego zamka od góry. + +Wypróbował to. Zamiast drutu przygotował długą pętlę z taśmy magnetycznej w kształcie litery U. Na dole tego U przymocował pętlę z taśmy klejącej. Stojąc nad gałką zamka, tak długo manewrował pętlą, aż udało mu się umieścić ją pod gałką. Wówczas podciągnął pętlę tak, by taśma klejąca przywarła do gałki zamka. Potem pociągnął lewy koniec taśmy magnetycznej, obracając gałkę zgodnie z kierunkiem ruchu wskazówek zegara. Drzwi się, oczywiście, otworzyły. Przyczynił się zatem do rozwinięcia sztuki otwierania zamkniętych drzwi. + +"Czasami po przekręceniu gałki trzeba było popchnąć drzwi" - mówi, wspominając uporczywą trudność towarzyszącą korzystaniu z jego metody. - "Do otwarcia potrzebny był lekki nacisk". + +Te poczynania wskazują na wzrastającą w Stallmanie chęć występowania w obronie przekonań politycznych. Panujący w AI Lab duch bezpośredniego działania pomógł mu przełamać wrodzoną strachliwość paraliżującą go w latach dziecinnych. Włamanie do gabinetu z zamkniętym terminalem komputerowym nie było tym samym co udział w marszu protestacyjnym, ale w przeciwieństwie do wielu marszów przynosiło efekty. Rozwiązywało bieżący problem. + +Przed dotarciem do ostatnich lat na Harvardzie zaczął w życiu uczelnianym stosować dziwaczne i nieakceptowane praktyki poznane w AI Lab. + +"Czy opowiadał o wężu?" - spytała jego matka podczas przeprowadzanego z nią wywiadu. - "On i koledzy z internatu wystawili w wyborach węża. Oczywiście, zdobył sporo głosów". + +Stallman potwierdza opowiadanie o wężowej kandydaturze, dodając kilka uwag. Wąż był kandydatem w wyborach w jego internacie Currier House, a nie w wyborach do rady uczelni. Zdobył sporo głosów, dlatego że tak się nazywał jego właściciel. "Ludzie więc głosowali, myśląc, że chodzi o właściciela" - wspomina - "Na wyborczych plakatach podaliśmy, że wślizguje się do biur, a przed tygodniem wlazł do przewodu wentylacyjnego w ścianie i ukrył się tak, że nikt nie wiedział, gdzie się podziewa". + +Wprowadzenie węża do rady internatu było tylko jednym z żartów. W następnych wyborach wprowadzili do rady internatu syna zarządcy, którego hasłem wyborczym było obowiązkowe przechodzenia na emeryturę w wieku 7 lat. Ale te żarty bladły w porównaniu z kandydaturą kota Woodstocka do rady campusu. Woodstock zdobył wiele głosów, bijąc na głowę wielu ludzkich kontrkandydatów. "Nigdy nie ujawniono, ile głosów padło na Woodstocka. Głosy te unieważniono, ale sądząc z pokaźnej liczby nieważnych głosów w tamtych wyborach, można wnosić, że Woodstock był zwycięzcą". Kilka lat później Woodstock został w podejrzanych okolicznościach przejechany przez samochód. Nikt nie wiedział, czy kierowca pracował dla administracji MIT". Stallman twierdzi, że nie miał nic wspólnego z wystawieniem kandydatury Woodstocka, ale pomysł strasznie mu się podobał19. + +W AI Lab działalność polityczna Stallmana nabrała ostrzejszych tonów. W latach siedemdziesiątych hakerzy byli zmuszeni odpierać ciągły nacisk władz i administracji uczelni, dążących do usunięcia przyjaznego dla hakerów systemu ITS. Jeden z pierwszych ataków przyszedł w połowie dekady, gdy coraz większa liczba kadry naukowej zaczęła się domagać bezpiecznego systemu operacyjnego z wiarygodną ochroną danych. Większość pozostałych laboratoriów komputerowych zainstalowało takie systemy w latach sześćdziesiątych, ale AI Lab pod naciskiem Stallmana i pozostałych hakerów utrzymywało obszar wolnego dostępu. + +Dla Stallmana protest przeciwko zabezpieczeniom miał znaczenie zarówno etyczne, jak i praktyczne. Od strony etycznej wskazywał, że cała sztuka hakerska opiera się na intelektualnej otwartości i zaufaniu. Ze strony praktycznej twierdził, że wewnętrzna struktura ITS była zaprojektowana z myślą o otwartości i wszelkie odstępstwa od tego wymagają generalnej przebudowy. + +"Hakerzy, którzy napisali Incompatible Timesharing System, uznali, że ochrona bezpieczeństwa plików jest potrzebna głównie samolubnym zarządcom systemów, którzy chcą w ten sposób zdobywać władzę nad innymi" - tłumaczył. - "Hakerzy nie chcą takiej władzy, więc nie wyposażyli systemu w narzędzia, które mogłyby jej służyć. W rezultacie, jeżeli tylko w systemie zdarzy się coś złego, można to łatwo naprawić20". + +Taka czujność hakerów pozwoliła na utrzymanie komputerów AI Lab poza systemami zabezpieczeń o wiele dłużej niż w innych laboratoriach MIT, ale w końcu zwyciężyli zwolennicy ochrony danych. W roku 1977 MIT Laboratory for Computer Sciences21 zainstalowało pierwszy system z ochroną danych za pomocą haseł. Stallman ponownie uznał za swoje zadanie napiętnowanie tego, co uważał za odstępstwo od zasad etycznych. Zdobył dostęp do programu nadzorującego system haseł i zainstalował polecenie wysyłające komunikat do każdego, kto usiłował założyć unikalne hasło. Jeżeli użytkownik wpisał hasło np. "rozgwiazda", otrzymywał komunikat takiej mniej więcej treści: + + Widzę, że wpisałeś hasło "rozgwiazda". Proponuję, abyś je zmienił na proste naciśnięcie "Enter". To o wiele prostsze i popierające zasadę nieużywania żadnych haseł.22. + +Użytkownicy, którzy posłuchali rady, czyli nacisnęli Enter, wprowadzali do systemu pusty ciąg znaków, co było równoważne brakowi hasła i udostępnieniu swoich zasobów całemu światu. Niezależnie od tego, jak straszne skutki mogło to przynieść samym użytkownikom, umocniło wśród nich hakerską ideę, że komputery należące do Instytutu, a nawet zapisane na nich pliki są własnością powszechną a nie prywatną. Stallman, wypytywany o to w roku 1984 w wywiadzie związanym z przygotowywaniem książki Hakerzy, z dumą oświadczył, że jedna piąta użytkowników LCS uznała podany argument i wprowadziła puste hasło23. + +Jednakże jego walka o puste hasła okazała się daremna. Do roku 1980 nawet komputery AI Lab korzystały już z systemów używających hasłowego systemu zabezpieczeń. Było to kamieniem milowym na drodze jego osobistego i politycznego dojrzewania. Dla obiektywnego obserwatora jego późniejszej kariery jest to wygodny punkt graniczny oddzielający czas nieśmiałego chłopca obawiającego się wyrażać swoje opinie od czasu dorosłego aktywisty, który wkrótce poświęci całą energię na przekonywanie i nakłanianie innych. + +Sprzeciwiając się wprowadzeniu systemu zabezpieczeń komputerowych, Stallman wykorzystał wiele sił, które kierowały jego postępowaniem w pierwszym okresie życia: głód wiedzy, niechęć do autorytetów i frustrację wywoływaną przez wszelkie ukryte procedury czyniące z wielu ludzi bezideowców. Skorzystał także z koncepcji etycznych, które kierowały jego dorosłym życiem: społecznej odpowiedzialności, zaufania i hakerskiej zasady bezpośredniego działania. W języku komputerowym można powiedzieć, że puste hasło było wersją 1.0 Richarda Stallmana-działacza; wersją jeszcze niekompletną i pełną braków, ale dojrzałą w zarysie. + +Patrząc wstecz, Stallman waha się, czy temu zdarzeniu z okresu hakerskiego można przypisać tak duże znaczenie. "W tym czasie" - mówi - "wielu podzielało moje poglądy. Świadczy o tym znaczna liczba osób, które zaakceptowały propozycję wprowadzenia pustego hasła. Po prostu miałem skłonności do stania się działaczem, obrońcą tej sprawy". + +Przyznaje jednak, że to AI Lab uświadomiło mu, w jaki sposób można wyrażać swoje przekonania. Jako nastolatek obserwował wiele zdarzeń politycznych, ale nie przypuszczał, by pojedynczy osobnik mógł zrobić coś, co miałoby jakiekolwiek znaczenie. Jako dorosły młodzieniec mówił o rzeczach, których był pewien, takich jak projektowanie oprogramowania, odpowiedzialność społeczna i wolność osobista. "Włączyłem się do społeczności, która respektowała wolność każdego członka i w krótkim czasie uświadomiłem sobie, jaka to ważna rzecz. Dopiero po pewnym czasie zrozumiałem, że jest to sprawa natury moralnej" - mówi. + +Hakerstwo w AI Lab nie było jedyną formą działalności pomagającą mu w zdobyciu prestiżu. Na drugim roku przyłączył się do zespołu tanecznego specjalizującego się w tańcach ludowych. To, co miało być jedynie okazją do spotykania kobiet i rozrywką towarzyską, rychło stało się jego drugą obok hakerstwa pasją. Tańcząc przed publicznością w stroju bałkańskiego wieśniaka, tracił wcześniejszą nieporadność dziesięcioletniego chłopca, dla którego nieudane próby gry w piłkę były przyczyną frustracji. Zdobył pewność siebie, sprawność fizyczną i chęć życia. Przez krótką chwilę czuł nawet związek emocjonalny z innymi. Wkrótce przekonał się, że występowanie przed publicznością może być świetną zabawą i wkrótce strona artystyczna przedstawienia zaczęła go interesować na równi ze stroną towarzyską. + +Taniec i hakerstwo nieco poprawiły jego pozycję towarzyską, pomogły pokonać uczucie odmienności, które ciemną chmurą przysłaniało jego przedharvardzkie życie. Zamiast lamentować nad swoją dziwaczną naturą, zaczął ją celebrować. W roku 1977, biorąc udział w zjeździe miłośników science-fiction, natknął się na kobietę sprzedającą guziki robione na zamówienie. Podekscytowany zamówił guzik z napisem Impeach God24. + +Dla niego było to przesłanie o wielu poziomach znaczeniowych. Jako ateista od najwcześniejszego dzieciństwa uznał to przede wszystkim za wezwanie do stworzenia drugiego frontu w toczącej się debacie religijnej. "Dotychczas wszyscy argumentowali za istnieniem lub nieistnieniem Boga" - twierdzi, - "a hasło Impeach God wzywa do spojrzenia na Boga od zupełnie innej strony. Jeżeli Bóg był na tyle potężny, by stworzyć świat, a potem nie zrobił nic, by poprawić swe dzieło, dlaczego mamy go czcić, zamiast postawić w stan oskarżenia? Czy nie lepiej byłoby wytoczyć mu proces?" + +Jednocześnie Impeach God było hasłem satyrycznym uderzającym w Amerykę i jej system polityczny. Skandal polityczny afery Watergate z lat siedemdziesiątych głęboko dotknął Stallmana. Jako dziecko wzrastał w atmosferze niedowierzania autorytetom. W życiu dorosłym ta niewiara została wzmocniona kulturą hakerskiej społeczności AI Lab. Dla hakerów afera Watergate była jedynie jedną z szekspirowskich realizacji codziennych walk, które przychodzi staczać ludziom pozbawionym przywilejów z potęgami świata. Była to wielka przenośnia tego, co się dzieje, gdy ludzie zaprzedają wolność i otwartość dla wygody i bezpieczeństwa. + +Rosnąca pewność siebie skłoniła go do dumnego noszenia owego guzika. Ciekawskim pytającym o znaczenie hasła odpowiadał dobrze spreparowanym oświadczeniem: "Moje imię Jehowa. Mam plan zbawienia wszechświata, ale ze względu na niebiańskie zasady bezpieczeństwa nie mogę więcej powiedzieć. Możecie tylko wierzyć we mnie, ponieważ ja widzę obraz, a wam nie jest to dane. Wierzcie w moją dobroć, ponieważ mówię wam o niej. Jeżeli mi nie uwierzycie, wpiszę was na listę moich wrogów i wrzucę tam, gdzie piekielni poborcy podatkowi rozliczą was ze zobowiązań wobec wieczności". + +Ci, którzy odczytywali to przemówienie jedynie jako parodię informacji o aferze Watergate, chwytali jedynie połowę znaczenia. Według Stallmana dodatkowa informacja zawarta w tych słowach była przeznaczona jedynie dla innych członków hakerskiej społeczności. W sto lat po ostrzeżeniu lorda Actona25, że władza absolutna korumpuje absolutnie, Amerykanie zdają się zapominać o pierwszej części wygłoszonego przez niego truizmu: władza to korupcja. Zamiast zajmować się poszczególnymi przypadkami korupcji Stallman swą nienawiść skierował na system, który potęgę władzy stawiał na pierwszym miejscu. + +"Pytałem, dlaczego mamy się zatrzymać na pomniejszym wyrobniku" - mówi Stallman, wspominając guzik i zapisane na nim przesłanie. - "Skoro uporaliśmy się z Nixonem, dlaczego nie zająć się Najwyższym? Sądzę, że każdy, kto mając władzę, używa jej do poniżenia innych, powinien zostać jej pozbawiony". + + +Rozdział 5. +Niewielkie bajorko wolności + +Spytajcie kogokolwiek, kto spędził choć minutę ze Stallmanem, co najbardziej utkwiło mu w pamięci, a otrzymacie zawsze tę samą odpowiedź. Nie będą to ani długie włosy, ani dziwny sposób zachowania. Jego najbardziej zauważalną cechą jest wyraz oczu. Jedno spojrzenie w zielone oczy Stallmana i jesteście pewni, że macie przed sobą człowieka, który wierzy w to, co robi. + +Intensywność jego wzroku nie podlega dyskusji. Jego oczy na Ciebie nie patrzą, one Cię przenikają na wskroś. Nawet jeżeli przez grzeczność na chwilę odwracasz wzrok, jego oczy nie przestają Cię w skupieniu lustrować, wwiercając się w czaszkę jak dwie wiązki fotonów. + +Być może dlatego większość pisarzy, opisując Stallmana, robi to pod kątem religijnym. W roku 1998 w Salon.com opublikowano artykuł zatytułowany "The Saint of Free Software"1, w którym Andrew Leonard napisał, że "zielone oczy Stallmana promieniują mocą starotestamentowych proroków"2. W roku 1999 magazyn Wired napisał, że broda Stallmana przypomina rasputinowską3, zaś London Guardian opisuje uśmiech Stallmana jako należący do "ucznia spoglądającego na Jezusa4". + +Te analogie robią wrażenie, lecz ostatecznie chybiają celu, dlatego że nie odkrywają słabych punktów Stallmana. Jeżeli dłużej popatrzycie mu w oczy, zauważycie subtelną zmianę. To, co na pierwszy rzut oka wydaje usiłowaniem onieśmielenia i zahipnotyzowania, okazuje się być próbą nawiązania i podtrzymania kontaktu przez osobę sfrustrowaną. Jeżeli osobowość Stallmana, zgodnie z jego własnymi podejrzeniami, jest wynikiem autyzmu lub syndromu Aspergera, jego oczy zdają się potwierdzać tę diagnozę. Nawet wówczas gdy błyszczą najintensywniej, zdają się patrzeć gdzieś w dal, jak oczy zranionego zwierzęcia, które ma wyzionąć ducha. + +Moje pierwsze zetknięcie z legendarnym spojrzeniem Stallmana nastąpiło w marcu roku 1999 na LinuxWorld Convention and Expo5 w San Jose w Kalifornii. Konferencja, dla społeczności związanej z oprogramowaniem linuksowym będąca "wyjściem w świat", Stallmanowi ułatwiała ponowne zaprezentowanie się mediom elektronicznym. Zdecydowany upomnieć się o należną mu część uwagi opinii publicznej, skorzystał z okazji, by poinformować zwiedzających i dziennikarzy o historii projektu GNU i jego politycznych celach. + +Jako reporter posłany do obsługi zdarzenia poszedłem na konferencję Stallmana poświęconą pojawieniu się GNOME 1.0 - graficznego interfejsu użytkownika należącego do wolnego oprogramowania. Zadając pierwsze pytanie, nacisnąłem całą serię "czerwonych guzików", co spowodowało wygłoszenie długiego i wyczerpującego pouczenia. Zapytałem, czy dojrzała wersja GNOME będzie miała wpływ na rynkową popularność systemu operacyjnego Linux. + +"Bardzo proszę nie nazywać systemu operacyjnym Linuksem" - odparł Stallman. - "Linuksowe jądro jest tylko niewielką częścią systemu operacyjnego. Znaczna część programów stanowiących razem system operacyjny, który nazywa pan Linuksem, nie została napisana przez Linusa Torvaldsa. Programy te stworzyli ochotnicy pracujący w ramach projektu GNU i poświęcający na to swój prywatny czas. Dzięki temu mamy wolny system operacyjny w obecnej postaci. Nieuznawanie ich wysiłków jest niegrzeczne i fałszuje fakty historyczne. Dlatego proszę, aby pan, mówiąc o tym systemie operacyjnym, używał jego właściwej nazwy GNU/Linux". + +Notując usłyszane słowa, wsłuchiwałem się w niesamowitą ciszę, która zapadła w zatłoczonej sali. Gdy wreszcie podniosłem wzrok, napotkałem oczy Stallmana wpatrujące się we mnie bez jednego mrugnięcia. Inny reporter nieco bojaźliwie zadał następne pytanie, pilnując się, by używać właściwej nazwy GNU/Linux. Odpowiedział na nie Miguel de Icaza kierujący projektem GNOME. Jednakże dopiero gdy de Icaza był w połowie odpowiedzi, Stallman wreszcie odwrócił wzrok ode mnie. Dopiero wtedy poczułem miły dreszcz wolności przebiegający po krzyżu. Gdy Stallman zaczął pouczać innego reportera na temat błędów jego dykcji, poczułem ulgę. Przynajmniej już na mnie nie patrzy - pomyślałem. + +Takie chwilowe zatrzymywanie na kimś wzroku doskonale służyło celom Stallmana. Przed końcem konferencji LinuxWorld większość dziennikarzy doskonale wiedziała, że w jego obecności lepiej nie używać nazwy Linux, a w wired.com pojawił się artykuł, w którym porównano Stallmana do przedstalinowskiego rewolucjonisty wymazanego z kart historii przez hakerów i przedsiębiorców, którym z powodów politycznych projekt GNU stał ością w gardle6. Autorzy innych artykułów poszli tym śladem i gdy kilku dziennikarzy użyło w druku nazwy GNU/Linux, inni przypomnieli, że Stallman doprowadził do powstania wolnego systemu operacyjnego już 15 lat wcześniej. + +Przez następne 17 miesięcy nie spotkałem Stallmana. W tym czasie ponownie odwiedził Dolinę Krzemową podczas Linux-World Show w sierpniu 1999 r. Choć nie poproszono go o wygłoszenie przemówienia, urządził wszystko w sposób maksymalnie dla siebie korzystny. Przyjmując Linus Torvalds Award for Community Service7, zażartował: "Danie nagrody Linusa Torvaldsa Fundacji Wolnego Oprogramowania to coś jak nagroda Hana Solo dla Przymierza Rebeliantów8". + +Tym razem jednak komentarz przeminął w mediach bez echa. W połowie tygodnia Red Hat, Inc., najważniejszy dostawca GNU/Linux, wszedł na giełdę z ofertą publiczną. Było to potwierdzenie czegoś, czego dziennikarze, łącznie ze mną, spodziewali się od dawna - "Linux" stał się na Wall Street słowem-symbolem, podobnie jak wcześniej e-commerce i dot-com. W miarę zbliżania się przesilenia roku 2000 na giełdzie wszystkie dyskusje na temat wolnego oprogramowania i jego politycznego znaczenia odbijały się od nieprzebytego muru, jak hiperbola od pionowej asymptoty, i opadały bezsilnie u jego podnóża. + +Być może dlatego trzecią z kolei konferencję LinuxWorld w sierpniu 2000 r. Stallman demonstracyjnie zbojkotował. + +Wkrótce potem po raz drugi zetknąłem się z nim i z jego "firmowym" spojrzeniem. Słysząc, że zamierza przyjechać do Krzemowej Doliny, umówiłem się z nim na lunch i wywiad w kalifornijskim Palo Alto. Wybór miejsca zdawał się być ironią losu, nie tylko z powodu ostatniej nieobecności Stallmana na LinuxWorld, lecz także z powodu tła naszego spotkania. Poza Redmond w stanie Washington niewiele jest miast, które byłyby w równym stopniu potwierdzeniem ekonomicznego znaczenia własności oprogramowania. Ciekawie było patrzeć, jak Stallman - człowiek, który spędził znaczną cześć życia na zwalczaniu mentalności opartej na chęci posiadania, zachowa się w mieście, w którym nawet cena bungalowu wielkości połowy garażu sięga 500 tysięcy dolarów. Jechałem na spotkanie z Oakland. + +Kierując się wskazówkami otrzymanymi od Stallmana, dotarłem do siedziby Art.net, niedochodowej "wspólnoty wirtualnych artystów". Kwatera Art.net usytuowana na północnym krańcu miasta, na posesji odgrodzonej od świata żywopłotem, działała odświeżająco. Nagle wizja Stallmana czającego się gdzieś w zakamarkach Krzemowej Doliny wydała się mniej dziwaczna. + +Znalazłem go w zaciemnionym pokoju, "zastukanego" w klawiaturę jego szarego laptopa. Gdy wszedłem, podniósł wzrok i oświetlił mnie pełną mocą swego 200-watowego spojrzenia. Gdy mruknął dość przyjazne "Hello", odwzajemniłem powitanie. Zanim jednak cokolwiek powiedzieliśmy, jego wzrok powrócił na ekran laptopa. + +"Właśnie kończę artykuł poświęcony duchowi hakerstwa" - powiedział, nadal przebiegając palcami po klawiaturze. - "Zobacz". + +Spojrzałem. Światło w pokoju było przyćmione, a tekst był wyświetlony białozielonkawym kolorem na czarnym tle, czyli za pomocą kolorów odwrotnych do zwykle stosowanych w edytorach tekstu, zatem nieco potrwało, zanim mój wzrok zaadaptował się do warunków i mogłem coś odczytać. Zobaczyłem opis ostatniej wizyty Stallmana w restauracji koreańskiej. Przed posiłkiem Stallman dokonał interesującego odkrycia: osoba nakrywająca do stołu pozostawiła 6 pałeczek zamiast potrzebnych dwóch. Większość restauracyjnych gości po prostu zignorowałaby istnieje dodatkowych czterech pałeczek, ale dla niego było to wyzwanie: w jaki sposób użyć jednocześnie wszystkich sześciu. Tak jak w przypadku wielu hakerskich trików, również tutaj rozwiązanie było jednocześnie proste i wymagające inteligencji, więc użył ich tak, jak to zostało pokazane na załączonej ilustracji. + +W trakcie czytania tej historii czułem, że Stallman intensywnie mi się przygląda. Zerknąłem na niego i zauważyłem na twarzy dziecięcy półuśmiech zadowolenia z siebie. Ale gdy pochwaliłem jego esej, mój komentarz wywołał ledwo zauważalne uniesienie brwi. + +"Będę gotowy za moment" - powiedział. + +Wrócił do stukania na laptopie. Był to szary kanciasty laptop, w niczym nie przypominający lśniących, nowoczesnych cacek, które często widywałem w rękach programistów na konferencji LinuxWorld. Nad normalną klawiaturą była przymocowana druga pozwalająca na lżejsze naciskanie klawiszy. Gdy w latach osiemdziesiątych spędzał około 70-80 godzin tygodniowo na pisaniu oprogramowania dla projektu GNU, odczuwał nieznośny ból rąk i był zmuszony wynająć maszynistę. Dlatego teraz korzystał z klawiatury wymagającej o wiele słabszego naciskania na klawisze niż w przypadku klawiatur standardowych. + +Podczas pracy wyłączał się na wszelkie bodźce zewnętrzne. Patrząc na jego oczy skupione na ekranie i palce tańczące po klawiaturze, szybko dochodziło się do wniosku, że tak wygląda współpraca dwóch dobrych przyjaciół. + +Zakończył pisanie kilkoma głośniejszymi uderzeniami klawiszy i zamknął laptopa. + +"Gotów na lunch?" spytał. + +Poszliśmy do mojego samochodu. Tłumacząc się bólem w kostce, szedł wolno, nieco utykając. Twierdził, że to wynik uszkodzenia ścięgna lewej stopy. Kontuzja miała miejsce trzy lata temu i była na tyle poważna, że on, zaprzysięgły fan tańców ludowych, był zmuszony do rezygnacji z nich. "Miłość do tańca to moja cecha wrodzona" - narzekał. - "Niemożność tańczenia to dla mnie tragedia". + +Jego ciało było obrazem tej tragedii. Brak ruchu spowodował nabrzmienie policzków i pojawienie się brzuszka, który przed rokiem był niemal niewidoczny. Widać było, że przybranie na wadze było dla niego dramatem, gdyż idąc odchylał się do tyłu jak kobieta w ciąży starająca się zrównoważyć nienormalny ciężar. + +Dodatkowo spacer stał się jeszcze wolniejszy, gdyż Stallman zatrzymywał się, by wąchać róże. Spotykając wyjątkowo piękny kwiat, łaskotał wewnętrzne płatki swym pokaźnym nosem, wciągał zapach i odchylał się z wyrazem ukontentowania na twarzy. + +"Mmm, rhinophytophilia9" - powiedział, pocierając kark. + +Jazda samochodem do restauracji nie trwała dłużej niż trzy minuty. Zgodnie z zaleceniem Tima Neya, niegdyś dyrektora Fundacji Wolnego Oprogramowania, pozostawiłem Stallmanowi wybór restauracji. Niektórych dziennikarzy zmylił niemal ascetyczny styl życia Stallmana - we wszystkim, co dotyczy jedzenia, jest on hedonistą. Dodatkową korzyścią płynącą z bycia wędrownym misjonarzem głoszącym ideę wolnego oprogramowania jest możliwość próbowania kuchni różnych narodów. "Kiedy Richard przyjeżdża do dowolnego dużego miasta na świecie, z dużą dozą prawdopodobieństwa można założyć, że zna tam najlepsze restauracje" - twierdzi Ney. "Jest również bardzo dumny ze znajomości potraw w menu i z wielką radością składa zamówienia dla wszystkich przy stole." + +Na dzisiejszy posiłek wybrał restaurację dim sum10 w stylu kantońskim, dwie przecznice od University Avenue, głównej ulicy Palo Alto. Wybór był częściowo zainspirowany jego niedawna wizytą w Chinach i wygłoszeniem wykładu w prowincji Guangdong oraz awersją do ostrych przypraw charakteryzujących kuchnię Seczuanu i prowincji Hunan. "Nie jestem zwolennikiem ostrych przypraw" - przyznał. + +Przyjechaliśmy kilka minut po 11 przed południem i już musieliśmy poczekać około 20 minut. Znając hakerską niechęć do tracenia czasu, obawiałem się wybuchu, ale wbrew oczekiwaniom Stallman spokojnie przyjął to do wiadomości. + +"Szkoda, że nie ma nikogo, kto mógłby się do nas przyłączyć" - powiedział. - "Zawsze weselej jeść w większej grupie". + +Czekając, ćwiczył kilka kroków tanecznych. Jego ruchy były niepewne lecz poprawne. Dyskutowaliśmy o sprawach bieżących. Powiedział, że żałuje jedynie, iż na konferencji Linux-World nie mógł uczestniczyć w powołaniu Fundacji GNOME. Fundacja wspierana przez Sun Microsystems i IBM jest w znacznej mierze potwierdzeniem słuszności jego twierdzeń, że wolny rynek i wolne oprogramowanie nie muszą się wzajemnie wykluczać. Był niezadowolony, że ominęła go okazja do wypowiedzenia się. + +"Nie podoba mi się sposób prezentacji. Obie firmy mówiły dużo o Linuksie, nawet nie wspominając o projekcie GNU" - mówił niezadowolony. + +To niedocenianie kontrastuje z coraz lepszymi informacjami napływającymi z innych kontynentów, zwłaszcza z Azji - podkreśla. Krótkie spojrzenie na plan jego podróży w roku 2000 świadczy o niewątpliwym wzroście popularności wolnego oprogramowania na świecie. Pomiędzy ostatnimi wizytami w Indiach, Chinach i Brazylii na 115 dni tylko 12 spędził w USA. Podróże dają mu możliwość sprawdzenia, w jaki sposób koncepcja wolnego oprogramowania jest przyjmowana przez ludzi różnych języków i kultur. + +"W Indiach wiele osób interesuje się wolnym oprogramowaniem, gdyż widzą w nim możliwość budowania własnej infrastruktury informatycznej bez wydawania zbyt wielkich sum pieniędzy" - stwierdził Stallman. - "W Chinach idea wolnego oprogramowanie szerzy się wolniej, co jest związane z brakiem wolności słowa. Trudno przyjmować wolne oprogramowanie tam, gdzie nie ma wolności wypowiedzi. Pomimo to stopień zainteresowania wolnym oprogramowaniem jest znaczny, co zaobserwowałem podczas mojej wizyty". + +Rozmowa zeszła ma Napstera, firmę z San Mateo w Kalifornii, która w ciągu kilku ostatnich miesięcy stała się przedmiotem wielkiego zainteresowania mediów. Dostarcza ona narzędzi pozwalających jednym fanom muzyki przeglądać i kopiować pliki muzyczne należące do innych. Dzięki rosnącej roli internetu ten tzw. program peer-to-peer11 rozrósł się i przekształcił w prawdziwą szafę grającą, dając zwykłym fanom muzyki sposób na słuchanie ulubionych utworów z odgrywanych na komputerze plików MP3 bez płacenia złamanego grosza - ku rozgoryczeniu firm fonograficznych. + +System Napstera, choć korzysta z oprogramowania z prywatnymi prawami własności, czerpie inspirację z głoszonej przez Stallmana idei, że wszystko, co staje się cyfrową rzeczywistością, w której kopiowanie informacji staje się o wiele ważniejsze od kopiowania dźwięków i materii, coraz trudniej podlega jakimkolwiek restrykcjom. Zamiast nakładać kolejne ograniczenia, rządzący Napsterem zdecydowali się czerpać korzyści z naturalnego pędu i tworząc dla słuchaczy muzyki centralny rynek handlu i wymiany plików, postawili na sterowanie ich zainteresowaniami w stronę innych możliwości handlowych. + +Nagły sukces modelu zaproponowanego przez Napstera przeraził tradycyjne firmy fonograficzne. Na kilka dni przed moim spotkaniem ze Stallmanem w Palo Alto Marylin Patel, U. S. District Court Judge12, pozytywnie rozpatrzyła złożone przez Recording Industry Association of America14 żądanie wydania sądowego zakazu działania systemu wymiany plików. Zakaz ten został z kolei zawieszony przez U. S. Ninth District Court of Appeals14. Jednakże na początku 2001 roku również sąd apelacyjny uznał, że firma z San Mateo złamała prawo autorskie, co rzecznik RIAA, Hillary Rosen, ogłosiła jako "wielkie zwycięstwo twórczej społeczności i legalnego rynku internetowego15". + +Dla hakerów takich jak Stallman model biznesowy Napstera jest nie do przyjęcia z kilku powodów. Firma gorliwie korzysta z hakerskich zasad, takich jak otwarte udostępnianie plików i społeczna własność informacji, jednocześnie sprzedając usługi oparte na korzystaniu z oprogramowania z prywatnym prawem własności, co tworzy przedziwną mieszaninę i przekazuje społeczeństwu niejasne przesłanie. Jako osoba, która masę czasu spędziła na ostrożnym formułowaniu informacji przeznaczonych do upublicznienia, Stallman ostrożnie i oszczędnie wyraża swe sądy o Napsterze. Przyznaje, że nauczył się kilku rzeczy dotyczących społecznej strony fenomenu Napstera. + +Mówi: "Przed sprawą Napstera twierdziłem, że jest OK, jeżeli ludzie zajmują się prywatną redystrybucją plików służących rozrywce. Jednakże liczba ludzi, która korzysta z serwisu Napstera, uświadomiła mi, że redystrybucja kopii na wielką skalę jest sprawą o wielkim znaczeniu i nie można jej lekceważyć". + +Gdy Stallman to powiedział, drzwi restauracji otworzyły się i właściciel zaprosił nas do środka. W ciągu kilku sekund zostaliśmy posadzeni w narożniku sali obok wielkiej zwierciadlanej ściany. Menu restauracji było jednocześnie formularzem zamówienia i zanim kelner zdążył przynieść wodę, Stallman szybko zakreślił odpowiednie kwadraciki. "Krewetki smażone na głębokim oleju w cieście z sera sojowego" - przeczytał. - "Ser sojowy ma taką interesującą fakturę. Myślę, że powinniśmy to zamówić". + +Ten komentarz był wstępem do podjętej in promptu rozmowy o kuchni chińskiej i niedawnej wizycie Stallmana w Chinach. "Jedzenie w Chinach jest wspaniałe" - rzekł głosem, w którym po raz pierwszy tego dnia wyczułem emocje. "Tyle różnych rzeczy, których nigdy nie widziałem w USA, miejscowe potrawy z lokalnych grzybów i lokalnych warzyw. Zacząłem nawet prowadzić dziennik posiłków, tylko po to, by nie tracić informacji o cudownościach, które mi podawano". + +Rozmowa przeszła na zagadnienia kuchni koreańskiej. Podczas tej samej azjatyckiej podróży w czerwcu 2000 r. Stallman odwiedził także Koreę Południową. Jego przybycie wywołało miniburzę w lokalnych mediach, a to z powodu ogólnokoreańskiej konferencji oprogramowania, w której w tym czasie brał udział założyciel i prezes zarządu Microsoftu, Bill Gates. Poza ujrzeniem swego zdjęcia bezpośrednio nad zdjęciem Billa Gatesa na pierwszej stronie seulskiej gazety, najlepszym wspomnieniem Stallmana z Korei była tamtejsza kuchnia. "Dostałem miskę naeng myun, czyli makaronu ryżowego. W różnych miejscach do przygotowania naeng myun używa się różnego makaronu ryżowego. Mogę z całą pewnością stwierdzić, że dostałem wówczas najwspanialsze naeng myun, jakie kiedykolwiek jadłem". + +Stallman często używa określenia "wspaniały". Byłem o tym przekonany po kilku minutach słuchania jego hymnu pochwalnego na temat naeng myun. Cały czas czułem jego laserowy wzrok wypalający znamię na moim prawym ramieniu. + +"Co za wspaniała kobieta siedzi za tobą" - usłyszałem. + +Obróciłem się, zerkając na plecy siedzącej tam niewiasty. Była młoda, około 25 lat, ubrana w białą sukienkę z cekinami. Ona i mężczyzna, który jej towarzyszył, właśnie płacili rachunek. Gdy wstali od stołu, by wyjść, nie musiałem nawet patrzeć, gdyż oczy Stallmana wprost przyćmiła intensywność przeżycia. + +"O nie" - powiedział. - "Wyszli i pewnie już nigdy jej nie zobaczę". + +Ale po krótkim westchnieniu powrócił do równowagi. Ta chwila dała mi szansę na skierowanie rozmowy na jego reputację osobnika będącego zaprzeczeniem uczciwego seksu. Była to nieco dyskusyjna opinia. Wielu hakerów wspominało o jego skłonności do całowania kobiet w rękę przy powitaniu16. Salon.com w artykule z 26 maja sportretował Stallmana jako hakerskiego uwodziciela. Dokumentując związek wolnego oprogramowania z wolnym seksem, reporterka Annalee Newitz pokazała Stallmana jako przeciwnika wszelkich tradycyjnych wartości rodzinnych i zwolennika miłości, ale nie monogamii17. + +Gdy poruszyłem ten temat, Stallman nieco odsunął menu. "Tak, większość mężczyzn wydaje się pożądać seksu i wydaje się mieć nieco pogardliwy stosunek do kobiet" - powiedział - "a kobiety zdają się to aprobować, czego zupełnie nie mogę zrozumieć". + +Przypomniałem fragment z wydanej w roku 1999 książki Open Sources, gdzie przyznał się, że feralne jądro GNU chciał nazwać imieniem swojej ówczesnej przyjaciółki. Imię brzmiało Alix i doskonale pasowało do przyjętej w środowisku Uniksa konwencji używania x na końcu nazwy nowego jądra, czego przykładem jest Linux. Ponieważ kobieta była administratorką Uniksa, byłoby to dla niej tym bardziej wzruszające. Niestety, w końcu główny twórca tego jądra nadał mu nazwę HURD18. Choć potem Stallman rozstał się z tą przyjaciółką, historia ta rodzi pytanie, czy zgodnie z opisem mediów jest fanatykiem o dzikim spojrzeniu, czy beznadziejnym romantykiem, wędrującym Don Kichotem walczącym z wiatrakami wielkich korporacji w nadziei zrobienia wrażenia na jeszcze nieokreślonej Dulcynei? + +"Nie próbowałem być romantyczny" - mówi, wspominając historię Alix. - "Była to raczej chęć podroczenia się. Było to romantyczne, lecz również nieco złośliwe. Rozumiesz? Mogłaby to być zachwycająca niespodzianka". + +Uśmiechnął się po raz pierwszy tego przedpołudnia. Podniosłem rękę, całując ją. "Tak, robię to" - potwierdził. - "Uznałem, że jest to sposób wyrażenia uczucia akceptowany przez wiele kobiet. Daje to szansę pokazania uczucia i uzyskania jego akceptacji". + +Uczucie jest nicią przewijającą się przez całe życie Richarda Stallmana i pytany o to jest szczery aż do bólu. "W przeciwieństwie do myśli, w moim rzeczywistości życiu nie było wiele uczucia" - mówi. Rozmowa staje się niezręczna. Po kilku następnych słowach Stallman znów podnosi do oczu menu, kończąc tym ten wątek. + +"A co powiesz na nieco shimai?" - pyta. + +Gdy przyniesiono potrawy, rozmowa zaczęła przeskakiwać z tematu na temat. Rozmawialiśmy o częstym wśród hakerów umiłowaniu chińskiej kuchni, cotygodniowych obiadach w bostońskiej chińskiej dzielnicy w czasach, gdy Stallman był programistą w AI Lab, oraz o wewnętrznej logice języka chińskiego i wynikającym z tego systemie zapisu. Każde moje stwierdzenie spotykało się z błyskotliwą odpowiedzią Stallmana. + +"Podczas ostatniego pobytu w Chinach słyszałem kilka osób mówiących w dialekcie szanghajskim." - powiedział. - Warto było posłuchać. Brzmiało to całkiem odmiennie (od mandaryńskiego). Musiałem ich poprosić, aby powiedzieli kilka słów w obu odmianach języka. Czasami widać podobieństwo, a interesowało mnie, czy dźwięki są podobne. Zwykle nie są. Interesuje mnie to, gdyż istnieje teoria, że wszystkie wmawiane słowa ewoluowały przez utratę dodatkowych sylab, gubionych i zastępowanych. Efektem jest brzmienie języka. Jeżeli to prawda, a widziałem prace, w których dowodzono, że proces ten odbywał się w czasach już historycznych, dialekty przed procesem tracenia sylab powinny mieć jeden wspólny rdzeń. + +Podano pierwsze danie, talerz smażonych na patelni naleśników z rzepy. Zamilkliśmy na chwilę, aby wykroić sobie po sporym prostokątnym kawałku, którego zapach przypominał gotowaną kapustę, lecz smak raczej placki ziemniaczane podsmażone na bekonie. + +Postanowiłem powrócić do rozmowy na zasadnicze tematy. Byłem ciekaw, czy jego życie nastolatka przygotowało go do podejmowania kontrowersyjnych poczynań. Myślałem głównie o jego trwającej od roku 1994 batalii o zastąpienie nazwy Linux przez GNU/Linux. + +"Wierzę, że to mi pomogło" - odparł, przeżuwając. - "Nigdy nie rozumiałem, co oznacza presja wywierana przez rówieśników. Myślę, że byłem na tyle odrzucony przez innych, że nie spodziewałem się niczego zyskać, postępując zgodnie z aktualną modą. Nic by mi to nie dało. Nadal pozostałbym tak samo na uboczu". + +Wskazał na swój gust muzyczny jako odbicie tendencji do pozostawania w opozycji. Gdy większość kolegów z ogólniaka słuchała Motown i rocka, on wolał muzykę klasyczną. Pamięta, że w szkole średniej prowadziło to do zabawnych zdarzeń. W roku 1964 po występie Beatlesów w programie "Ed Sullivan Show"19 większość kolegów ruszyła do sklepów, wykupując ostatni album i single tego zespołu. Stallman zaś postanowił zbojkotować słynną czwórkę. + +"Lubiłem część przedbeatlesowej muzyki popularnej" - mówi Stallman, - "ale nie lubiłem Beatlesów. Zwłaszcza nie podobała mi się dzika reakcja ludzi na ich koncerty. Wszyscy zabiegali o ich występy, aby się przed nimi płaszczyć". + +Gdy bojkot Beatlesów pozostał niezauważony, poszukał innych metod, by wytknąć rówieśnikom mentalność stada. Przez chwilę zastanawiał się nad założeniem zespołu rockowego, którego zadaniem byłoby parodiowanie grupy z Liverpoolu. + +"Chciałem ten zespół nazwać Tokyo Rose and Japanese Beetles20". + +Ponieważ wiadomo, że lubi muzykę ludową różnych krajów, spytałem, czy równie podoba mu się Bob Dylan i inni wykonawcy muzyki ludowej z wczesnych lat sześćdziesiątych. Potrząsnął głową i powiedział: - "Lubiłem Petera, Paula i Mary. Przypominali mi wielki filk". + +Gdy spytałem, co znaczy "filk", wyjaśnił, że to popularna pieśń lub piosenka, w której liryka została zastąpiona przez parodię liryki. Taki proces przerabiania to "filking" i jest to popularne zajęcie hakerów i miłośników science fiction. Przykłady to "On Top of Spaghetti" - przeróbka "On Top of Old Smokey" oraz filmowy majstersztyk "Weirda" Ala Yankovica21 -"Yoda", wykonywana w stylu "Gwiezdnych wojen" przeróbka "Loli" zespołu The Kinks. + +Zapytał mnie, czy mam ochotę na wysłuchanie ludowego filku. Gdy tylko zdążyłem odpowiedzieć twierdząco, zaczął śpiewać niespodziewanie czystym głosem: + + How much wood a woodchuck chuck, + If a woodchuck could chuck wood? + How many ples could a polak lock, + If a polak could could lock poles? + How many knees could a negro grow, + If a negro could grow knees? + The answer, my dear, is stick it in your ear. + The answer is to stick it in your ear. + +Śpiew dobiegł końca i na ustach Stallmana pojawił się kolejny niemal dziecinny półuśmiech. Rozejrzałem się po stolikach dookoła. Azjatycka rodzina ciesząca się niedzielnym lunchem prawie nie zwróciła uwagi na brodacza w średnim wieku śpiewającego altem22. Po chwili wahania roześmiałem się również. + +"Czy masz ochotę na ostatniego cornballa23?" - spytał Stallman i zanim zdążyłem odpowiedzieć, schwycił pałeczkami inkrustowaną ziarnem kulkę. Unosząc ją dumnie, powiedział: "Jednak to ja będę tym, który to dostanie". + +Skończyliśmy jedzenie i rozmowa przybrała formę normalnego wywiadu. Stallman usadowił się w pozycji półleżącej z filiżanką herbaty w dłoniach. Wróciliśmy do sprawy Napstera i jej związków z ruchem wolnego oprogramowania. Spytałem, czy zasady wolnego oprogramowania powinny być rozciągnięte na podobne obszary, na przykład utwory muzyczne. + +"Przenoszenie rozwiązań z jednej dziedziny na inną jest błędem" - powiedział Stallman, odróżniając nagrania muzyczne od oprogramowaniu. - "Na każdy rodzaj pracy trzeba patrzeć inaczej i wyciągać odpowiednie wnioski". + +Mówiąc o prawach autorskich, wyróżnił trzy kategorie. Pierwsza to produkty "funkcjonalne", np. oprogramowanie, słowniki i książki. Druga obejmuje prace, które można uznać za oświadczenia lub opisy zdarzeń, np. prace i dokumenty historyczne. Wszelkie zmiany wprowadzane przez kolejnych czytelników mogłyby całkowicie zniweczyć cel tych prac i sens ich tworzenia. Wreszcie ostatnia kategoria to dzieła osobiste, np. dzienniki, wspomnienia i autobiografie. Modyfikowanie takich dokumentów oznaczałoby zmianę osobistych wspomnień lub punktów widzenia autorów, co Stallman uznał za etycznie niedopuszczalne. + +Tylko pierwsza z trzech wyliczonych kategorii daje użytkownikowi nieograniczone prawo wprowadzania zmian, zaś w kategorii drugiej i trzeciej zmiany mogą być wprowadzane jedynie za zgodą autora oryginału. Jednakże, twierdził uparcie, wolność kopiowania i niekomercyjnej redystrybucji powinna pozostać nienaruszona w przypadku wszystkich trzech wymienionych kategorii. Oznacza to danie użytkownikom internetu prawa do generowania setek kopii artykułów, obrazów, piosenek lub książek i rozsyłania ich pocztą elektroniczną. "Jest oczywiste, że prywatna, okazjonalna redystrybucja nie powinna być zabroniona, gdyż zakazywana jest jedynie w państwach policyjnych. Wtrącanie się między znajomych i przyjaciół to działanie aspołeczne. Napster przekonał mnie, że potrzebne jest także zezwolenie na niekomercyjną redystrybucję rozrywki. Po prostu dlatego, że jest to potrzebne tak wielu ludziom i tak wielu ludziom przynosi to pożytek". + +Gdy spytałem, czy sądy podzielą tak permisywną opinię, przerwał mi w pół zdania. + +"To źle postawione pytanie" - powiedział. - "Teraz zmieniłeś przedmiot rozważań, przechodząc od zagadnień etycznych do sposobu interpretacji przepisów prawa. A to są dwa zupełnie różne spojrzenia na tę samą kwestię. Bez sensu jest skakać z jednego pola na drugie. Sądy zwykle surowo interpretują istniejące przepisy prawa, gdyż taka interpretacja jest kupiona przez wydawców". + +Ten komentarz pozwala zajrzeć w głąb politycznej filozofii Stallmana: to, że legalna władza wspiera skłonność biznesu do traktowania praw autorskich oprogramowania tak samo jak prawa własności gruntu, nie oznacza, że użytkownicy komputerów mają się temu podporządkować. Wolność to sprawa etyki, a nie prawa. "Patrzę nie na to jakie jest istniejące prawo, ale jakie powinno być. Staram się naszkicować jego zarys. Myślę, jak prawo powinno działać. Uważam, że prawo zabraniające udostępnienia przyjacielowi kopii jest moralnym odpowiednikiem prawa Jima Crowa24. Trudno takie prawo darzyć szacunkiem". + +Przywołanie Jima Crowa rodzi kolejne pytanie. Jak dalece na Stallmana mają wpływ liderzy polityczni z przeszłości? Na podobieństwo ruchu praw obywatelskich z lat pięćdziesiątych i sześćdziesiątych również jego wysiłki kierowania zmianami społecznymi pozostają pod wpływem zawsze atrakcyjnych haseł wolności, sprawiedliwości i postępowania fair play. + +Stallman słuchał, dzieląc uwagę między wypowiadaną przeze mnie analogię i szczególnie splątany kosmyk włosów. Gdy dotarłem do porównania go do doktora Martina Luthera Kinga, przygryzł koniec kosmyka i przerwał mój wywód. + +"Nie jestem z tej drużyny, ale gram w tę samą grę" - powiedział, żując. + +Zaproponowałem Malcoma X25 jako inny punkt odniesienia. Analogicznie do byłego rzecznika Nation of Islam26 Stallman zdobył sobie opinię osoby kontrowersyjnej, odgradzającej się od potencjalnych sojuszników i wynoszącej samowystarczalność ponad integrację kulturową. + +Przeżuwając koniec innego kosmyka długich włosów, odrzucił i to porównanie. "Moje przesłanie jest bliższe temu, co głosił Martin Luther King" - powiedział. "Jest to przesłanie uniwersalne głoszące potępienie pewnych praktyk znęcania się nad innymi. Nie głoszę nienawiści do nikogo i nie zwracam się do żadnej wybranej, wąskiej grupy. Wzywam wszystkich do docenienia wolności i jej zachowania". + +Jednakże skłonność do podejrzliwego traktowania wszelkich politycznych aliansów jest fundamentalną cechą jego charakteru. Można zrozumieć jego niechęć do terminu "otwarty kod źródłowy" (ang. open source) i do udziału w ostatnich projektach koalicyjnych. Przez dwie dekady wbijał ludziom do głowy ideę wolnego oprogramowania i to określenie jest jego kapitałem politycznym. Niemniej jego komentarze w rodzaju dowcipu o Hanie Solo na LinuxWorld w roku 1999 jedynie umacniają w przemyśle oprogramowania jego opinię rozczarowanego odludka odcinającego się od politycznych i gospodarczych trendów. + +"Lubię i szanuję Richarda za to, czego dokonał" - mówi Robert Young, prezes zarządu Red Hat, - "ale mam do niego żal za to, że często przyjaciół traktuje gorzej od wrogów". + +Jego niechęć do szukania sojuszników jest równie niezrozumiała, gdy rozważamy dziedziny zainteresowań politycznych niezwiązanych z ruchem wolnego oprogramowania. Krótka wizyta w jego biurze w MIT przywodzi na myśl biuro wymiany artykułów prasowych i komunikatów agencyjnych na temat gwałcenia praw ludzkich jak świat długi i szeroki. Na jego stronie internetowej znajdziemy diatryby na temat Digital Millenium Copyright Act27, wojny narkotykowej i Światowej Organizacji Handlu. + +Widząc jego skłonności działacza politycznego, spytałem, dlaczego nie stara się mówić donośniejszym głosem. Dlaczego swej pozycji w świecie hakerskim nie stara się wykorzystać jako platformy do rozszerzania swych wpływów, zamiast usuwać się w cień. + +Pozwolił opaść zmierzwionemu kosmykowi włosów i przed udzieleniem odpowiedzi zamyślił się na chwilę. + +"Obawiam się, by nie przesadzać z ważnością tego bajorka wolności" - powiada. - "Jest tak wiele dobrze znanych tradycyjnych obszarów walki o wolność i lepsze społeczeństwo i są one tak ważne, że nie mogę głosić, że sprawa wolnego oprogramowania jest równie ważna. To odpowiedzialność, która na mnie spadła i której staram się podołać. Sądzę, że mogę tu coś zrobić. Ale na przykład zwalczenie brutalności policji, zakończenie wojny narkotykowej, zniszczenie rasizmu i zapewnienie każdemu godziwego, wygodnego życia, zapewnienie prawa do aborcji, ochronienie nas przed teokracją - to działania strasznie ważne, o wiele ważniejsze od tego, co ja robię. Chciałbym wiedzieć, w jaki sposób mogę je wesprzeć". + +Po raz kolejny Stallman pokazał, że jego działalność polityczna wypływa z głębokiego osobistego przekonania. Wiele czasu zabrało mu stworzenie i rozwinięcie ruchu wolnego oprogramowania oraz dopracowanie szczegółów jego zasadniczych reguł. Dlatego waha się przed udziałem w każdym ruchu, który mógłby go wynieść poza znane granice na ziemię, której nie ma na żadnej mapie. + +"Chciałbym wiedzieć, w jaki sposób można rozwiązać te wielkie problemy. Byłbym z tego bardzo dumny, ale są to rzeczy tak trudne, że wielu lepszych ode mnie i pracujących nad tym od lat posunęło sprawy naprzód jedynie o kilka kroków lub wcale" - mówi. - "Ale gdy inni są zajęci wielkimi sprawami i walczą z wielkimi zagrożeniami, ja dostrzegłem jeszcze coś, co nam grozi, i występuję przeciwko tej groźbie. Być może nie jest to wielkie zagrożenie, ale ja jestem sam na polu walki". + +Żując koniuszek kosmyka, zaproponował zapłacenie rachunku. Zanim kelner zdołał zainkasować zapłatę i odejść, Stallman wyciągnął białawy banknot dolarowy i dorzucił go do kupki już leżących na stole. Z daleka było widać, że jest fałszywy. Nie mogłem się powstrzymać, by go nie obejrzeć. Zamiast portretu George'a Washingtona lub Abrahama Lincolna zobaczyłem rysunek świnki. Napis United States of America został zastąpiony przez United Swines of Avarice28. Na banknocie podano wartość zero dolarów. Gdy kelner zbierał banknoty, Stallman pociągnął go za rękaw. + +"Jako ekstranapiwek dodałem jedno zero" - oświadczył z półuśmiechem na ustach. + +Ogłupiały i nic nierozumiejący kelner zabrał banknoty ze stołu i z uśmiechem pośpiesznie się oddalił. + +"Myślę, że możemy już iść" - powiedział Stallman. + + +Rozdział 6. +Wspólnota Emacs + +W latach siedemdziesiątych AI Lab było miejscem ze wszech miar szczególnym. Specjaliści najwyższej klasy, pracujący nad projektami dotyczącymi najnowszych technologii, zapewniali mu znaczącą pozycję w świecie nauk komputerowych. Jednakże wewnętrzna kultura hakerska i towarzysząca jej anarchia prowadziły do buntowniczego mistycyzmu. Później, gdy większość naukowców i gwiazd programowania odeszło gdzie indziej, hakerzy mogli swobodnie urzeczywistnić efemeryczny świat, który wcześniej zasiedlili. + +W artykule opublikowanym w "Forbes" w roku 1998 przytoczono słowa Stallmana wspominającego laboratorium z tego okresu i panujący tam etos wzajemnego udostępniania sobie oprogramowania. Jak wspomina Stallman - "Przypominało to ogród rajski. Nawet nie przychodziło nam do głowy, że można ze sobą nie współpracować"1. + +To biblijne porównanie, choć może przesadzone, podkreśla bardzo istotny fakt. Dla wielu dziewięciopiętrowy budynek przy Tech Square 545 był czymś więcej niż tylko miejscem pracy. Dla hakerów w rodzaju Stallmana był domem. + +Słowo "dom" ma swoje szczególne miejsce w słowniku Stallmana. Z uwagi na krytyczny stosunek do rodziców Stallman wzbrania się nazwać domem jakiekolwiek miejsce pobytu aż do zamieszkania w harvardzkim internacie Currier House. Opuszczenie go opisuje w sposób tragikomiczny. Z lat spędzonych w Harvadzie żałuje jedynie wygnania z akademika. Dopiero pytanie o powód wcześniejszego opuszczenia internatu uświadamia mi, że otrzymam klasyczną odpowiedź w stallmanowskim stylu. + +"W Harvardzie prowadzili taką politykę, by pozbywać się tych, którzy zaliczyli zbyt wiele kursów". + +Nie mając miejsca w internacie i chęci do powrotu do Nowego Jorku, postąpił tak jak przed nim wielu innych hakerów, między innymi Greenblatt, Gosper i Sussman. Przyjęty do MIT na studia magisterskie2, wynajął mieszkanie w pobliżu Cambridge, by wkrótce przekonać się, że AI Lab jest jego faktycznym domem. Przemawiając w roku 1986, następująco opisał czas spędzony tamże: + + Mogłem pracować nieco więcej od innych, gdyż każdego roku z takich lub innych powodów przez kilka miesięcy nie miałem mieszkania i po kilka miesięcy spędzałem w laboratorium. Było tam zawsze bardzo wygodnie, a latem na dodatek chłodno. Ale nie było to nic niezwykłego i często można się było tam natknąć na śpiących, gdzie popadło. Siedziało się tam, dopóki można było hakować, i nie chcąc przerywać zajęcia, trwało przy komputerze aż do zupełnego opadnięcia z sił. Wtedy szukało się dowolnej płaskiej i miękkiej powierzchni, by się położyć i usnąć. Atmosfera była całkiem nieformalna3. + +Czasami domowa atmosfera w laboratorium sprawiała problemy. To, co dla jednych było wygodnym miejscem do przespania się, inni uważali za norę przepełnioną dymem "elektronicznego opium". W roku 1976 w książce Computer Power and Human Reason4 naukowiec z MIT, Joseph Weizenbaum, skrytykował komputerowych łapserdaków-pomyleńców (ang. computer bums5). W ten sposób Weizenbaum nazwał hakerów zasiedlających komputerowe pokoje w AI Lab. Pisał: "Ich zmięte ubrania, niegolone twarze oraz niemyte i nieczesane włosy świadczą o zatraceniu świadomości istnienia własnych ciał i świata, w którym te ciała funkcjonują. Istnieją tylko po to, by korzystać z komputerów i komputerom służyć"6. + +Niemal ćwierć wieku po opublikowaniu tej opinii Stallman nadal jeży się na jej wspomnienie. Podejmując polemikę, używa czasu teraźniejszego, jak gdyby Weizenbaum stał w pobliżu, w tym samym pokoju. "On chce, by ludzie byli tylko zawodowcami, pracującymi wyłącznie dla pieniędzy i zapominającymi o tym, co robią, tak szybko, jak to tylko możliwe - mówi. - To, co on uważa za normalny bieg rzeczy, ja uważam za tragedię". + +Jednakże życie hakera nie było wolne od takich tragedii. Stallman ocenia swoje przeistoczenie się z weekendowego hakera w naturalizowanego "mieszkańca" AI Lab jako zbieg bolesnych niepowodzeń, których przetrwanie ułatwiała mu jedynie euforia działalności hakerskiej. Pierwszym niepowodzeniem było ukończenie studiów na Harvardzie. Chcąc dalej studiować fizykę, zapisał się na studia magisterskie na MIT. Wybór uczelni był oczywisty i naturalny. Dawał mu szansę pójścia w ślady wielkich poprzedników, absolwentów tej uczelni: Wiliama Shockeya (1936)7, Richarda P. Feynmanna (1939)8 i Murraya Gel-Manna (1951)9 oraz o dwie mile skracał odległość do AI Lab i nowego komputera PDP-10. "Moje zainteresowania coraz bardziej biegły ku programowaniu, ale przez pewien czas myślałem, że dam radę zajmować się i jednym, i drugim" - wspomina. + +Trudząc się nad zdobyciem stopnia naukowego w dzień, a w nocy programując w AI Lab, pracował jak mnich, który przez narzucenie sobie ścisłej dyscypliny dąży do idealnej równowagi. Punktem podparcia dźwigni utrzymującej tę równowagę był taniec ludowy. Raz na tydzień uczestniczył w występach grupy tanecznej, co dawało mu odrobinę rozrywki i kontaktu z płcią odmienną. Jednakże pod koniec pierwszego roku na MIT zdarzyło się nieszczęście. Uszkodzenie kolana zmusiło go do porzucenia grupy tanecznej. Z początku wydawało mu się, że to nic wielkiego, że z czasem minie, i nawet więcej wolnego czasu niż poprzednio poświęcał tańczeniu, ograniczając nieco pracę w AI Lab. Jednakże z końcem lata, gdy ból kolana nie ustępował, a zajęcia miały się ponownie rozpocząć, zaczął się niepokoić. "Z kolanem nie było ani ciut lepiej - wspomina, - co oznaczało, że muszę skończyć z tańczeniem. Byłem załamany". + +Bez mieszkania i bez tańczenia jego życie towarzyskie skurczyło się, właściwie zanikło. Poczuł, że jego zdolność interakcji z niehakerami, a zwłaszcza z niehakerami płci żeńskiej uległa znacznej atrofii. Po 16 tygodniach w AI Lab wyparowała z niego cała pewność siebie, którą zdążył zmagazynować przez cztery lata w Harvardzie. + +"Czułem, że utraciłem całą energię - wspomina. Nie chciało mi się robić niczego, co nie było w danej chwili potrzebne. Energia potrzebna do zrobienia czegoś więcej zniknęła. Ogarnęła mnie czarna rozpacz". + +Zatopiony bez reszty w pracy w AI Lab, wycofał się zupełnie ze świata. Przed październikiem 1975 porzucił MIT i nigdy tam nie powrócił. Hakerstwo, niegdyś jedynie hobby, stało się jego powołaniem. + +Patrząc wstecz, uważa, że jego przeistoczenie się ze studenta studiów dziennych w pełnoetatowego hakera było nieuniknione. Prędzej czy później głos przeznaczenia skłoniłby go do tej decyzji, tłumiąc zainteresowanie innymi zawodowymi poczynaniami. "Do fizyki i matematyki nigdy nie wniósłbym nic poważnego - wspomina swoje wysiłki z czasów przed uszkodzeniem kolana. - Mógłbym być nawet dumny, że coś tam zrobiłem w jednej lub drugiej dziedzinie, ale właściwie nie wiedziałem, do czego to ma prowadzić. Nie wiedziałem, od czego mam zacząć. W przypadku oprogramowania widziałem, co powinienem robić i jak działać, by napisać coś, co działa i jest pożyteczne. Przynosiło mi to satysfakcję popychającą do dalszego działania." + +Stallman nie był pierwszym, dla którego hakerstwo było przyjemnością. Wielu hakerów z AI Lab chlubiło się tym samym i również przerwało studia. Większość miała jakieś stopnie naukowe z matematyki lub inżynierii elektrycznej, które z trudem zdobyła, podporządkowując się wymogom akademickiej kariery i zawodowych ambicji. Przyszli do AI Lab dla czystej przyjemności rozwiązywania problemów, którymi jeszcze nikt się nie zajmował. Na podobieństwo świętego Tomasza z Akwinu, którego długie i intensywne rozważania teologiczne prowadziły do wizji nadprzyrodzonych, hakerzy osiągali wewnętrzne stany transcendentalne przez bardzo silne skupienie myśli i wyczerpanie fizyczne. Choć Stallman, jak inni hakerzy, unikał narkotyków, lubił "haj", który nadchodził pod koniec 20-godzinnego programowania w transie. + +Ale najwięcej radosnych emocji niosło uczucie samorealizacji. Hakerstwo było dla Stallmana rzeczą naturalną. Przyzwyczajony od dziecka do długiego nocnego ślęczenia nad książkami, bez trudu znosił wielogodzinną pracę prawie bez snu. Będąc społecznym wyrzutkiem już w wieku 10 lat, nie miał kłopotów z pracą w samotności. Jako matematyk z wrodzoną zdolnością logicznego myślenia i przewidywania posiadł doskonałą umiejętność rozwiązywania problemów, w których grzęzły myśli innych hakerów. + +"Był niezwykły - wspomina Gerald Sussman, wykładowca w MIT, niegdyś prowadzący badania w AI Lab. - Myślał jasno i jasno przedstawiał zamierzenia". To właśnie Sussman zatrudnił Stallmana na stanowisku asystenta naukowego w roku 1975. Projekt był złożony i AI Lab miało przygotować program analizujący diagramy obwodów. Wymagał nie tylko doskonałej znajomości poleceń Lispu, języka zbudowanego specjalnie dla potrzeb AI Lab, lecz również rozumienia i przewidywania, w jaki sposób różni ludzie mogą podchodzić do tego samego zagadnienia. + +Jeżeli praca przy wykonywaniu oficjalnych projektów, w rodzaju programu Sussmana do automatycznego analizowania obwodów, pozostawiała nieco wolnego czasu, zajmował się programowaniem dla przyjemności. Hakerską ambicją było ulepszanie oprogramowania wykorzystywanego w AI Lab, a największym zrobionym dla przyjemności projektem Stallmana był używany w tym czasie w laboratorium program edycyjny TECO. + +Historia jego pracy nad TECO w roku 1970 jest nierozerwalnie związana z późniejszym przywództwem ruchu wolnego oprogramowania. Był to historyczny etap komputerowej ewolucji, więc trzeba go omówić, choćby w zarysie. W latach pięćdziesiątych i sześćdziesiątych, gdy komputery zaczęły pojawiać się na uniwersytetach, programowanie było działaniem niezwykle abstrakcyjnym. Aby skomunikować się z maszyną, programista przygotowywał plik kart dziurkowanych, z których każda reprezentowała jakieś polecenie. Potem przygotowany plik oddawało się administratorowi centralnego systemu, który według kolejności umieszczał go w czytniku maszyny. W odpowiedzi komputer wypluwał nowy plik kart dziurkowanych, które programista musiał potem odcyfrować. Taki sposób działania, nazywany "procesem wsadowym", był niewygodny i czasochłonny. Był także denerwujący ze względów ambicjonalnych. Jedną z przyczyn wrodzonej hakerskiej awersji do centralizacji była władza dzierżona przez administratorów systemu, którzy decydowali o kolejności wykonywania jobów10. + +W roku 1962 naukowcy i hakerzy z MIT rozpoczęli realizację mającego zaradzić tej frustracji, projektu MAC11, z którego potem wyrosło AI Lab. Dzielenie czasu, z początku nazywane "kradzieżą czasu", pozwoliło wielu programistom jednocześnie korzystać z możliwości operacyjnych komputera. Interfejsy dalekopisowe pozwoliły na komunikowanie się z komputerem przez wpisywanie zwykłego tekstu, zamiast karmienia go stosem dziurkowanych kart. Programista mógł teraz wpisywać kolejne wiersze poleceń i odczytywać odpowiedzi generowane przez maszynę. + +W późnych latach sześćdziesiątych projektowanie interfejsów znacznie się rozwinęło. W słynnym wykładzie z roku 1968 Doug Engelbart, naukowiec ze Stanford Research Institute12, pokazał prototyp nowoczesnego interfejsu graficznego. Łącząc kablem telewizor z komputerem i przyczepiając dodatkowe narzędzie wskazujące, które nazwał myszą, stworzył system nawet bardziej interaktywny od opracowanego w MIT systemu dzielenia czasu. Traktując ekran wyświetlający jako rodzaj szybkiej drukarki, system Engelbarta pozwalał użytkownikowi na przesuwanie kursora po ekranie i uaktualnianie jego pozycji przez komputer w czasie rzeczywistym. + +Takie innowacje potrzebowały kolejnych dwóch dekad, by przeniknąć na rynek. W latach siedemdziesiątych rozpoczął się proces zastępowania dalekopisów przez terminale wyposażone w monitory, co dawało potencjalne możliwości korzystania wyświetlania obrazu na całym ekranie zamiast dotychczas stosowanej edycji linia po linii. + +Jednym z pierwszych programów, który korzystał z możliwości pełnoekranowego wyświetlania informacji, był TECO stworzony przez AI Lab w MIT. TECO (skrót od Text Editor and Corrector) był dokonaną przez hakerów adaptacją programu dalekopisowego działającego w systemie linia po linii na PDP-6. + +TECO stanowił istotny postęp w stosunku do edytorów starego typu, lecz nadal nie był wolny od wielu ich wad. Aby stworzyć i edytować dokument, programista musiał napisać szereg poleceń definiujących każdą zmianę edycyjną. Był to proces abstrakcyjny. W przeciwieństwie do współczesnych edytorów, uaktualniających tekst po każdym uderzeniu klawisza, aby coś zmienić, należało wpisać rozszerzony ciąg poleceń edytujących zakończonych dodatkowym ciągiem znaków oznaczającym "koniec polecenia". Z upływem czasu hakerzy nabrali wystarczającej wprawy, aby za pomocą tego narzędzia pisać całe dokumenty, ale Stallman przyznał później, że działanie to wymagało specjalnych uzdolnień i sprawności przypominających umiejętność gry w szachy z zawiązanymi oczami13. + +Aby ułatwić sobie pracę, hakerzy z AI Lab zbudowali system pozwalający na wyświetlanie tekstu w trybie "źródłowym" i "wynikowym" na dwóch częściach podzielonego ekranu. Innowacja była pożyteczna, ale kłopot sprawiało przełączanie się między trybami. + +W tym czasie TECO nie był jedynym pełnoekranowym monitorem. Podczas wizyty w Stanford Artificial Intelligence Lab14 w roku 1976 Stallman zobaczył edytor o nazwie E, którego cechą naturalną było uaktualnianie obrazu po każdym naciśnięciu klawisza. Zgodnie z nazewnictwem obowiązującym w roku 1970, był to jeden z pierwszych rudymentarnych edytorów typu WYSIWYG. Jest to skrót od "what you see is what you get15" i oznacza, że użytkownik może manipulować plikiem, przesuwając tekst do tyłu i do przodu, zupełnie inaczej niż w przypadku edytora, w którym wynik można zobaczyć dopiero na końcu16. + +Stallman był pod wrażeniem tego hakerskiego osiągnięcia i zastanawiał się, w jaki sposób po powrocie do MIT podobną funkcjonalność nadać TECO. Znalazł TECO wzbogacone o funkcję Ctrl-R napisaną przez Carla Mikkelsona i nazwaną tak od dwuklawiszowej kombinacji uruchamiającej, pozwalającej na przełączanie TECO z abstrakcyjnego trybu wykonywania poleceń w bardziej intuicyjny tryb reakcji na każde uderzenie klawisza. Stallman w subtelny ale znaczący sposób przekształcił tę funkcję. Umożliwił uruchamianie za pomocą kombinacji klawiszy innych poleceń tekstowych lub "makr". Trik Stallmana pozwalał na zapamiętanie raz napisanego polecenia i wielokrotne jego uruchamianie za pomocą kombinacji klawiszy. Rozwiązanie Mikkelsona podnosiło TECO na poziom WYSIWYG, a rozwiązanie Stallmana szło o jeden krok dalej, czyniąc z TECO programowalny edytor WYSIWYG. "To był przełom" - mówi Guy Steele, jeden z ówczesnych hakerów z AI Lab. + +Stallman pamięta, że wprowadzenie makr wywołało eksplozję następnych innowacji. "Każdy pisał własny zbiór ulepszonych poleceń edytora, dodając polecenia wykonania wszelkich czynności, które wydawały mu się potrzebne". Wspomina, że "ludzie puszczali je w obieg, by każdy mógł coś dodać lub ulepszyć, dzięki czemu polecenia te stawały się coraz potężniejsze i miały coraz większy zakres działania. Zbiór przedefiniowanych poleceń stawał się z wolna kolekcją programów tworzących cały system". + +Wprowadzenie makr okazało się bardzo przydatną innowacją. Tak wiele osób zaczęło wbudowywać makra do swych wersji TECO, że wkrótce w wyniku tej makromanii sam edytor stał się rzeczą mniejszej wagi. "Zaczęliśmy o nim myśleć raczej jak o języku programowania niż o edytorze" - mówi Stallman. Doświadczeni użytkownicy dla własnej przyjemności dopracowywali szczegóły i zgłaszali nowe pomysły. + +W dwa lata po tej eksplozji szybkość wprowadzania zmian zaczęła przynosić efekty uboczne. Skutkiem gwałtownego rozwoju było wiele zmian zwiększających wartość i funkcjonalność edytora, lecz także komplikujących go nadmiernie. "Mieliśmy do czynienia z efektem wieży Babel" - twierdzi Guy Steele. + +Jak twierdzi, groziło to zniszczeniem zamysłu leżącego u podstaw przedsięwzięcia. Zaprojektowany przez hakerów ITS17 ułatwiał dzielenie się wiedzą i wzajemne poprawianie tworzonych programów. Można było usiąść przy czyimś terminalu, otworzyć plik, nad którym pracował, i bezpośrednio w programie robić zmiany i komentarze. "Czasami, aby pokazać komuś, jak należy coś zaprogramować lub debuggować, najwygodniej było zrobić to bezpośrednio na jego terminalu" - tłumaczy Steele. + +Możliwość wprowadzania makr w drugim roku istnienia zaczęła przytłaczać edytor, czyniąc go nieprzydatnym. W swej gorliwości dodawania nowych cech pełnoekranowych hakerzy tak dalece przekształcali własne wersje TECO, że zasiadłszy do czyjegoś terminala trzeba było poświęcić około godziny na zorientowanie się, które makropolecenia do czego służą. + +Sfrustrowany Steele podjął się rozwiązania tego problemu. Zebrał razem cztery różne zbiory makr i zaczął kreślić schemat dokumentujący znaczenie najczęściej używanych makropoleceń. Przystępując do implementacji udokumentowanych cech, zainteresował przedsięwzięciem Stallmana. + +"Najpierw zaglądał mi przez ramię, pytając, co robię" - wspomina Steele. + +Dla Steele'a, spokojnego hakera, który rzadko bezpośrednio rozmawiał ze Stallmanem, wspomnienie tej rozmowy nadal jest żywe. Podglądanie przez ramię, co kto robi, było w AI Lab przyjętym zwyczajem. Stallman, główny opiekun TECO, uznał pracę Steele'a za interesującą i szybko przystąpił do jej skompletowania. + +"Jak już wielokrotnie mówiłem, wykonałem 0,001 procenta implementacji, a resztę wykonał Stallman" - wspomina Steele ze śmiechem. + +Nowa nazwa projektu, Emacs, była kurtuazyjnym gestem Stallmana, skrótem od ang. editing macros18, mającym przypominać ewolucyjny, transcendentny proces tworzenia makr w ciągu dwóch lat od eksplozji zainteresowania tym narzędziem. Było to również zapełnienie słownikowej luki, gdyż dotychczas nazwa żadnego programu pracującego w systemie ITS nie rozpoczynała się na literę "E". Wybierając Emacs, Stallman sądził, że pozwoli to na odwoływanie się do programu przez podawanie jedynie pierwszej litery nazwy. Po raz kolejny dała o sobie znać hakerska żądza maksymalnej efektywności. + +Rozwijając system standardowych makropoleceń, Stallman i Steele musieli wykonać polityczną akrobację na linie. Tworząc standardowy program, Stallman gwałcił fundamentalną hakerską zasadę "popieraj decentralizację". Musiał także wziąć w karby nieograniczoną dostępność czynienia wszelkich zmian, co było główną siłą napędową rozwoju TECO. + +"Z jednej strony staraliśmy się zbudować jednolity system poleceń, a z drugiej - nie zamykać drogi do wprowadzania innowacji, ponieważ programowalność była rzeczą bardzo ważną" - wspomina Stallman. + +Aby rozwiązać problem, Stallman, Steele i ich koledzy hakerzy David Moon i Dan Weinreib ograniczyli standaryzację jedynie do poleceń WYSIWYG, czyli sterujących sposobem wyświetlania tekstu na ekranie. Resztę wysiłku poświęcono na zachowanie tinkertoyowego19 stylu Emacsa, pozwalającego na rozszerzanie funkcjonalności programu. + +Przed Stallmanem stanął nowy trudny do rozwiązania problem: jeżeli użytkownicy będą dokonywać zmian, nie informując o tym innych, znów pojawi się efekt wieży Babel. Wracając do hakerskiej idei dzielenia się wszelkimi informacjami, umieścił w kodzie źródłowym oświadczenie określające zasady używania Emacsa. Każdy użytkownik mógł w programie dokonywać dowolnych zmian pod warunkiem udostępnienia reszcie społeczności wszystkich dokonanych rozszerzeń. Nazwał to "wspólnotą Emacs20". Tak jak TECO było czymś więcej niż edytorem, tak Emacs stał się czymś więcej niż programem. Dla Stallmana była to umowa społeczna. We wspomnieniu dokumentującym wczesną fazę projektu wyliczył zasady tego kontraktu. "EMACS był rozpowszechniany na podstawie zobowiązania do społecznego dzielenia się informacją, co oznaczało, że należało przesyłać informację o każdym wprowadzonym ulepszeniu, aby można je było włączyć do programu ku powszechnemu pożytkowi"21. + +Nie wszyscy akceptowali te warunki kontraktu. Gwałtowny rozwój trwał przez następną dekadę, co doprowadziło do powstania wielu emacsopodobnych programów o różnym stopniu zgodności z oryginałem. W kilku pochodzenie od stallmanowskiego oryginału zaznaczono w dowcipny sposób za pomocą nazw rekursywnych, np. Sine (Sine is not Emacs)22, Eine (Eine is not Emacs) i Zwei (Zwei was Eine initially)23. Jako przysięgły wyznawca hakerskiej etyki Stallman nie widział żadnego powodu, by za pomocą środków prawnych powstrzymywać to twórcze zamieszanie. Fakt, że niektórzy potrafią użyć czyjegoś programu, nieco go ulepszyć i udostępniać pod inną nazwą, uważał za zdumiewające nieprzestrzeganie dobrych obyczajów. + +Kolejny przykry incydent zakłócił rozwój hakerskiej społeczności. W roku 1979 Brian Reid zdecydował się na umieszczenie "bomby z opóźnionym zapłonem" w kodzie programu Scribe, umożliwiając firmie Unilogic ograniczanie dostępu do oprogramowania tym użytkownikom, którzy nie uiścili stosownej opłaty. Dla Stallmana była to złowieszcza zapowiedź przyszłych zdarzeń. "Uznał to za postępowanie w stylu nazistowskim, najgorsze, z jakim się spotkał" - wspomina Reid. Późniejsze zdobycie sławy współtwórcy internetowego Usenetu24 nie zmyło z Reida, przynajmniej w oczach Stallmana, hańby tamtej decyzji. "On twierdzi, że całe oprogramowanie powinno być wolne, a pomysł pobierania za nie opłaty jest zbrodnią przeciw ludzkości"25. + +Choć Stallman był bezsilny wobec prowadzonej przez Reida sprzedaży, udało mu się jednak ukrócić inne poczynania sprzeczne z hakerskim etosem. Jako główny depozytariusz kodu źródłowego wspólnoty Emacs zaczął politycznie wykorzystywać płynące stąd możliwości. Na ostatnich etapach konfliktu z administracją Laboratory for Computer Science w sprawie zabezpieczenia dostępu do systemu przez wprowadzenie haseł rozpoczął strajk polegający na odmowie przesyłania tym osobom najnowszych wersji Emacsa do czasu, aż zrezygnują z wprowadzenia zabezpieczeń. Ruch ten tylko trochę przyczynił się do utrwalenia jego reputacji ekstremisty, ale dał istotny efekt pośredni: wzniecił w społeczności dyskusję o podstawowych wartościach hakerskiej etyki. + +"Wiele osób wściekało się na mnie, twierdząc, że jestem do nich wrogo nastawiony lub że ich szantażuję, co w pewnym sensie było prawdą - Stallman opowiadał później Stevenowi Levy'emu. - Działałem przeciw nim siłą, ponieważ uważałem, że to, co robią, jest gwałtem zadawanym każdemu z nas26". + +Z upływem czasu Emacs stał się probierzem hakerskiej etyki. Zapewniona przez Stallmana elastyczność tego oprogramowania zachęcała do współpracy, nawet jej żądała. Użytkownicy, którzy nie nadążali za rozwojem Emacsa lub nie zgłaszali Stallmanowi wprowadzonych przez siebie poprawek, ryzykowali pominięcie przy informowaniu o kolejnym przełomie. A informacji przełomowych było dużo. Dwadzieścia lat później użytkownicy zmodyfikowali Emacsa na tak wiele sposobów, że bywa używany jako arkusz kalkulacyjny, kalkulator, baza danych i przeglądarka internetowa. To tylko fragment istnego potopu różnych zastosowań, świadczący o wielkiej wszechstronności tego oprogramowania. "To właśnie było naszym celem - twierdzi Stallman. - Wszystko, co zostało w tym zawarte, jest jednocześnie cudowne i straszne". + +Ocena innych ówczesnych współpracowników Stallmana z AI Lab jest znacznie łaskawsza. Hal Abelson, który jako student przed dyplomem współpracował ze Stallmanem w latach siedemdziesiątych, a potem wspierał go jako członek zarządu Fundacji Wolnego Oprogramowania, opisuje Emacs jako "twór błyskotliwy i doskonały". Twierdzi, że Stallman, dając możliwość dodawania własnych bibliotek i narzędzi bez wprowadzania bałaganu w ogólnej konstrukcji systemu, wytyczył drogę dalszego rozwoju projektów programistycznych opartych na prowadzonej na wielką skalę współpracy. "Jego struktura była wystarczająco krzepka, by wytrzymać ciężar luźnej współpracy ludzi z całego świata, wnoszących własne pomysły - powiada Abelson. - Nie sądzę, aby ktoś wcześniej dokonał czegoś podobnego"27. + +Guy Steele w podobny sposób wyraża uznanie. Obecny pracownik naukowy Sun Microsystems, pamięta Stallmana przede wszystkim jako "błyskotliwego programistę zdolnego do produkowanie olbrzymiej objętości bezbłędnych kodów". Choć ich osobowości niezbyt do siebie pasowały, współpracowali wystarczająco długo, by Steele wyrobił sobie zdanie o stallmanowskim intensywnym stylu programowania. Wspomina znaczący epizod z końca lat siedemdziesiątych, gdy postanowili wspólnie napisać funkcję "pięknego drukowania". Ta wymyślona przez Steele'a funkcja, uruchamiana za pomocą skrótu klawiszowego, powodowała przeformatowanie kodu źródłowego Emacsa, tak że stawał się czytelniejszy i zajmował mniej miejsca, co było rozszerzeniem możliwości WYSIWYG edytora. Była to funkcja o znaczeniu na tyle ważnym, by przyciągnąć uwagę Stallmana i wkrótce po napisaniu przez Steele'a wersji pierwotnej obaj postanowili zasiąść razem, by napisać wersję poprawioną. + +"Zaczęliśmy pracę pewnego ranka - wspomina Steele. - Ja przy klawiaturze, a on obok mnie. Ustąpił mi miejsca przy klawiaturze, ale koniecznie chciał dyktować, co mam pisać." + +Sesja trwała 10 godzin. Przez cały czas, jak twierdzi Steele, żaden z nich nie oderwał się od pracy ani na moment. Pod koniec "hak" był gotowy i nie przekraczał 100 linii kodu. "Przez cały czas moje palce były na klawiaturze - wspomina Steele, - ale wydawało się, że pomysły nas obu sprawnie spływały na ekran. On mówił, co mam pisać, a ja pisałem". + +To, jak długo trwała ta sesja, Steele uświadomił sobie dopiero, gdy w końcu opuścił AI Lab. Stając przed budynkiem na Tech Square 545 ze zdumieniem zobaczył, że otaczają go nocne ciemności. Był przyzwyczajony do programistycznych maratonów, ale w tej sesji było coś niezwykłego. Praca ze Stallmanem zmusiła go do odcięcia się od wszystkich bodźców zewnętrznych i skupienia całej mentalnej energii na wykonywanym zadaniu. Patrząc wstecz, uważa, że Stallman stapiał w jedno myśli swoje i partnera, napawając go jednocześnie radością i przerażeniem. "Gdy to się skończyło, pomyślałem, że choć było to wspaniałe doświadczenie, nie chciałbym go przeżywać ponownie." + + +Rozdział 7. +Trudny wybór moralny + +27 września 1983 roku programiści logujący się do usenetowej1 grupy net.unix-wizards natykali się na niezwykły komunikat. Wysłany tuż po północy, a ściślej o 00:30, sygnowany przez rms@mit-oz, w wierszu tematu zawierał zwięzłą lecz przyciągającą uwagę informację: "New UNIX implementation" (nowa implementacja Uniksa). Jednakże nie było to wprowadzenie do nowej wersji Uniksa - otwierający wiadomość akapit zawierał komunikat: + + Poczynając od Thanksgiving2, zamierzam rozpocząć pisanie pełnego, zgodnego z Uniksem systemu operacyjnego GNU (od Gnu's Not Unix), by udostępnić go wszystkim chętnym za darmo. Pilnie potrzebne jest wsparcie w postaci poświęconego czasu, pieniędzy, oprogramowania i sprzętu3. + +Dla doświadczonych twórców Uniksa brzmiało to jak mieszanina idealizmu i arogancji. Autor nie tylko przyrzekał zbudowanie od nowa w pełni funkcjonalnego systemu uniksowego, lecz również ulepszenie go w wielu miejscach. Zgodnie z zapowiedzią autora, nowy system GNU miał zawierać wszystkie zwyczajowe elementy - edytor tekstowy, program powłoki umożliwiający uruchamianie zgodnych z Uniksem aplikacji, kompilator i "parę innych rzeczy". Dodatkowo miał być wyposażony w kilka pożądanych elementów, których inne systemy uniksowe jeszcze wówczas nie oferowały: graficzny interfejs użytkownika, zaprogramowany w języku Lisp, odporny na załamania system plików i protokół sieciowy zbudowany zgodnie z wewnętrznym systemem sieciowym MIT. + +"GNU będzie pozwalał na uruchamianie programów uniksowych, ale nie będzie identyczny z Uniksem - pisał autor. - Na podstawie naszych doświadczeń z innymi systemami operacyjnymi dokonamy wszystkich przydatnych poprawek." + +Przewidując sceptycyzm części adresatów komunikatu, autor obok opisu systemu operacyjnego umieścił własną notę biograficzną zatytułowaną "Kim jestem?" + + Nazywam się Richard Stallman i jestem pomysłodawcą oryginalnego i często imitowanego edytora EMACS. Obecnie pracuję w Laboratorium Sztucznej Inteligencji w MIT. Brałem aktywny udział w pracach nad kompilatorami, edytorami, debuggerami, interpretatorami poleceń, a także systemem ITS (ang. Incompatible Timesharing System4) oraz systemem operacyjnym maszyn LISP5. Byłem jednym z pionierów tworzenia, niezależnych od terminali programów obsługi wyświetlania informacji w systemie ITS, a także wykonałem implementacje odpornego na załamania systemu plików oraz dwóch systemów okienkowych na maszynach lispowych. + +Jak było do przewidzenia, podana przez Stallmana nazbyt optymistyczna data rozpoczęcia projektu GNU nie została dotrzymana. Jednakże do stycznia 1984 roku Stallman rzeczywiście zaczął wypełniać daną obietnicę i stał się osobą znaczącą w środowisku twórców oprogramowania dla systemów uniksowych. Dla architekta oprogramowania, który wyrósł na systemie ITS, było to jak projektowanie sklepiku przez projektanta pałaców mauretańskich. Pomimo to budowanie systemu operacyjnego podobnego do Uniksa przynosiło ukryte korzyści. ITS był systemem potężnym, lecz miał swoją piętą achillesową: hakerzy z MIT zaprojektowali go, wykorzystując wiele cech charakterystycznych dla budowanych przez firmę DEC6 komputerów PDP. Gdy na początku lat osiemdziesiątych zarządzający AI LAB zdecydowali o usunięciu potężnego komputera PDP-10, stworzony przez hakerów system operacyjny w jednej chwili stał reliktem minionej epoki. Unix przeciwnie, został zaprojektowany z myślą o znacznej mobilności, miał przed sobą perspektywę o wiele dłuższego życia. W wersji pierwotnej stworzony przez młodych naukowców z AT&T7, wymknął się spod firmowej kontroli i zadomowił na dobre w zawsze biednym świecie komputerowych sieci akademickich. Dysponujący mniejszymi środkami niż ich koledzy z MIT, twórcy Uniksa przystosowali system do używania na przeróżnym sprzęcie: od 16-bitowych PDP-11 używanych w AI Lab do wykonywania pomniejszych zadań, po duże 32-bitowe komputery typu mainframe8, jak VAX 11/780. Przed rokiem 1983 kilka firm, łącznie z zasłużoną Sun Microsystems, przymierzało się do stworzenia nowej generacji mikrokomputerów zwanych stacjami roboczymi, które miały wykorzystywać możliwości nowego coraz bardziej powszechnego systemu. + +Aby ułatwić sobie zadanie, projektanci zasadniczej części Uniksa, nadający ogólny kierunek pracom, stworzyli między maszyną i systemem dodatkową abstrakcyjną warstwę. Hakerzy z AI Lab, tworząc system ITS maksymalnie wykorzystali możliwości sprzętu, zaś twórcy Uniksa zrezygnowali z przykrawania systemu operacyjnego do zasobów sprzętowych i wykorzystywania płynących stąd pożytków. Wszechstronność systemu przełożyli nad doraźne korzyści. Skupiając się bardziej na wprowadzeniu standardów i specyfikacji łączących różne elementy systemu niż na tworzeniu samych komponentów, stworzyli system, który mógł być szybko zmodyfikowany i dostosowany do "gustu" dowolnej maszyny. Jeżeli użytkownik miał kłopoty z jakąś częścią systemu, można ją było usunąć, naprawić albo wymienić na inną. Choć z tego powodu cierpiała estetyka systemu, zwiększało to jego elastyczność i opłacalność, gdyż łatwo było przystosować go do nowych wymagań9. + +Koniec ITS-a, wychuchanego i tak długo hołubionego przez hakerów z AI Lab, przyczynił się do podjęcia przez Stallmana decyzji o budowie nowego systemu GNU. Głęboko przeżył rozstanie z ITS-em. Po epizodzie z drukarką laserową Xeroksa był to kolejny dowód na to, że hakerska kultura AI Lab traci swą odporność na zewnętrzne działanie świata biznesu. + +Wraz z kodem tworzącym ITS zamarły korzenie, z których ten system wyrósł. W latach po zakończeniu wojny wietnamskiej znacznie zmniejszyły się wydatki na obronę, będące źródłem finansowania głównej części komputerowych prac badawczych. Desperacko poszukując nowych funduszy, laboratoria i uniwersytety zwróciły się do sektora prywatnego. W przypadku AI Lab pozyskanie prywatnych inwestorów nie było trudne. Gniazdo, w którym wykluło się wiele ambitnych powojennych projektów komputerowych, rychło stało się wylęgarnią nowych technologii. Zanim nastał rok 1980, wielu hakerów z AI Lab zaczęło dzielić czas między prace badawcze w instytucie i projekty komercyjne. + +To, co zdawało się dawać równe korzyści obu stronom, umożliwiając hakerom udział w najlepszych projektach i dostęp do najnowszych technologii, wkrótce okazało się diabelskim pomysłem. Im więcej czasu hakerzy poświęcali na awangardowe komercyjne projekty, tym mniej mogli go przeznaczać na utrzymanie wyrafinowanego oprogramowania samego AI Lab. Wkrótce firmy zaczęły bezpośrednio angażować hakerów, aby w pełni dysponować ich czasem i bez reszty skupić ich uwagę na interesujących je zagadnieniach. Z powodu zmniejszającej się liczby hakerów wszelkie zmiany i naprawy oprogramowania w laboratorium trwały coraz dłużej. Co gorsze, Stallman stwierdził, że nastąpiła zmiana pokoleniowa. Hakerzy, który dotychczas stanowili w AI Lab decydującą mniejszość, zaczęli się wykruszać, a liczba "profesorów i studentów nie pałających zbytnią miłością do PDP-10 pozostawała niezmieniona"10. + +Punktem przełomowym był rok 1982. Wtedy to administracja uczelni zdecydowała o wymianie PDP-10 na komputer nowej generacji. Firma Digital, dostawca PDP-10, zaprzestała produkcji komputerów z tej serii, ale zaoferowała potężny komputer mainframe o nazwie KL-10. Jednakże nowa maszyna wymagała poważnych przeróbek systemu ITS, gdyby hakerzy zdecydowali się na dalsze korzystanie z niego. Rzeczą straszną była utrata przez AI Lab intelektualnej masy krytycznej. Ubyło talentów programistycznych, a członkowie rady wydziału naciskali na zakup Twenexu, komercyjnego systemu operacyjnego stworzonego przez Digital. Nieliczni pozostali hakerzy musieli się dostosować. + +Rada wydziału orzekła, że "brak hakerów mogących utrzymać własny system może doprowadzić do nieszczęścia, więc koniecznie należy zakupić system komercyjny". Jak po latach wspomina Stallman, uznano, że "firma zapewni jego działanie". Potem okazało się, że nie mieli racji, ale było już za późno. + +Z początku hakerzy uznali Twenex za kolejny symbol autorytaryzmu, który aż się prosi o obalenie. Samo nazwanie systemu Twenexem było protestem przeciw niemu. Przez DEC nazywany oficjalnie TOPS-20, był następcą TOPS-10, komercyjnego systemu opracowanego dla komputerów PDP-10. Najpierw w firmie Bolt, Beranek & Newman11 powstała nowa, ulepszona wersja nazwana Tenex i na jej podstawie powstał TOPS-2012. "Temu systemowi było daleko do szczytów13, więc żadną miarą nie zamierzałem go tak nazywać, więc zdecydowałem wstawić "w" do nazwy Tenex i nazwać system Twenexem" - wspomina Stallman, który wymyślił nową nazwę. + +Maszyna, na której działał Twenex/TOPS-20, miała własne szydercze przezwisko: Oz, które wzięło się stąd, że jej terminale nie działały samodzielnie i każdy musiał być wsparty przez małe PDP-11. Jak podaje jedna z hakerskich legend, pewien haker, zobaczywszy po raz pierwszy to sprzężenie KL-10 z PDP-11, skojarzył informację wstępną wyświetlaną na ekranie z napuszonym oświadczeniem Czarnoksiężnika z Krainy Oz i zaczął nucić: "Jam jest wielki i potężny Oz. Nie zwracaj uwagi na małe PDP-11 ukryte za konsolą"14. + +Jeżeli hakerów rozbawiło pierwsze zetknięcie z KL-10, to miny im zrzedły po ujrzeniu systemu Twenex. Nie tylko wbudowano weń system zabezpieczeń, także wszystkie narzędzia i aplikacje zaprojektowano z myślą o zabezpieczeniach. Poprzednia zabawa w kotka i myszkę z hasłami wprowadzanymi przez Laboratorium Bezpieczeństwa Komputerowego teraz przekształciła się w totalną wojnę z systemem zarządzania. Administratorzy systemu argumentowali, że bez zabezpieczeń system Oz byłby narażony na częstsze załamania. Hakerzy twierdzili, że przed załamaniami systemu najlepiej można się zabezpieczyć przez gruntowne przejrzenie i poprawienie kodu. Niestety, liczba hakerów chętnych i zdolnych do wykonania tego zadania zmalała tak znacznie, że zwycięstwo administratorów stało się oczywiste. + +Zdobywając różnymi sposobami hasła i rozmyślnie doprowadzając do załamań systemu, by wśród szczątków poszukiwać dowodów, Stallman z powodzeniem udaremniał zapędy administratorów do przejęcia kontroli nad sprzętem. Po jednym udaremnionym coup d'etat wystosował ostrzeżenie do wszystkich pracowników AI Lab: + +"Została podjęta kolejna próba przejęcia władzy - pisał. - Na razie siły magnatów zostały pokonane". Aby ukryć swą tożsamość, ostrzeżenie podpisał "Radio wolny OZ". + +Niewielu to zmyliło. Do roku 1982 awersja Stallmana do haseł i tajności stała się powszechnie znana również poza AI Lab i ludzie z zewnątrz używali jego konta jako punktu wejścia do ARPANET-u, badawczej sieci komputerowej, która stała się fundamentem przyszłego Internetu. Jednym z takich "turystów" we wczesnych latach osiemdziesiątych był Don Hopkins, programista z Kalifornii. Uczył się on, czerpiąc obficie ze skarbnicy wiedzy, jaką był wychwalany system ITS, do którego można było wejść z zewnątrz, wpisując jako login inicjały RMS, a następnie te same trzy litery jako hasło. + +"Jestem dozgonnie wdzięczny MIT za to, że mogłem wraz z wieloma innymi korzystać za darmo z ich komputerów - mówi Hopkins. - Dla wielu ludzi miało to wielkie znaczenie." + +Była to tak zwana polityka "turystyczna" otwarcie tolerowana przez władze MIT w czasach systemu ITS15. Skończyła się, gdy Oz stał się głównym wejściem laboratorium do sieci ARPANET. Na początku Stallman nadal używał swego loginu również jako hasła, aby użytkownicy zewnętrzni mogli łatwo robić to samo. Jednakże z upływem czasu kruchość systemu Oz skłoniła administratorów systemu do zatamowania dostępu dla użytkowników z zewnątrz. Obawiano się, że przez czysty przypadek lub przez czyjąś złośliwość może dojść do pełnego załamania systemu. Gdy zażądano, by Stallman przestał podawać swoje hasło do publicznej wiadomości, on, powołując się na wyznawane przez siebie zasady etyczne, odmówił i zrezygnował z korzystania z komputera Oz. + +"Gdy hasła po raz pierwszy pojawiły się w AI Lab, nie zmieniłem zdania i nadal nie widziałem potrzeby ich stosowania - twierdził Stallman. - Ponieważ nie wierzę w konieczność chronienia zasobów komputera, nie mogłem wspierać wprowadzenia reżimu bezpieczeństwa". + +Jego odmowa dostosowania się do wymagań Oz była odzwierciedleniem, narastającego w ciągu lat osiemdziesiątych, napięcia między grupą hakerów i administracją AI Lab. Było to jednak niczym w porównaniu z konfliktem, który wybuchł wewnątrz samej społeczności hakerskiej. Jeszcze przed przybyciem KL-10 podzieliła się ona na dwa obozy. Pierwszy skupił się wokół firmy programistycznej Symbolics, Inc., drugi - wokół rywalizującej z nią Lisp Machines, Inc. (LMI). Obie firmy dążyły do wprowadzenia na rynek maszyny lispowej, narzędzia mającego służyć do pełnego wykorzystania pożytków płynących ze stosowania języka programowania Lisp. + +Stworzony przez Johna McCarthy'ego, pioniera badań nad sztuczną inteligencją, pracownika naukowego MIT w latach pięćdziesiątych, Lisp jest językiem programowania świetnie przystosowanym do wykonywania zadań wymagających skomplikowanego sortowania. Nazwa jest skrótem od LISt Processing16. Po odejściu McCarthy'ego do Stanford Artificial Intelligence Laboratory hakerzy z MIT dopracowali język, przekształcając go w lokalny dialekt MACLISP. "MAC" pochodziło od finansowanego przez DARPA17 projektu badawczego MAC18, z którego wyrosło AI Lab i Laboratory for Computer Science. Programiści z AI Lab pod kierownictwem arcyhakera Richarda Greenblatta, używając jedynie języka Lisp, zbudowali w latach siedemdziesiątych pełny system operacyjny, który nazwali Lisp Machine Operating System19. Do roku 1980 z projektu Lisp Machine powstały dwie firmy komercyjne: Symbolics kierowana przez Russela Noftskera, niegdyś administratora AI Lab, oraz Lisp Machines, Inc. z Greenblattem na czele. + +Oprogramowanie Lisp Machine zostało stworzone na zasadach hakerskich, co oznacza, że choć jego właścicielem pozostawało MIT, zgodnie z hakerskim obyczajem, mogło być swobodnie kopiowane. Taki system ograniczał korzyści rynkowe, które firmy miały nadzieję osiągnąć, uzyskując licencję od MIT i usiłując wprowadzić to oprogramowanie na rynek jako unikalne. Aby zarabiać, firmy dążyły do uzupełnienia systemu Lisp Machine dodatkowymi elementami, które mogły okazać się atrakcyjne dla użytkowników. Do tworzenia tych dodatków, powstających poza MIT, zatrudniały hakerów z AI Lab. + +Szczególnie agresywnie działała firma Symbolics. Do końca roku 1980 już 14 hakerów z AI Lab było tam zatrudnionych w roli konsultantów na części etatu, pracując nad rozwojem własnej wersji Lisp Machine. Reszta, za wyjątkiem Stallmana, wpierała LMI20. + +Z początku Stallman zaakceptował dążenie obu firm do komercjalizacji Lisp Machine, nawet gdyby miało to oznaczać więcej pracy dla niego. Obie firmy korzystały z licencji i kodu źródłowego Lisp Machine OS MIT i jego zadaniem było modyfikowanie tego kodu, aby dotrzymać kroku wszystkim zmianom wprowadzanym w firmach. Choć umowa Symbolics z MIT dawała mu prawo do przeglądania, ale nie do kopiowania kodu źródłowego, nadal "pożyczał" atrakcyjne wyimki na zasadzie "gentleman's agreement" i tradycyjnych zasad hakerskiego postępowania. + +Jednakże 16 marca 1982 roku - zapamiętał tę datę dokładnie, gdyż były to jego urodziny - zarząd Symbolics zerwał dżentelmeńską umowę. Był to ruch strategiczny. LMI, główny rywal na rynku maszyn lispowych, w znacznej mierze opierał działanie na kopii kodu źródłowego AI Lab Lisp Machine. Zamiast wspierać rywala, zarząd Symbolics zdecydował się na ściślejsze przestrzeganie zasad zapisanych w umowie. Jeżeli AI Lab chciało korzystać z osiągnięć Symbolics, powinno zainstalować system tej firmy i odciąć dostęp LMI do kodu źródłowego. + +Rozdrażniło to Stallmana jako osobę odpowiedzialną za uaktualnianie laboratoryjnego kodu Lisp Machine. Traktując to oświadczenie jako "ultimatum", zemścił się, odłączając mikrofalowe połączenie Symbolics z AI Lab. Przysiągł sobie nigdy nie dotykać kodu Symbolics i pozostać wierny współpracy z LMI. "Uważałem, że AI Lab jest tu krajem neutralnym, jak Belgia podczas I wojny światowej - twierdzi. - Jeżeli ktoś dokonuje inwazji na Belgię, jej rząd jest zmuszony ogłosić stan wojny z napastnikiem i sprzymierzyć się z Wielką Brytanią i Francją". + +Przebieg tej wojny "symbolicznej" ("Symbolics" War), trwającej w latach 1982-1983, zależy od źródła danych, czyli od tego, kto o niej opowiada. Gdy zarząd Symbolics zauważył, że zmiany wprowadzone przez jego firmę wciąż ukazują się w aktualizacjach AI Lab Lisp Machine, zdecydował się na zainstalowanie "szpiega" na terminalu Stallmana. Stallman twierdził, że wszystkie funkcje pisał od nowa, korzystając ze zgodnego z umową prawa przeglądania kodu i znosząc dodatkowe uciążliwości związane z koniecznością uczynienia kodu jak najmniej podobnym do oryginału. Zarząd Symbolics twierdził co innego i skierował zażalenie do administracji MIT. Zgodnie z wydaną w roku 1994 książką Harveya Newquista The Brain Makers: Genius, Ego, and Greed, and the Quest for Machines That Think21, administracja ostrzegła Stallmana, by "trzymał się z daleka" od projektu Lisp Machine22. Stallman twierdzi, że administracja go wsparła. "Niczym mnie nie straszono - mówi. - Robiłem zmiany jak dawniej. Aby się dodatkowo zabezpieczyć, przestałem czytać ich kod źródłowy. Czytałem tylko dokumentację i na jej podstawie wprowadzałem zmiany". + +Niezależnie od wyniku kłótnia utwierdziła Stallmana w jego postanowieniu. Bez kodu źródłowego uzupełniał braki systemu zgodnie z własnymi przekonaniami i smakiem oraz nakłonił innych w AI Lab do informowania go o wszelkich niedociągnięciach i błędach maszyny lispowej. Programistom z LMI zapewnił bezpośredni dostęp do wszystkich wprowadzanych zmian. "Zamierzałem ukarać Symbolics, nawet gdyby to miała być ostatnia rzecz, jaką zrobiłem" - twierdzi. + +To ważne stwierdzenie. Nie tylko rzuca światło na niepokorną naturę Stallmana, lecz również ujawnia poziom emocji, które towarzyszyły tej "wojnie". Zgodnie z inną historią opowiedzianą przez Newquista, Stallman był w pewnym momencie tak zirytowany, że wysłał e-mail: "Owinę się pasem z dynamitem i złożę wizytę w biurze Symbolics23". Choć Stallman twierdzi, że nie pamięta tego e-maila i że opowiadanie o nim jest jedynie zjadliwą złośliwością, przyznaje, że takie myśli krążyły mu po głowie. "Pamiętam fantastyczne pomysły zniszczenia siedziby Symbolics i legnięcia pod jej gruzami. Na szczęście moje życie było dla mnie ważniejsze"24. + +Jego rozpacz była wielka, gdyż jednocześnie obserwował zniszczenie tego, co uważał za "swój dom" - zwartej hakerskiej subkultury AI Lab. W e-mailowym wywiadzie udzielonym później Levy'emu ukazał siebie jako postać podobną do historycznego Ishi, ostatniego żyjącego członka Yahi, plemienia indiańskiego z północno-zachodniego wybrzeża Pacyfiku, które zostało wygubione podczas walk z Indianami w latach sześćdziesiątych i siedemdziesiątych XIX w. Ta analogia pozwalała opisywać jego przetrwanie w epickiej, niemal mitologicznej formie. W rzeczywistości był to jedynie przypisek do historii napięć powstających między nim i resztą hakerskiej społeczności AI Lab tuż przed rozłamem Symbolics-LMI. Wielu z jego kolegów widziało Symbolics nie jako złowieszczą siłę niszczącą, lecz raczej jako zbyt późno pojawiającą się alternatywną ofertę. Firma komercjalizująca Lisp Machine wygnała projektowanie oprogramowania z bezpiecznej izolacji, jaką było AI Lab, na otwarty komercyjny rynek, gdzie menadżerowie ustanawiali własne prawa. Niektórzy uważali Stallmana nie za bojownika trwającego na ważnym posterunku, lecz za przeżytek minionej epoki. + +Stallman nie wdaje się w dyskusje na temat alternatywnego widzenia tamtych zdarzeń. Jak twierdzi, była to kolejna, po postawieniu "ultimatum", przyczyna nasilająca jego wrogość do Symbolics. Wspomina, że jeszcze przed zatrudnieniem przez Symbolics większości hakerów z AI Lab ci, którzy później tam przeszli, unikali go. "Już mnie nie zapraszano do Chinatown - wspomina. - Zgodnie ze zwyczajem wprowadzonym przez Greenblatta, jeżeli ktoś wybierał się na obiad gdzieś na zewnątrz, puszczał o tym informację, szukając chętnych do towarzystwa. Gdzieś w latach 1980-1981 przestano mnie zapraszać. Nie tylko mnie nie zapraszano, lecz jak mi później ktoś opowiedział, na niego i innych wywierano nacisk, by kłamali i ukrywali przede mną, że inni wybierają się do restauracji". + +Czuł złość do hakerów zabawiających się tymi dziecinnymi postaciami ostracyzmu, zaś spór z Symbolics wywołał w nim wściekłość innego rodzaju, wściekłość tracącego dom na jego burzyciela. Gdy Symbolics wstrzymało wysyłanie zmian wprowadzanych w kodach, odpowiedział niemal ciągłym przesiadywaniem w AI Lab i tworzeniem kodów zmienianych funkcji od zera, jedynie na podstawie opisów. Jego frustracja zapewniła użytkownikom zewnętrznym Lisp Machine pełny otwarty dostęp do wszystkich zmian wprowadzanych przez Symbolics. + +Utrwaliło to także wewnątrz hakerskiej społeczności legendę Stallmana. Znany już z pracy nad Emacsem, teraz pokazał, że potrafi dotrzymać kroku całemu zespołowi programistów pracujących w Symbolics, a w grupie tej znajdowało się kilku hakerów o legendarnej sławie. Było to jedno z największych jednostkowych osiągnięć Wieku Informacji, a może innych wieków również. Steven Levy nazwał to "hakerskim majstersztykiem", a samego Stallaman określił jako "wirtualnego Johna Henry'ego". W swoich uwagach zapisał, że członkowie rywalizującej z nim grupy pracującej dla Symbolics, mogli mieć pretensję do swego byłego kompana, ale musieli czuć dla niego respekt. Levy cytuje Billa Gospera, hakera, który pracował dla Symbolics w oddziale w Palo Alto. Wypowiedź jest pełna podziwu dla pracy wykonywanej w tym czasie przez Stallmana: + + Gdy w tym, co zrobił Stallman, znajdowałem coś, co mogłem uznać za źle wykonane (a właściwie ktoś inny usilnie mnie przekonywał, że jest to źle wykonane), mogłem zawsze powiedzieć: "Poczekaj, on pracując po nocach, nie ma z kim tego omówić. Pracuje samotnie! To niemożliwe, aby taką pracę wykonywał jeden człowiek!"25 + +Dla Stallmana miesiące spędzone na dotrzymywaniu kroku zespołowi Symbolics są źródłem dumy i goryczy. Jako zdeklarowany liberał, którego ojciec walczył w II wojnie światowej, Stallman nie jest pacyfistą. Pod wieloma względami wojna z Symbolics stała się rytualnym przejściem tam, dokąd zmierzał od czasu przyłączenia się do grupy zespołu AI Lab przed dziesięcioma laty. Niestety, zbiegło się to z bolesnym rozpadem hakerskiej subkultury, która kształtowała jego naturę od wieku młodzieńczego. Pewnego dnia, gdy oderwał się od pisania kodu i przechodził przez biuro, natknął się na stojącą w kącie, już nieużywaną maszynę PDP-10. Było to dla niego traumatyczne przeżycie. Patrzenie na zamarłe lampki, które niegdyś błyskaniem informowały o stanie wewnętrznego oprogramowania, było dla niego przeżyciem podobnym do oglądania dobrze zakonserwowanych zwłok ukochanej osoby. + +"Widząc tę maszynę martwą, zacząłem płakać - wspomina. - Stojąca w kącie i przez wszystkich zapomniana, uświadomiła mi, jak dalece nasza społeczność została zniszczona". + +Miał niewiele okazji do narzekania. Lisp Machine, pomimo całej wrzawy i wściekłości, jakie wywołała, pomimo wysiłku, jakiego wymagało jej stworzenie, istniała jedynie gdzieś na skraju pola walki nowych rynkowych technologii. Niepowstrzymany bieg ku miniaturyzacji niósł nowe potężne mikroprocesory, a ich użycie stworzyło nowy świat sprzętu komputerowego i oprogramowania, który zaczął pochłaniać rozwiązania starszej generacji, jak rozrastająca się metropolia pochłania stare pustoszejące wioseczki rozsiane w jej okolicy. + +Na szczycie tej mikroprocesorowej fali napłynęły setki i tysiące nowych komercyjnych programów, z których każdy miał przypiętą metkę informującą o ograniczeniach licencyjnych uniemożliwiających hakerom przeglądanie, zmienianie i przekazywanie sobie kodów źródłowych. Na początku licencje były "grubo ciosane" i źle napisane, ale do roku 1983 zostały tak poprawione, że zaspokajały wymagania sądów i odstraszały potencjalnych intruzów. Oprogramowanie, które koncerny elektroniczne niegdyś uważały jedynie za dodatek do wytwarzanego przez nie kosztownego sprzętu, za dodatkową atrakcję, rodzaj deseru mającego przyciągnąć klientów, stało się teraz daniem głównym. Żądni nowych gier i funkcji użytkownicy wyzbyli się dawnego obyczaju analizowania przepisu po spożyciu posiłku. + +Nigdzie nie było to bardziej widoczne niż w dziedzinie systemów operacyjnych komputerów osobistych; Apple Computer i Commodore zarabiały miliony, sprzedając maszyny z wbudowanymi systemami operacyjnymi. Większość użytkowników nie protestowała, nie otrzymując przy zakupie plików z kodami źródłowymi, gdyż nie zdawała sobie sprawy z zasad hakerskiej kultury i niechęci tego środowiska do oprogramowania sprzedawanego wyłącznie w postaci binarnej. Niewielu anarchistycznych zwolenników hakerskiej etyki starało się ją upowszechniać w nowym rynkowym świecie, ale większość z tego zrezygnowała, gdyż rynek wynagradzał tych, którzy szybko pisali nowe programy i wykazywali zmysł handlowy nakazujący opatrywanie wyników pracy klauzulami ochrony praw autorskich. + +Prym w tej dziedzinie wiódł Bill Gates, o dwa lata młodszy od Stallmana absolwent Harvardu. Stallman, wysyłając swoje przesłanie do grupy dyskusyjnej net.unix-wizards, nie wiedział, że przed siedmiu laty Gates, wówczas początkujący przedsiębiorca i główny udziałowiec założonej w Albuquerque firmy programistycznej Micro-Soft, później zmienione na Microsoft, wystosował swoją własną odezwę do posiadaczy komputerów osobistych. Była to odpowiedź skierowana do użytkowników PC-tów kopiujących oprogramowanie tworzone przez Micro-Soft. List otwarty do hobbystów Gatesa odzierał ze złudzeń społeczny ruch twórców oprogramowania. + +"Kto w pocie czoła zechce wykonywać profesjonalną pracę za nic? - pytał Gates. - Jaki hobbysta poświęci trzy lata na programowanie, wynajdywanie błędów, tworzenie dokumentacji po to, by rezultat oddać innym za darmo?26" + +Niewielu hakerów z AI Lab czytało przesłanie Gatesa z 1976 roku, ale i bez tego byli świadomi odmiennego nastawienia do oprogramowania firm komercyjnych i nastawionych komercyjnie twórców oprogramowania. Dlaczego traktować oprogramowanie jako coś, co nic nie kosztuje, skoro rynek mówi inaczej? Lata siedemdziesiąte były wstępem do lat osiemdziesiątych i sprzedaż oprogramowania stawała się coraz częściej czymś więcej niż zwykłe odzyskiwanie poniesionych kosztów; zaczęła się przeradzać w manifest polityczny. W czasach, gdy administracja Reagana przystąpiła do demontażu federalnych regulacji prawnych i programów wsparcia finansowego - będących spadkiem jeszcze po czasach wielkiego kryzysu - część hakerów uznała wyzute z konkurencyjności zasady hakerskiej etyki za antyamerykańskie. W najlepszym razie zaczęto je traktować jako antykorporacyjny balast z epoki późnych lat sześćdziesiątych i lat siedemdziesiątych. Jak bankier z Wall Street, znajdujący w szafie z dwurzędowymi garniturami starą koszulę w ciapki i bez kołnierzyka, wstydliwie ukrytą wśród nowych koszul z kołnierzykami i francuskimi mankietami, tak wielu programistów z zakłopotaniem wspominało zasady hakerskiej etyki jako echo dawnej idealistycznej epoki. + +Dla człowieka, który przez całą dekadę lat sześćdziesiątych stanowił kłopotliwe wspomnienie lat pięćdziesiątych, nie miało znaczenia niedotrzymywanie kroku rówieśnikom. Jako programista przywykły do pracy na najlepszym sprzęcie i oprogramowaniu, stanął przed "trudnym wyborem moralnym": albo porzuci swoje ideowe zastrzeżenia dotyczące oprogramowania "własnościowego", jak on i jego koledzy-hakerzy określali wszelkie oprogramowanie opatrzone klauzulą prywatnych praw autorskich lub ograniczającą prawo kopiowania i modyfikowania kodu licencją końcowego użytkownika, albo poświęci się budowaniu alternatywnego systemu operacyjnego i oprogramowania użytkowego rozpowszechnianego bez ograniczających praw własności. Po ostatnich miesiącach bolesnych doświadczeń walki z Symbolics miał większą ochotę na drugie rozwiązanie. "Zakładam, że mógłbym w ogóle przestać zajmować się komputerami i pomimo braku zdolności w tym kierunku, zostać kelnerem. Może nie w modnej restauracji, ale gdzieś by mnie chyba zatrudnili." + +Zostanie kelnerem i porzucenie na stałe programowania, które przyniosło mu tyle przyjemności, mogło dla niego oznaczać rezygnację z wszelkiej aktywności. Patrząc wstecz na swe życie od czasu przeprowadzki do Cambridge, mógł łatwo rozpoznać długie okresy, w których pisanie programów było czystą przyjemnością. Zatem zamiast je porzucać postanowił zająć się nim jeszcze intensywniej. + +Jako ateista odrzucał takie pojęcia jak los, dharma27 i wezwanie Opatrzności do podjęcia zadania. Pomimo to nie sądził, aby decyzja odrzucenia oprogramowania z prawami własności i budowania systemu operacyjnego tylko w celu ułatwienia życia innym była czymś normalnym. To połączenie własnego uporu, zdolności przewidywania i mistrzostwa w pisaniu programów pchało go na ścieżką zbaczającą z głównej drogi, ścieżkę, której istnienia inni nawet nie zauważali. W roku 1999 w rozdziale książki Open Sources28, wyjaśniając motywy decyzji, powołuje się na słowa żydowskiego mędrca Hillela: + + Jeżeli nie istnieję dla samego siebie, któż istnieć będzie dla mnie? + Jeżeli istnieję tylko dla siebie, kimże jestem? + Jeżeli nie teraz, to kiedy?29 + + If I am not for myself, who will be for me? + If I am only for myself, what am I? + If not now, when?30 + +Przemawiając publicznie, unika odwołań religijnych i wyjaśnia swą decyzję w sposób bardziej pragmatyczny. "Spytałem siebie: w jaki sposób ja, twórca systemów operacyjnych, mogę poprawić sytuację? Po rozważaniu sprawy doszedłem do wniosku, że właśnie ktoś tworzący systemy operacyjne jest osobą najbardziej pożądaną do rozwiązania tego problemu". + +Gdy ostatecznie podjął decyzję, wszystko inne znalazło swe właściwe miejsce. Mógł powstrzymać się od korzystania z programów, które zmuszały go do kompromisów etycznych, i poświęcić życie tworzeniu oprogramowania, które miało ułatwić innym pójście w jego ślady. Przyrzekłszy, że stworzy ogólnodostępny system operacyjny lub, oczywiście w późnym wieku, "umrze pracując nad nim", w styczniu 1984 roku zrezygnował z pracy w MIT i przystąpił do tworzenia GNU. + +Rezygnacja pozbawiła go wsparcia MIT, ale wciąż miał wystarczającą liczbę przyjaciół w AI Lab, by zapewnić sobie wolny dostęp do pracowni uczelni. Mógł także liczyć na czasowe zatrudnienie w roli zewnętrznego konsultanta, co stanowiło wsparcie we wczesnym okresie projektu GNU. Rezygnacja z pracy w MIT zakończyła wszystkie dyskusje na temat konfliktu interesów i praw własności tworzonego oprogramowania. Człowiek, którego strach przed społeczną izolacją w okresie dorastania wciskał coraz głębiej w środowisko AI Lab, teraz postanowił odciąć się od niego murem. + +Przez kilka pierwszych miesięcy pracy odizolował się także od społeczności uniksowej, choć jego obwieszczenie wysłane do grupy net.unix-wizards wywołało sympatyczny odzew i kilku wolontariuszy zgłosiło chęć udziału w krucjacie już we wczesnym jej stadium. + +"Reakcja społeczności była dość jednolita - wspomina Rich Morin, w tym czasie lider grupy użytkowników Unixa. - Ludzie mówili: To wspaniały pomysł. Pokaż nam kod. Pokaż, że to można zrobić" + +Jako rasowy haker Stallman zaczął od poszukiwań istniejących programów i narzędzi, które nadawałyby się do przekształceniu w programy i narzędzia GNU. Na samym początku zwrócił uwagę na kompilator o nazwie VUCK, przekształcający programy napisane w języku C w kod czytelny dla maszyny. W tłumaczeniu z holenderskiego akronim nazwy oznaczał Free University Compiler Kit31. Pełen optymizmu zapytał autora programu, czy zestaw jest wolnym oprogramowaniem. Został poinformowany, że "Free University" oznacza Vrije Universiteit in Amsterdam, co bardzo go rozgoryczyło. + +"Odpowiedział szyderczo, że uniwersytet jest wolny, ale jego oprogramowanie nie - wspomina Stallman. - Tak więc zdecydowałem, że pierwszym programem, który napiszę dla projektu GNU, będzie wielojęzyczny i działający na wielu platformach kompilator". + +Ostatecznie znalazł kompilator języka Pastel napisany przez programistów z Lawrance Livermore National Lab. Zgodnie z jego ówczesną wiedzą, kompilator był oprogramowaniem wolnym i mógł być swobodnie kopiowany i modyfikowany. Niestety, miał jedną istotną wadę: każdy program w całości zapamiętywał w pamięci operacyjnej, zmniejszając obszar dostępny dla innych działań. To co dla wielkich komputerów mainframe było dopuszczalne, dla Uniksa stało się paraliżującą barierą, gdyż maszyny sterowane tym systemem były za małe i miały za małą pamięć do całościowej obsługi generowanych plików. Istotnym postępem było dobudowanie przez niego nakładki/interfejsu zgodnego z językiem C. Jednakże przed nadejściem lata zdecydował się na napisanie nowego kompilatora od podstaw. + +We wrześniu 1984 roku uznał napisanie kompilatora za zadanie do wykonania w najbliższym czasie i rozpoczął poszukiwania narzędzi niskiego poziomu. Zaczął także rozwijać wersję GNU Emacsa, programu, którego rozwój nadzorował przez dekadę. Była to decyzja strategiczna. Społeczność uniksowa używała w tym czasie dwóch edytorów; jednym był vi napisany przez Sun Microsystems wraz Billem Joyem, a drugim ed, stworzony przez pracującego dla Bell Labs naukowca Kena Thompsona (współtwórcę Uniksa). Oba były przydatne i popularne, ale żaden nie miał rozszerzalnej w nieskończoność natury Emacsa. Przygotowując Emacsa dla użytkowników Uniksa, Stallman miał doskonałą okazję do pokazania swej programistycznej biegłości. Była to także okazja przystosowania użytkowników Emacsa do stallmanowskiego sposobu myślenia. + +Patrząc wstecz, twierdzi że wówczas nie widział strategicznych aspektów swojej decyzji. "Chciałem mieć Emacsa i była po temu doskonała okazja" - powiada. + +Było to częściowo ponowne "odkrywanie Ameryki", przynajmniej tak to odczuwała jego hakerska wrażliwość. Pisząc uniksową wersję Emacsa, wkrótce wkroczył na ścieżkę, którą przed nim wydeptał James Gosling, student starszych lat w Cernegie Mellon, autor opartej na języku C wersji Emacsa, nazwanej GOSMACS. Wersja Goslinga zawierała interpreter korzystający z uproszczonej wersji języka Lisp, zwanej MOCKLISP. Zdecydowany na zbudowanie GNU Emacsa na podobnych lispowych podstawach, Stallman korzystał obficie z innowacji Goslinga. Gosling opatrzył GOSMACS-a klauzulą copyrightu i sprzedał prawa prywatnej firmie UniPress, ale Stallman cytował współtwórcę programu, który twierdził, że Gosling, jeszcze jako doktorant w Carnegie Mellon, zapewniał współpracowników, że ich praca pozostanie dostępna dla wszystkich. Jednakże UniPress, dowiedziawszy się o projekcie Stallmana, zaczął straszyć egzekwowaniem copyrightu. Stallman ponownie stanął przed koniecznością pisania wszystkiego od podstaw. + +Stosując inżynierię wstecz32, mógł na podstawie interpretatora Goslinga stworzyć w pełni funkcjonalny interpreter Lispu i ominąć sporny punkt używania interpretera Goslinga. Niemniej jednak rozjątrzył go bardzo sam pomysł sprzedaży przez twórców oprogramowania praw do niego. Podczas przemówienia w Szwedzkim Królewskim Instytucie Technologicznym w roku 1986 przytaczał zdarzenie z UniPressem jako jeszcze jeden przykład niebezpieczeństw dotyczących oprogramowania z ograniczonymi prawami własności. + +"Czasami myślę, że najlepszą rzeczą, jakiej mógłbym w życiu dokonać, byłoby zebranie w jeden stos całego oprogramowania z prywatnymi prawami własności i zawartymi tam tajemnicami handlowymi i rozdawanie kopii na rogu ulicy wszystkim chętnym. W ten sposób tajemnice przestałyby być tajemnicami - twierdzi. - Być może byłby to o wiele efektywniejszy sposób udostępnienia ludziom wolnego oprogramowania niż pisanie go od podstaw; ale wszyscy jesteśmy na to zbyt tchórzliwi". + +Pomimo stresu, jaki wywoływała, dysputa na temat innowacji Goslinga miała towarzyszyć Stallmanowi i ruchowi wolnego oprogramowania przez dłuższy czas. Zmusiła Stallmana do rozpoznania słabości społeczności Emacs i systemu wzajemnego zaufania, który zezwalał na powstawanie odgałęzień o problematycznej wartości. Skłoniła go także do wyraźniejszego sformułowania celów politycznych ruchu wolnego oprogramowania. Po udostępnieniu GNU Emacsa w roku 1995 wydał Manifest GNU (GNU Manifesto) będący rozszerzeniem oryginalnego przesłania z września 1983 roku. Włączył do dokumentu długi rozdział, w którym wyliczył argumenty przytaczane przez komercyjnych i akademickich programistów na usprawiedliwienie rozpowszechniania oprogramowania z prywatnymi prawami własności. Jeden argument: "Czyż programistom nie należy się nagroda za ich kreatywność" wywołał jego wściekłość spowodowaną ostatnim epizodem z goslingową wersją Emacsa: + +"Jeżeli cokolwiek wymaga nagrody, to tylko działanie dla dobra ogółu - odpowiadał. - Może nim być również kreatywność, ale tylko wtedy (sic!), gdy społeczeństwo może swobodnie korzystać z jej owoców. Jeżeli programiści żądają nagrody za tworzenie innowacyjnych programów, powinni też żądać nakładania kar za ograniczanie możliwości korzystania z rezultatów swej pracy"33. + +Pojawienie się GNU Emacs oznaczało, że projekt GNU ma wreszcie do pokazania jakiś kod. Towarzyszyły temu zwykłe trudności związane z przedsięwzięciem programistycznym. W miarę jak uniksowi twórcy zaczęli się interesować i zajmować nowym programem, zaczęły napływać pieniądze, podarunki i prośby o przesłanie taśm. Do zajmowania się biznesową stroną projektu GNU Stallman wciągnął kilku kolegów i stworzył Fundację Wolnego Oprogramowania (ang. Free Software Foundation - FSF), organizację pozarządową, której celem miało być wspieranie projektu i umożliwianie mu szybszego osiągania celów. Ze Stallmanem jako prezesem i grupą hakerów w roli członków zarządu fundacja stała się oficjalnym przedstawicielem projektu GNU. + +Robert Chassell, pracujący wówczas w Lisp Machines, Inc., w wyniku rozmowy ze Stallmanem podczas obiadu został jednym z pięciu członków zarządu. Został także skarbnikiem organizacji, która to rola, z początku niewielka, zaczęła szybko nabierać większego znaczenia. + +Wspomina: "W roku 1985 nasze całkowite przychody i wydatki zamykały się w kwocie 23 000 dolarów. Richard miał swoje biuro, z którego my również korzystaliśmy. Wszystkie nasze dobra, a zwłaszcza taśmy upychałem pod biurkiem. Tak było do czasu, aż LMI użyczyło nam na kredyt pewnej przestrzeni do magazynowania tego, co posiadaliśmy, łącznie z taśmami." + +Fundacja Wolnego Oprogramowania poza rolą oficjalnego przedstawicielstwa projektu zaczęła również stanowić punkt przyciągający wszystkich rozczarowanych programistów. Rynek uniksowy, choć w początkowym okresie projektu GNU jeszcze dość otwarty, zaczynał się już stawać coraz bardziej konkurencyjny. Starając się zwiększyć uzależnienie klientów, firmy zaczynały ograniczać ich dostęp do kodów źródłowych, co z kolei przyspieszało liczbę poszukujących oprogramowania dostarczanego przez projekt GNU. Wielcy magowie Uniksa, którzy niegdyś uważali Stallmana za krzykliwego przygłupa, ogłosili go teraz programistyczną Kasandrą. + +"Wielu ludzi, póki im się to nie przytrafiło, nie uświadamiało sobie, jak frustrujące może być odebranie programu, nad którym się pracowało latami - mówi Chassell, podsumowując odczucia i opinie wielu piszących w ciągu lat do Fundacji Wolnego Oprogramowania. - Gdy się to stanie, zaczynasz mówić do siebie Zaraz, zaraz, poczekajcie". + +Do decyzji Chassella o udziale w ruchu wolnego oprogramowania przyczyniła się osobista strata. Przed zatrudnieniem się w LMI jako wynajęty pracownik napisał książkę wprowadzającą do Unixa dla Cadmus, Inc., firmy programistycznej z Cambridge. Gdy firma upadła, grzebiąc wraz z sobą prawa autorskie do książki, Chassell chciał te prawa odkupić, ale bez rezultatu. + +"Ta książka wciąż tkwi na jakiejś półce, bezużyteczna, niedostępna do skopiowania, pochłonięta przez system - mówi Chassell. - O ile jestem w stanie ocenić własną pracę, mogę powiedzieć, że jest to całkiem niezły wstęp. Przez jakieś trzy lub cztery miesiące można by było go przekształcić we wprowadzenie do dzisiejszego GNU/Linuksa. Całe zdobyte doświadczenie, oprócz tego, co pozostało w mojej pamięci, zostało stracone". + +Zmuszony do oglądania swej pracy ginącej bez śladu, gdy jego poprzedni pracodawca walczył ze zbliżającym się bankructwem, Chassell odczuł na własnej skórze, że wściekłość mogła doprowadzić Stallmana niemal do apopleksji. "Stało się dla mnie jasne, że jeżeli chcę przyzwoicie przeżyć życie, nie mogę pozwalać na przetrzymywanie żadnej jego cząstki w zamknięciu - mówi Chassell. - Rzecz w tym, by zachować wolność wprowadzania zmian i poprawek, gdy chcemy to robić. Daje to poczucie radości, że coś, co tworzyliśmy przez kilka lat życia, ma jakąś wartość. Bez tego mamy wrażenie, że coś zostało nam odebrane i wyrzucone, a przynajmniej, że nie mamy już z tym żadnego kontaktu. Jest to utrata cząstki życia". + + +Rozdział 8. +Św. IGNUcy + +Maui High Performance Computing Center1 mieści się w jednopiętrowym budynku na zapylonych czerwonawych wzgórzach nad miastem Kihei. Otoczone przez warte miliony dolarów krajobrazy i ekskluzywną posiadłość Silversword Golf Course2, centrum wygląda na ośrodek naukowy zbudowany tu jedynie w celu marnotrawienia pieniędzy. Dalekie od pudełkowej i sterylnej ciasnoty Tech Square, a nawet rozciągniętych szeroko naukowych metropolii Argonne3 w Illinois i Los Alamos4 w Nowym Meksyku - MHPCC wygląda jak miejsce, w którym naukowcy więcej czasu poświęcają na opalanie się niż na swoje postdoktoranckie projekty badawcze. + +Jest to prawdą tylko w połowie. Choć naukowcy z MHPCC rzeczywiście korzystają z możliwości rekreacji, pracę swą traktują poważnie. Według serwisu internetowego Top500.org śledzącego działanie najpotężniejszych superkomputerów na świecie, superkomputer IBM SP Power3, działający w MHPCC i wykonujący 837 miliardów operacji zmiennoprzecinkowych na sekundę, jest jednym z 25 najpotężniejszych komputerów na świecie. Jako wspólna własność University of Hawaii i U.S. Air Force dzieli swoje cykle pracy między rozgryzanie wojskowych problemów obliczeniowych sił lotniczych i wyliczenia związane z pracami badawczymi w dziedzinie fizyki wysokich energii. + +MHPCC jest miejscem, gdzie wysoka kultura badań naukowych i inżynierii w spokojnej równowadze współistnieje z kulturą wysp hawajskich. Slogan ze strony internetowej z roku 2000 określił to jako "Obliczenia komputerowe w raju". + +Nie jest to miejsce, w którym moglibyśmy spodziewać się znaleźć Richarda Stallmana, człowieka, który spoglądając przez biurowe okno na przepiękny Maui Channel, mruczał cierpko: "Za dużo słońca". Jednakże przybył tu jako emisariusz mający przekazać przesłanie z innego komputerowego raju, musiał więc pogodzić się z wystawieniem na tropikalne słońce swej bladej skóry hakera. + +Gdy przyjechałem tam, aby wysłuchać przemówienia Stallmana, sala konferencyjna już przed czasem była wypełniona. Podział audytorium według płci był nieco, choć niewiele, lepszy niż w Nowym Jorku: 85% mężczyzn i 15% kobiet, z czego około połowa ubrana w spodnie koloru khaki i koszulki z golfowym logo. Resztę stanowili miejscowi z twarzami w ciemnym kolorze ochry, odziani w krzykliwie kwieciste koszule, tak popularne w tej części świata. Jedynym resztkowym wskaźnikiem ich statusu komputerowców były gadżety: telefony komórkowe Nokia, Palm Piloty5 i laptopy Sony VAIO. + +Nie trzeba dodawać, że Stallman stojący przed słuchaczami w niebieskim, jednobarwnym T-shircie, luźnych, brązowych poliestrowych spodniach i białych skarpetkach, odróżniał się od nich jak kciuk od reszty palców. Fluorescencyjne światła sali konferencyjnej podkreślały niezdrowy kolor jego nieprzywykłej do słońca skóry. Jego broda i długie włosy wywołałyby krople potu na najchłodniejszym hawajskim karku. Nawet wytatułowanie sobie na czole napisu "mainlander6" nie wyróżniałoby go bardziej wśród zebranych. + +Gdy Stallman bezczynnie przechadzał się na przodzie sali, kilku słuchaczy, ubranych w T-shirty z logo Manui FreeBSD Users Group7 (MFUG), śpiesznie ustawiało kamerę i sprzęt audiowizualny. FreeBSD to wolne oprogramowanie będące odgałęzieniem Berkeley Software Distribution, poważanej w latach siedemdziesiątych akademickiej wersji Uniksa. Pod względem technicznym jest konkurentem systemu operacyjnego GNU/Linux. Nadal w hakerskim świecie wszystkie wystąpienia Stallmana są rejestrowane z zapałem archiwistów-amatorów Grateful Dead8. Członkowie MFUG kierującego lokalnym ruchem wolnego oprogramowania otrzymali zadanie utrwalenia wszystkich złotych okruchów mądrości RMS9 i przekazania ich braci programistycznej w Hamburgu, Bombaju i Nowosybirsku. + +Analogia z Grateful Dead jest właściwa. Często opisując poczynania biznesowe zgodne z modelem wolnego oprogramowania, Stallman podaje jako przykład Grateful Dead. Rezygnując z ograniczania możliwości nagrywania przez fanów koncertów na żywo, zespół ten stał się czymś więcej niż tylko grupą rockową. Stał się ośrodkiem odrębnej społeczności, wspólnoty wyznawców jego muzyki. Z upływem czasu wspólnota ta stała się tak wielka i tak oddana, że grupa zaczęła unikać kontraktów nagraniowych i poświęciła się jedynie objazdom i koncertom na żywo. W czasie ostatniego turnee w roku 1994 za bilety zebrano sumę 52 milionów dolarów. + +Z tym sukcesem mogłoby się mierzyć kilka firm programistycznych, ale wspólnotowy aspekt społeczności wolnego oprogramowania spowodował, że w drugiej połowie lat dziewięćdziesiątych część z nich zaczęła przyznawać, że publikowanie kodu źródłowego może być dobrym pomysłem. Mając nadzieję na stworzenie rzeszy lojalnych użytkowników, takie firmy jak IBM, Sun Microsystems i Hewlett Packard zaczęły przestrzegać formy, jeżeli nie ducha, stallmanowskiego przesłania. Uznając GPL10 za Magna Carta11 technologii przemysłu informatycznego, redaktor kolumny programistycznej w ZDNet12, Evan Leibovitch, opisał rosnący wpływ GNU i uznał, że to coś więcej niż okresowy trend. "Ten ruch społeczny pozwala użytkownikom ponownie decydować o przyszłych poczynaniach - pisze Leibovitch. - Tak jak Magna Carta dała prawa poddanym brytyjskim, tak GPL wzmacnia prawa i wolność konsumentów za pomocą oprogramowania udostępnianego użytkownikom"13. + +Wspólnotowo-plemienny aspekt społeczności wolnego oprogramowania pomaga wyjaśnić, dlaczego 40 dziwaków programistów przybyło na konferencję, by posłuchać Stallmana, zamiast pracować nad swymi projektami z dziedziny fizyki lub surfować po sieci, tworząc znaczące raporty. + +Inaczej niż w trakcie przemówienia w Nowym Jorku, tym razem Stallman zaczął bez wstępu i bez przedstawienia się. Gdy członkowie FreeBSD wreszcie uporali się ze sprzętem, po prostu zrobił kilka kroków do przodu i zaczął mówić, tłumiąc inne głosy w sali. + +"W większości przypadków w rozważaniach, jakie prawa powinny rządzić używaniem oprogramowania, uczestniczą ludzie z firm programistycznych, którzy rozważają problem z dogodnego dla nich punktu widzenia - powiedział, rozpoczynając wystąpienie. - Rozmyślają, jakie zasady należy narzucić wszystkim, by płacili im masę pieniędzy. Dobry los pozwolił mi w latach siedemdziesiątych należeć do społeczności programistów, która wspólnie korzystała z oprogramowania i użyczała go innym. I dlatego zawsze spoglądam na to samo zagadnienie z innej strony i pytam: jaki rodzaj praw może umożliwić stworzenie dobrego społeczeństwa, dobrego dla ludzi, którzy je stanowią? Z tego powodu dochodzę do zupełnie innych odpowiedzi." + +Jak zawsze, przytoczył swą opowieść o drukarce laserowej, we właściwym momencie uzupełniając wypowiedź gestem wyciągniętej ręki wskazującej w tłum słuchaczy. Poświęcił także chwilę na wyjaśnienie nazwy GNU/Linux. + +"Niektórzy pytają mnie Po co tyle starań o zdobycie zaufania do tego systemu? Najważniejsze, że robota została zrobiona, a nie to, czy ludzie się o tym dowiedzą. Rada byłaby dobra, gdyby była prawdziwa, ale zadaniem nie było samo zbudowanie systemu, lecz jego rozpowszechnienie wśród użytkowników komputerów. Aby to było możliwe, musimy zrobić wszystko, aby wszelkie działania na komputerze można było wykonać za darmo, tzn. aby oprogramowanie było wolne.14 i 15" + +"Jest jeszcze wiele do zrobienia" - dodał. + +Dla niektórych słuchaczy były to informacje dobrze znane, dla innych trąciły wiedzą tajemną. Gdy jeden ze słuchaczy w koszulkach golfowych zaczął przysypiać, Stallman zamilkł i poprosił, by ktoś przebudził usypiającego. + +"Ktoś kiedyś powiedział, że mój głos jest tak kojący, że mógłbym zostać uzdrowicielem - powiedział, powodując krótki wybuch śmiechu. - Zgaduję, że oznacza to, iż mogę wam pomóc zapaść w błogi, dający odprężenie sen. Zapewne niektórzy z was tego potrzebują, więc nie powinienem wam w tym przeszkadzać. Jeżeli potrzeba wam snu, śpijcie". + +Wystąpienie skończyło się dyskusją na temat patentów oprogramowania, tematu o coraz większym znaczeniu dla obu stron: firm programistycznych i społeczności wolnego oprogramowania. Koncepcja patentów, wymyślona i napisana dla świata realnego, okazała się nieporęczna i niedostosowana do kruchego świata technologii informatycznych, tak jak nie pasowała do działalności Napstera. Różnica między ochroną programu za pomocą copyrightu i praw patentowych jest subtelna ale znacząca. W przypadku copyrightu twórca programu może ograniczać kopiowanie kodu źródłowego, ale nie powielanie idei i funkcji programu. Inny twórca oprogramowania, jeżeli nie ma ochoty na używanie programu zgodnie z narzuconymi warunkami, może dokonać inżynierii wstecznej, tzn. skopiować funkcjonalność, pisząc kod od nowa. Takie powielanie pomysłów jest powszechnie stosowane w przemyśle programistycznym, gdzie firmy izolują grupy zajmujące się inżynierią wsteczną, aby zabezpieczyć się przed oskarżeniami o szpiegostwo przemysłowe i nieuczciwe hokus-pokus. W żargonie informatycznym takie postępowanie jest określane jako clean room engineering16. + +Ochrona patentowa działa odmiennie. Według Biura Patentowego Stanów Zjednoczonych (U.S. Patent Office) firmy i osoby indywidualne mogą za pomocą patentów chronić innowacyjne algorytmy i zgłaszać swe skargi do publicznego rozpatrzenia. Teoretycznie pozwala to właścicielom patentów czerpać korzyści z udostępniania chronionej informacji, a ich prawa wyłączności obowiązują w okresie ograniczonym zwykle do 20 lat. Praktyczna wartość tej ochrony jest dość problematyczna, gdyż często działanie programu ujawnia tajemnicę pomysłu. W przeciwieństwie do copyrightu, patent umożliwia jego właścicielowi tamowanie niezależnego tworzenia oprogramowania opartego na tym samym pomyśle lub o takiej samej funkcjonalności. + +W przemyśle informatycznym, gdzie okres dwudziestoletni to cała rynkowa epoka, patenty mają znaczenie strategiczne. Tam gdzie takie firmy jak Microsoft i Apple niegdyś toczyły boje o copyright oraz "wygląd i odczucie" (ang. look and feel) różnych technologii, dzisiejsze firmy internetowe starają się otaczać patentowym płotem pojedyncze aplikacje i modele biznesowe, czego najlepszym przykładem jest próba Amazon.com, która w roku 2000 usiłowała opatentować proces dokonywania zakupu jednym kliknięciem (ang. one-click online shopping process). Jednakże dla większości firm patenty chroniące oprogramowanie są bronią defensywną, której użycie w licencjach wzajemnych, umowach "krzyżowych" itp. służy wyrównaniu sił i międzyfirmowemu odprężeniu, złagodzeniu wzajemnych napięć. Jednakże nadal w kilku istotnych przypadkach algorytmów komputerowego szyfrowania i tworzenia obrazów graficznych dostawcy oprogramowania z powodzeniem tłumią poczynania rywali. + +Według Stallmana, praktyka chronienia oprogramowania za pomocą patentów dramatycznie wzmaga potrzebę zwiększenia hakerskiej czujności i uwydatnia polityczne korzyści, jakie niesie istnienie konkurencyjnego wolnego oprogramowania. Wskazuje, że patenty programistyczne czynią niedostępnymi pewne regiony rynku i twierdzi, że dzięki konkurencyjnej wydajności i cenie wolne oprogramowanie, takie jak GNU/Linux i FreeBSD, zaczęło już zdobywać swoje miejsce, wypierając z rynku oprogramowanie z prywatnymi prawami własności. Niestety, wydajność i cena są dla ludzi ważniejsze niż podstawowa kwestia wolności użytkowników i twórców oprogramowania17. + +"To nie brak zdolności nie pozwala nam tworzyć lepszego oprogramowania - mówił Stallman. - Nie możemy tego robić, bo nie mamy do tego prawa. Ktoś zakazał nam działać dla dobra społeczeństwa. Co się dzieje, gdy użytkownicy odkrywają spowodowane tym luki w wolnym oprogramowaniu? Jeżeli z tego, co głosi ruch zwolenników oprogramowania open source utkwiła im w pamięci obietnica tworzenia programów wydajnych i godnych zaufania, powiedzą: Nie daliście takiego produktu, jaki obiecywaliście. Ten program nie jest tak funkcjonalny, ani tak niezawodny, jak obiecywaliście. Brak mu takiej to a takiej funkcji. Okłamaliście nas. Jeżeli natomiast zgadzają się z naszą opinią, że wolność jest wartością samą w sobie, powiedzą: Dlaczego ci ludzie ośmielają się pozbawiać nas tej funkcji programu? Dlaczego ośmielają się ograniczać naszą wolność? I dzięki takim odpowiedziom możemy wytrwać pod gradem ciosów wymierzanych przez odłamki eksplodującego pocisku z patentami". + +Tego rodzaju komentarze oczywiście powodują sporo zamieszania. Większość obrońców oprogramowania open source sprzeciwia się prawom patentowym jeszcze głośniej niż Stallman. Jednakże nikt nie podważa jego opinii, że adwokaci oprogramowania open source kładą nacisk głównie na korzyści utylitarne a nie polityczne. Zwykle, zamiast podkreślać polityczne znaczenie wolnego oprogramowania, mówią o integralności jego konstrukcji opartej na hakerskim modelu rozwoju. Cytując oceny równorzędnych programów, malują obraz GNU/Linuksa lub FreeBSD jako lepiej skonstruowanych, lepiej sprawdzonych i, co z tego wynika, dla przeciętnego użytkownika bardziej godnych zaufania. + +Nie oznacza to, że pojęcie "oprogramowanie open source" nie niesie żadnych politycznych implikacji. Termin ten przez jego adwokatów jest używany z dwóch powodów. Po pierwsze, eliminuje zamieszanie wokół słowa "wolny", które biznes interpretuje zwykle jako "o zerowych kosztach". Po drugie, pozwala firmom na rozpatrywanie zagadnienia wolnego oprogramowania raczej z technicznego niż etycznego punktu widzenia. Eric Raymond, jeden z twórców Open Source Initiative18 i doskonały haker, poparł używanie terminu "oprogramowanie open source" w eseju z roku 1999 "Zamknij się i pokaż im kod" (ang. Shut Up and Show Them the Code), gdzie efektywnie podsumował frustracje płynące z kroczenia polityczną drogą Stallmana. + + Retoryka RMS potrafi uwieść wielu z nas. My, hakerzy, jesteśmy skłonnymi do rozmyślań idealistami, do których łatwo trafiają takie słowa jak "zasada","wolność" i "prawa". Nawet jeżeli nie zgadzamy się ze szczegółami programu, chcemy, aby retoryka RMS odnosiła skutek, sądzimy, że powinna działać na ludzi, i dziwimy się, że w 95% nie odnosi skutku, gdyż trafia na myślących inaczej niż my.19 + +W wymienionych przez Raymonda 95% mieszczą menadżerowie biznesu, inwestorzy i niehakerscy użytkownicy komputerów, którzy z prostego porównania liczb odczytują tendencje rynkowe. Bez znalezienia drogi do przekonania tych ludzi hakerzy wraz ze swoją ideologią będą zawsze tkwić na marginesie społeczeństwa: + + RMS, naciskając na dyskutowanie o prawach użytkowników komputerów, wysyła do nas niebezpiecznie atrakcyjne zaproszenie do powtarzania starych błędów. Powinniśmy je odrzucić, nie dlatego że opiera się na złych zasadach, lecz dlatego, że język, którego używa w zastosowaniu do oprogramowania, nikogo prócz nas nie przekonuje. Wręcz przeciwnie - ludzi spoza naszej kultury wprawia w zakłopotanie i odpycha.20 + +Patrząc na Stallmana przedstawiającego osobiście swą polityczną wizję, trudno zauważyć cokolwiek wprawiającego w zakłopotanie lub odpychającego. Jego wygląd może się nie wydawać zachęcający, ale przesłanie jest logiczne. Jeżeli ktoś ze słuchaczy pyta, czy świadomie unikający zaznaczania praw własności twórcy wolnego oprogramowania nie tracą możliwości dotrzymywania kroku postępowi najnowszych technologii, odpowiada, używając określeń zgodnych z jego własną wizją. "Sądzę, że wolność jest ważniejsza od postępu technicznego - mówił w trakcie swojego wystąpienia na Hawajach. - Zawsze wybiorę wolny program mniej zaawansowany technicznie, a nie jego lepszy technicznie odpowiednik z zastrzeżonymi prawami własności, gdyż nie zamierzam porzucać mej wolności dla takiego drobiazgu. Zgodnie z zasadą, którą wyznaję, nie chcę korzystać z czegoś, czym nie mogę podzielić się z innymi". + +Tego rodzaju odpowiedzi podkreślają quasireligijną naturę jego przesłania. Jak żyd przestrzegający koszeru lub mormon niepijący alkoholu, Stallman swoją decyzję niekorzystania z oprogramowania z prywatnym prawem własności ubiera w szaty tradycji i osobistych wierzeń. Jako niosący nową programistyczną ewangelię unika narzucania swych wierzeń siłą, jednak słuchacze rzadko wychodzą z jego wykładów nie przekonani, gdzie leży prawda. + +Aby dotrzeć ze swym przesłaniem do słuchaczy, uzupełnił wykład rytualnym przerywnikiem. Z plastikowej torby wyciągnął czarną togę i nałożył ją na ramiona, z drugiej torby wyjął malowany żółtą odblaskową farbą dysk komputerowy i umieścił go sobie na głowie, co widownia przyjęła ze śmiechem. + +"Jestem święty Ignucy z Kościoła Emacs - powiedział, wznosząc prawą rękę w geście szyderczego błogosławieństwa. - Błogosławię twój komputer, moje dziecko". + +Stallman jako święty Ignucy. Zdjęcia Woutera van Oortmerssena + +Słuchacze wybuchnęli niepohamowanym śmiechem. Widownia klaskała, dysk na głowie Stallmana chwytał światło lamp świecących nad głową i pobłyskiwał, doskonale imitując aureolę. W jednej chwili przeistoczył się z niezręcznego haole21 w postać z rosyjskiej świętej ikony. + +"Emacs został napisany jako zwykły edytor tekstowy - mówił Stallman, tłumacząc swój strój. - Z czasem stał się sposobem na życie dla wielu i religią dla niektórych. Nazywamy tę religię Kościołem Emacs". + +Ten moment autoparodii rozweselił zebranych, trafiając również do tych wielu, którzy wcześniej stallmanowską formę programistycznego ascetyzmu zdawali się uważać za maskowany przebraniem fanatyzm religijny. Było to także głośne "zrzucenie drugiego buta"22. Nałożenie togi i aureoli było przyzwoleniem: "Dobrze, śmiejcie się ze mnie. Wiem, że wyglądam dziwacznie". + +A co się tyczy samej osoby świętego Ignucego, Stallman twierdzi, że pojawił się on w roku 1996, długo po powstaniu Emacsa i równie długo przed pojawieniem się terminu "oprogramowanie open source". Jego pojawienie się zostało przyspieszone dążeniem do objęcia przywództwa hakerskiej społeczności. Mówiąc w ten sposób "śmiejcie się ze mnie", chciał przekonać wszystkich, że on, uparty Stallman, nie jest fanatykiem, choć wielu stara się przedstawić go w ten sposób. Dodaje, że później inni starali się nadać temu zbyt wielkie znaczenie, by podkreślić jego rolę programistycznego ideologa, jak to zrobił Eric Raymond w wywiadzie z roku 1999 umieszczonym w serwisie internetowym linux.com: + + Gdy mówię, że RMS skaluje swoje poczynania, nie lekceważę go i nie oskarżam o nieszczerość. Stwierdzam jedynie, że jak każdy dobry "przekonywacz" stosuje teatralne gesty. Czasem robi to świadomie dla zwiększenia efektu - czyż nie widzieliście go, jak przebrany za świętego Ignucego z dyskową aureolą na głowie błogosławi oprogramowanie? Jednakże często czyni to nieświadomie; umie odpowiednio pobudzić słuchaczy, aby trzymać ich uwagę w napięciu, zwykle unikając szokowania23. + +Stallman analizę Raymonda kwituje stwierdzeniem: "To mój sposób śmiania się z samego siebie. Jeżeli inni widzą w tym coś więcej, jest to ich problem, a nie mój". + +Przyznaje się do szmiry. "Śmieszy was to? - zapytał w pewnym momencie. - Uwielbiam być w centrum zainteresowania". Jak mówi, aby sobie to ułatwić, zapisał się kiedyś do Toastmasters, organizacji pomagającej swoim członkom udoskonalać umiejętność publicznego występowania, i teraz wszystkim to poleca. Osiągnął umiejętności sceniczne, których mogą mu pozazdrościć profesjonalni aktorzy i wyczuwa związek swych wystąpień z wodewilami ostatnich lat. W kilka dni po przemówieniu Stallmana w Maui High Performance Computing Center, robiąc aluzję do wystąpienia na Linux World Expo 1999, spytałem go, czy ma kompleks Groucho Marxa, tzn. niechęć do należenia do wszelkich klubów, które chętnie widziałyby go jako swego członka. Odpowiedział natychmiast: "Nie, ale podziwiam Groucho Marxa i sądzę, że pod wieloma względami jestem inspirowany przez niego, a także przez Harpo24." + +Wpływ Groucho Marxa jest widoczny w jego zamiłowaniu do gier słownych, choć z drugiej strony jest to typowa cecha większości hakerów. Wpływ Groucha daje się zauważyć przede wszystkim w sposobie wypowiadania kalamburów. Mówi je z kamienną twarzą, jakby mimochodem, bez zdradzania emocji nawet przez uniesienie brwi lub wykrzywienie ust, co sprawia wrażenie, że on bardziej śmieje się z widowni, niż ona z niego. + +Ale wrażenie to szybko znika, gdy patrzymy na członków zespołu Maui High Performance Computer Center, śmiejących się z parodii świętego Ignucego. Bez żadnego szczególnego wysiłku potrafił skłonić do śmiechu salę pełną inżynierów. "Bycie świętym Kościoła Emacs nie wymaga celibatu, ale zmusza do życia w moralnej czystości - mówił do mauitańskiego audytorium. - Musicie egzorcyzmami wygnać diabelski system operacyjny z prawem własności i zainstalować na waszych komputerach całkowicie wolny i święty system GNU, a na nim instalować jedynie wolne oprogramowanie. Jeżeli złożycie takie śluby i będziecie żyć, nie łamiąc ich, zostaniecie świętymi Kościoła Emacs i aureola pojawi się wokół waszych głów. + +Skecz o świętym Ignucym zakończył dowcipem z podtekstem. W większości systemów uniksowych i spokrewnionych z Uniksem głównym konkurentem Emacsa jest vi, edytor tekstowy stworzony przez byłego studenta UC Berkeley25, a obecnego szefa działu badawczego Sun Microsystems, Billa Joya. Przed zdjęciem aureoli Stallman pokpiwał sobie z programu rywala. Mówił: "Ludzie czasami pytają mnie, czy grzechem wobec Kościoła Emacs jest używanie vi. Odpowiadam, że korzystanie z wolnej wersji vi to nie grzech, lecz pokuta. Szczęśliwego hakowania". + +Po krótkiej sesji zadawania pytań słuchacze zebrali się wokół Stallmana. Kilku poprosiło o autografy. "Podpiszę to - powiedział, trzymając podany przez jakąś kobietę wydruk Powszechnej Licencji Publicznej GNU26 - ale tylko wtedy, gdy przyrzekniesz mi, że będziesz używać prawidłowej nazwy GNU/Linux zamiast Linux i wszystkim swoim przyjaciołom nakażesz to samo". + +Ten komentarz jedynie potwierdza moje prywatne obserwacje. W przeciwieństwie do innych występujących na scenie oraz wielu polityków, Stallman nie ma "trybu prywatnego". Obok świętego Ignucego istnieje ideolog, taki sam na scenie, jak i poza nią. Tego samego wieczoru podczas rozmowy przy obiedzie, gdy jakiś programista wspomniał o swoim pozytywnym stosunku do oprogramowania open source, Stallman poprawił go: "Masz na myśli wolne oprogramowanie. Tak należy o nim mówić." + +Zadającym pytania po wystąpieniu Stallman przyznał się do zapędów pedagogicznych. "Wielu ludzi powiada: Najpierw zaproś do wstąpienia do społeczności, a potem nauczaj o wolności. Może to być rozsądna strategia, ale w praktyce wszyscy zapraszają do udziału w społeczności, ale gdy chętni już się pojawią, mało kto zajmuje się nauczaniem o wolności". + +Przypomina to nieco miasto z trzeciego świata. Ludzie tam ciągną z nadzieją wzbogacenia się lub przynajmniej uczestniczenia w otwartej, żywej kulturze, ale ci, którzy dzierżą władzę, wciąż stosują różne triki i strategie, np. patenty chroniące oprogramowanie, aby trzymać masy z dala. "Wiele milionów ludzi buduje miasta slamsów, ale nikt nie dba o postąpienie o krok naprzód, by ich z tych ruder wyciągnąć. Jeżeli pozytywnie oceniacie strategię wolnego oprogramowania, proszę, wykonajcie następny krok. Krok pierwszy wykonuje wielu. Potrzeba nam tych, którzy postąpią dalej." + +Wykonanie drugiego kroku, czyli niesienie do domów idei wolności, a nie tylko jej akceptacja, jest kamieniem węgielnym ruchu wolnego oprogramowania. Ci, którzy mają nadzieję na zreformowanie od środka przemysłu programistycznego opartego na zasadach własności, grzeszą głupotą. "Zmienianie systemu od środka jest ryzykowne - twierdził Stallman - i jeżeli nie działacie z pozycji Gorbaczowa, zostaniecie unicestwieni". + +Chętni do zadawania pytań podnosili ręce. Stallman zwrócił uwagę na kogoś w stroju klubu golfowego, kto pytał: "Więc jak bez patentów można walczyć ze szpiegostwem przemysłowym?" + +"Te dwie sprawy nie mają ze sobą nic wspólnego, naprawdę" - odpowiedział Stallman. + +"A jeżeli ktoś chce wykraść z innej firmy część oprogramowania?" + +Stallman wyglądał jak ktoś rażony piorunem. "Chwileczkę - powiedział. - Wykraść? Przepraszam, ale ta wypowiedź zawiera tak wielki ładunek przesądów, że mogę jedynie powiedzieć, że ich nie podzielam. Firmy, które tworzą "niewolne" oprogramowanie i inne rzeczy, skrywają wiele sekretów handlowych i nie wygląda na to, by tutaj mogło coś się zmienić. W latach osiemdziesiątych znaczna część programistów nawet nie miała pojęcia, czym jest patent chroniący oprogramowanie, więc nie przykładała do tego żadnej wagi. Ludzie publikowali interesujące idee i jeżeli nie należeli do ruchu wolnego oprogramowania, zachowywali w sekrecie niewielkie szczegóły. Teraz opatentowują te idee, a drobne szczegóły nadal zachowują w tajemnicy. Tak czy inaczej, patenty w opisywanej dziedzinie nic nie zmieniły." + +"Więc skoro nie wpłynęły na publikowanie..." - głos kolejnej osoby, która wtrąciła się do dyskusji, zamarł niemal na początku. + +"Ależ wpłynęły - odpowiedział Stallman. - Teraz publikacje informują was, że taki a taki pomysł jest odcięty od społeczeństwa na 20 lat. I co w tym, do diabła, widzicie dobrego? Poza tym opisują wszystko w możliwie najbardziej niejasny sposób, aby rozciągnąć patent możliwie najszerzej i w rezultacie czytanie dokumentacji traci sens, bo i tak nic nie można zrozumieć. Czytanie patentów przynosi jedynie złe informacje o zdarzeniach, z którymi walka jest daremna". + +Na sali zapadła cisza. Wystąpienie rozpoczęło się o 15:15, a była już niemal 17:00 i większość słuchaczy wierciła się na siedzeniach, niecierpliwie oczekując, by wreszcie zerwać się i uciec na weekend. Wyczuwając zmęczenie, Stallman rozejrzał się po sali i szybko zakończył. "Wygląda na to, że skończyliśmy - powiedział, po czym na wzór prowadzącego aukcję, zaczął odliczać - "Koniec po raz pierwszy, koniec po raz drugi, koniec po raz trzeci. Wykład zamknięty". W ten sposób dał słuchaczom możliwość zadania ewentualnych ostatnich pytań. Skoro już żadne ręce nie podniosły się do góry, zakończył tradycyjnym: + + Szczęśliwego hakowania. + + +Rozdział 9. +Powszechna Licencja Publiczna GNU1 + +Do wiosny 1985 r. Richard Stallman uporał się ze stworzeniem pierwszego kamienia milowego projektu GNU, czyli opartej na Lispie wolnej wersji Emacsa. Aby tego dokonać, musiał sprostać dwóm wyzwaniom. Po pierwsze - uniezależnić Emacs od platformy systemowej, a po drugie - w tym duchu odtworzyć społeczność Emacs. + +Dysputy z UniPressem wyciągnęły na światło dzienne wady kontraktu wewnętrznego społeczności Emacs. Tam, gdzie Emacs rozwijał się pod bezpośrednim nadzorem Stallmana, zasady umowy społecznej były dotrzymane, ale w działach rozwiniętych bez jego kierownictwa i ogólnego nadzoru, np. dotyczących wersji Uniksa sprzed roku 1984, poszczególne osoby i firmy miały swobodę ustanawiania własnych zasad. + +Napięcie między swobodą modyfikacji i swobodą narzucana przywilejów autorskich zrodziło się jeszcze przed GOSMACS-em. Copyright Act (Akt praw autorskich) z roku 1976 rozciągał na oprogramowanie prawa autorskie regulujące zasady kopiowania. Zgodnie z ustępem 102(b) tegoż aktu, osoby i firmy uzyskały możliwość chronienia prawem autorskim (copyright) samych programów, ale nie "procesów i metod w ten program wbudowanych"2. Inaczej mówiąc, programy zostały potraktowane tak samo jak opowiadania i piosenki. Inni programiści mogli czerpać inspirację z istniejących programów, ale aby je skopiować, musieli - i to nie żart - postarać się wcześniej o zgodę autora oryginału. Choć nowe prawo gwarantowało ochronę prawną również programom bez noty copyright, programiści szybko przystąpili do zaznaczenia swych praw przez dodawanie tej noty. + +Stallman od początku patrzył na to z przerażeniem. Rzadko się zdarza, by jakiś program nie zapożyczał części kodu od programów już istniejących, a tu jedno pociągnięcie prezydenckiego pióra i jedna uchwała Kongresu dały programistom i firmom programistycznym przewagę nad społecznie budowanymi programami. Ponadto był to silny zastrzyk formalizmu zaaplikowany światu, który dotychczas pozostawał wolny od biurokracji. Nawet jeżeli hakerzy byliby w stanie udowodnić, że kod jakiegoś przeklętego programu korzysta z działań realizowanych przez lata, taka batalia z posiadaczami praw własności przekraczała ich możliwości finansowe. Dawne dyskusje hakera z hakerem zostały teraz zastąpione przez negocjacje prawnika z prawnikiem. Z takiego systemu prawnego ciągnęły korzyści przede wszystkim firmy, a hakerzy nie mieli szans. + +Ci, którzy zaproponowali ochronę praw autorskich oprogramowania, wysuwali kontrargumenty: bez ochrony praw autorskich rezultaty pracy mogły się przedostawać do domeny publicznej. Ponadto nota copyright była gwarancją jakości. Programiści i firmy, umieszczając swe imię lub nazwę w nocie autorskiej, pracowali na swą reputację. Ostatecznie był to rodzaj kontraktu, jak również stwierdzenie prawa własności. Używając noty copyright jako elastycznej postaci licencji, autor mógł zrzec się części swych praw w zamian za określone zachowanie użytkownika. Autor mógł na przykład zezwolić na nieautoryzowane kopiowanie programu pod warunkiem, że nie będzie on wykorzystywany w celach komercyjnych. + +Ten ostatni argument nieco łagodził sprzeciw Stallmana wobec stosowania noty copyright. Patrząc wstecz na lata prowadzące do rozpoczęcia projektu GNU, przyznaje on, że zaczął rozumieć korzyści płynące ze stosowania noty copyright gdzieś na etapie wersji Emacs 15.0, ostatniej ważnej poprzedzającej powstanie GNU Emacs. Wspomina: "Widziałem e-maile z uproszczonymi notami copyrightu: Kopiowanie bez zmian dozwolone i to było inspirujące". + +Dla wersji Emacs 15.0 stworzył notę copyright dającą użytkownikom prawo sporządzania i upowszechniania kopii. Dał im również prawo tworzenia wersji zmodyfikowanych, ale bez możliwości przypisywania sobie wyłącznego autorstwa, jak to miało miejsce w przypadku GOSMACS. + +Licencja Emacs 15.0, choć pomocna przy kodyfikowaniu umowy wzajemnej społeczności Emacs, okazała się zbyt nieformalna, aby się nią posłużyć w projekcie GNU. Zaraz po rozpoczęciu pracy nad wersją GNU Emacs Stallman rozpoczął konsultację z innymi członkami Fundacji Wolnego Oprogramowania nad dopracowaniem języka licencji. Szukał także rady u prawników, którzy pomagali mu stworzyć Fundację. + +Mark Fisher, adwokat bostoński specjalizujący się w prawie własności intelektualnej, przypomina sobie z tego okresu dyskusje ze Stallmanem na temat postaci licencji. "Richard miał bardzo sprecyzowaną wizję, jak ta licencja ma wyglądać - wspomina. - Miała opierać się na dwóch podstawowych zasadach. Po pierwsze, licencja miała czynić oprogramowanie maksymalnie dostępnym (otwartym). Po drugie, miała zachęcać innych do stosowania tych samych praktyk licencyjnych." + +Zachęcanie innych do stosowania tego samego sposobu licencjonowania oprogramowania oznaczało ograniczenie powstawania nowych wersji Emacsa z zastrzeżonymi prawami własności. Aby ukrócić ten proceder, Stallman z grupą kolegów programistów, zwolenników wolnego oprogramowania ogłosili, że każdy użytkownik może do woli modyfikować GNU Emacsa dopóty, dopóki będzie publikował zmiany. Dodatkowo każda nowa, pochodna wersja musiała być opatrzona tą samą licencją GNU. + +Rewolucyjna natura tego ostatniego zastrzeżenia ujawniła się dopiero po pewnym czasie. Fischer wspomina, że wówczas patrzył na licencję GNU Emacs jak na zwykły dość prosty kontrakt. Dla towaru została określona cena. Jedyną różnicą było to, że zamiast pobierania opłaty pieniężnej Stallman zażądał od użytkowników udostępniania innym wszelkich wprowadzanych zmian. To, jak pamięta Fischer, odróżniało ten kontrakt od innych. + +"W tym czasie samo proszenie innych o zaakceptowanie proponowanej ceny było rzeczą unikalną" - twierdzi. + +Licencja GNU Emacs ostatecznie pojawiła się w roku 1985 wraz z samym programem GNU Emacs. Po ukazaniu się programu Stallman zwrócił się do hakerskiej społeczności o pomoc w ulepszeniu licencji. Rychło na apel odpowiedział John Gilmore, haker pracujący dla Sun Microsystems, który stał się potem aktywistą ruchu wolnego oprogramowania. Jako swój wkład Gilmore wniósł wersję Emacsa przystosowaną do SunOS, wewnątrz formowej wersji Uniksa. Podczas adaptacji wykonał dwie poprawki zgodnie z wymaganiami licencji. Uznał tę licencję nie za obciążenie, lecz za zwięzły opis hakerskiego etosu. "Wszystkie dotychczasowe licencje były bardzo nieformalne" - wspomina. + +Jako przykład braku formalizmu Gilmore cytuje notę copyrightu dla trn, programu narzędziowego Uniksa. Program ten, napisany przez Larry'ego Walla, późniejszego twórcę języka Perl, ułatwiał programistom uniksowym wprowadzanie do dużych kodów źródłowych poprawek, tzw. "patchów". Objaśniając przydatność tego programu, Wall w tekstowym pliku README dopisał: + +Copyright (c) 1985, Larry Wall +Możecie trn kopiować w całości albo po kawałku, +dopóki nie robicie na tym forsy lub nie udajecie, że +to wyście go napisali3. + +Takie stwierdzenia, będące doskonałym odbiciem hakerskiej etyki, jednocześnie ilustrowały trudności przetłumaczenia jej swobodnej postaci na sztywny, formalny język legalnego copyrightu. Pisząc licencję dla GNU Emacs, Stallman zrobił coś więcej niż proste zablokowanie możliwości wymykania się zmodyfikowanych wersji na rynek oprogramowania z prywatnymi prawami własności. Wyraził zasady hakerskiej etyki w języku zrozumiałym dla obu stron: hakerów i prawników. + +Nie upłynęło wiele czasu, nim inni hakerzy zaczęli rozmyślać nad "przyczepieniem" licencji GNU Emacs do swoich własnych programów. W odpowiedzi na wezwanie zgłoszone w usenetowej dyskusji Gilmore w listopadzie 1986 roku wysłał do Stallmana e-mail sugerujący wprowadzenie dwóch modyfikacji: + + W nazwie licencji mógłbyś chyba "EMACS" zastąpić przez "SOFTWARE" lub coś podobnego. Mam nadzieję, że wkrótce Emacs przestanie być największą częścią systemu GNU i licencja będzie obejmować wszystko.4 + +Nie tylko Gilmore proponował większą ogólnikowość licencji. Do końca roku 1986 Stallman osiągnął kolejny kamień milowy projektu GNU - debugger kodu źródłowego - i szukał sposobu zmodyfikowania licencji Emacs tak, aby objęła oba programy. Zdecydował się na usunięcie wszystkich sformułowań odnoszących się bezpośrednio do Emacsa i stworzenie ogólnej licencji, jednego ogólnego "parasola", który przykryje całe oprogramowanie projektu GNU. W ten sposób narodziła się Powszechna Licencja Publiczna GNU (GNU General Public License, czyli w skrócie GPL). + +Do oznaczania licencji przyjął powszechnie stosowaną konwencję numerowania wersji oprogramowania, zgodnie z którą pełne wersje oznacza się liczbami całkowitymi, zaś prototypowe za pomocą ułamków dziesiętnych. GPL w wersji 1.0 opublikował w roku 1989 (prace nad samym projektem trwały od roku 1985), czyli w rok po wypuszczeniu GNU Debuggera (drugiego wejścia w świat programowania uniksowego). Licencja zawierała preambułę wyrażającą intencje polityczne: + +Celem Powszechnej Licencji Publicznej GNU (GNU +General Public License, GPL) jest zagwarantowanie +użytkownikowi swobo dy udostępniania i sprzedawania +kopii wolnego oprogramowania, swobody otrzymywania +kodu źródłowego, jeżeli jest potrzebny, i swobody +zmieniania wolnego oprogramowania, a więc danie +pewności, iż oprogramowanie jest wolno dostępne dla +wszystkich użytkowników. +W celu ochrony praw użytkownika jesteśmy zmuszeni +wprowadzać ograniczenia zabraniające komukolwiek +kwestionowanie jego praw albo sugerowanie +rezygnacji z tych praw. Ograniczenia te sprowadzają +się do pewnych obowiązków w przypadku +rozpowszechniania przez Was kopii naszego +oprogramowania bądź dokonywania w nim zmian5 i 6. + +Przygotowując GPL, Stallman był zmuszony wprowadzić zmiany przystosowujące licencję do nieformalnych zasad obowiązujących wewnątrz społeczności Emacs. Poprzednie żądanie publikowania wszystkich wprowadzanych zmian musiał zamienić na żądanie publikowania jedynie zmian wprowadzonych w programach pochodnych, upowszechnianych w taki sposób, jak on to czynił. Mówiąc inaczej, programiści, którzy modyfikowali Emacs jedynie dla własnych potrzeb, zostali zwolnienie z przesyłania do niego kopii plików źródłowych. To obniżenie ceny wolnego oprogramowania było jednym z niewielu zaaprobowanych przez niego odstępstw od doktryny. Teraz użytkownicy mogli wprowadzać zmiany bez obawy, że Stallman zagląda im przez ramię, jeżeli tylko nie odcinali reszty hakerskiej społeczności od późniejszych zmian danego programu. + +Patrząc wstecz, Stallman przyznaje, że kompromisowe sformułowanie wprowadził do GPL, gdyż nie podobało mu się pełnienie roli Wielkiego Brata wobec społeczności Emacs. Lubił zaglądać w systemy innych hakerów, ale obawiał się, że w przyszłości ktoś inny, nadzorując rozwój kodu, może taką uprzywilejowaną pozycję wykorzystać w złym celu. To właśnie skłoniło go do złagodzenia warunków GPL. + +"Nie jest dobre zmuszanie ludzi do publikowania wszystkich zmian - mówi Stallman. - Nie jest słuszne żądanie, by wszystkie informacje przesyłali do jednego uprzywilejowanego użytkownika. Taki rodzaj centralizacji i uprzywilejowania jednej osoby nie jest zgodny z zasadami społeczeństwa, w którym wszyscy mają równe prawa". + +Powszechna Licencja Publiczna (GPL) może być uznana za największe hakerskie osiągnięcie Stallmana. Stworzyła ona system własności społecznej w ramach powszechnie obowiązującego systemu prawa autorskiego (copyright). A co jeszcze ważniejsze, ukazała intelektualne podobieństwo tekstu zapisu prawnego i kodu programowego. Preambuła GPL zawiera głębokie przesłanie, że zamiast spoglądać z podejrzliwością na prawo autorskie (copyright), hakerzy mogą je uważać za kolejny system aż się proszący o "zhakowanie". + +"GPL powstawała jak fragment wolnego oprogramowania, tworzony przez dyskusję dużej społeczności, która omawia ogólną konstrukcję, zgodność lub niezgodność z własnymi wymaganiami, domaga się złagodzenia różnych elementów i dojścia do kompromisu zadawalającego możliwie dużą grupę - mówi Jerry Cohen, inny prawnik, który pomagał Stallmanowi przy tworzeniu licencji. - Proces ten przebiegał bardzo sprawnie i choć pierwsze opublikowane wersje zostały przyjęte ze sceptycyzmem, a nawet wrogością, kolejne były coraz szerzej akceptowane." + +W roku 1986 w wywiadzie dla magazynu "Byte" Stallman optymistycznie przedstawił wyniki pracy nad GPL. Oprócz proklamacji wartości hakerskich czytelnicy powinni odebrać tę licencję jako "rodzaj intelektualnego pojedynku jujitsu z systemem prawnym stworzonym przez tych, którzy oprogramowanie chcą zamienić w swój tajny kapitał"7. Lata później Stallman opisuje powstanie GPL w słowach o wiele mniej wojowniczych: "Rozmyślałem o materii, która miała sens etyczny, polityczny i prawny - mówi. - Musiałem zastanowić się, które elementy systemu prawnego należy w licencji pozostawić. Wszak przystępowałem do tworzenia podstaw prawnych nowej społeczności, a nie byłem rządem i nie mogłem zmieniać istniejącego prawa. Zadanie musiałem wykonać, tworząc budowlę na szczycie istniejącego systemu prawnego, który nie był stworzony z myślą o realizacji celów, jakie mi przyświecały." + +W czasie, gdy on ważył dotyczące wolnego oprogramowania racje etyczne, polityczne i prawne, kalifornijski haker i członek klubu entuzjastów science-fiction, Don Hopkins, odesłał mu pożyczoną wcześniej instrukcję mikroprocesora 68000. W dowód wdzięczności udekorował tył koperty nalepkami otrzymanymi na lokalnym zjeździe miłośników science-fiction. Jedna z nalepek przyciągnęła wzrok Stallmana. Widniał na niej napis "Copyleft (L), All Rights Reversed8". Wydając pierwszą wersję GPL, Stallman zapożyczył termin z tekstu nalepki, nadając licencji wolnego oprogramowania nieformalną nazwę "Copyleft"9. Z czasem nazwa nieformalna i jej skrót "odwrócone C", stały się dla Fundacji Wolnego Oprogramowania symbolem Powszechnej Licencji Publicznej (GPL). + +Niemiecki socjolog Max Weber stwierdził kiedyś, że wszystkie wielkie religie wyrosły z "rutynizacji" i instytucjonalizacji charyzmy. Według niego, każda religia, która zdobyła sobie trwałe miejsce w historii, osiągnęła to przez przekształcenie charyzmy i posłania swego przywódcy-proroka w społeczny, polityczny i etyczny aparat głoszący własne prawdy w formie możliwej do przyjęcia przez różne kultury w różnych czasach. + +Choć GNU GPL per se nie jest przesłaniem religijnym, na pewno można uważać ją za interesujący przykład procesu instytucjonalizacji następującej w nowoczesnym, zdecentralizowanym świecie twórców oprogramowania. Wkrótce po pojawieniu się licencji od razu zaakceptowała ją większość programistów i firm, nawet niepoczuwających się do jakiejkolwiek wspólnoty z ruchem Stallmana. Niektórzy uznali GPL za podstawę ochrony własnego oprogramowania. Nawet ci, którzy odrzucili GPL jako zbyt ograniczającą, przyznali, że pozostali pod jej wpływem. + +Do drugiej grupy należał haker Keith Bostic, w chwili opublikowania GPL 1.0 pracownik University of California. Dział, w którym pracował - Computer Systems Research Group (CSRG)10 - zajmował się rozwojem oprogramowania uniksowego od roku 1970 i był odpowiedzialny za wiele kluczowych elementów systemu, włączając w to protokół sieciowy TCP/IP, podstawę nowoczesnej komunikacji internetowej. Pod koniec lat osiemdziesiątych AT&T, właściciel nazwy firmowej Unix, zaczął się interesować komercjalizacją tego systemu i począł spoglądać na Berkeley Software Distribution (BSD), akademicką wersję Uniksa, rozwiniętą przez Bostica i jego kolegów, jak na kluczowe źródło komercyjnych technologii. + +Choć na podstawie licencji kod źródłowy BSD był dostępny dla naukowców i komercyjnych programistów, te usiłowania komercjalizacji zaczęły stawać się problemem. Prawa własności kodu Berkeley i kodu komercyjnego AT&T były wymieszane. W rezultacie dystrybucje Berkeley były dostępne jedynie dla instytucji, które miały licencję kodu źródłowego AT&T. Gdy AT&T podniosło ceny licencji, układ, który z początku wydawał się nieszkodliwy, stopniowo stawał się coraz cięższy do zniesienia. + +Przyjęty do pracy w roku 1986, Bostic przyjął na siebie zadanie przystosowania BSD do działania na komputerze PDP-11 firmy Digital Equipment Corporation. Wówczas, jak mówi, dość blisko współdziałał ze Stallmanem podczas jego okazjonalnych wizyt na zachodnim wybrzeżu. "Pamiętam, że Stallman siedział przy terminalu CSRG, gdy toczyliśmy żywą wymianę zdań na temat praw autorskich - wspomina. - Potem poszliśmy na obiad i dalej dyskutowali na ten sam temat". + +Jego argumenty ostatecznie zostały przyjęte, choć niedokładnie w takiej formie, jak sobie życzył. W czerwcu 1989 Berkeley oddzieliło swój kod sieciowy (BSD Networking) od reszty systemu operacyjnego, do którego prawa własności miało AT&T, i zaczęło go rozpowszechniać z niezależną licencją University of California. Warunki kontraktu były bardzo liberalne. Licencjobiorca był zobowiązany jedynie do powoływania się na uczelnię w ogłoszeniach reklamujących programy pochodne11. W przeciwieństwie do GPL licencja ta zezwalała na tworzenie programów pochodnych z zastrzeżonymi prawami własności. Powszechnemu uznaniu licencji BSD przeszkadzał fakt, że wersja BSD Networking nie była pełnym systemem operacyjnym. Można było studiować jego kod, ale jego uruchomienie wymagało połączenia z kodem strzeżonym przez ograniczenia praw własności. + +Przez kilka następnych lat Bostic i inni pracownicy uniwersytetu pracowali nad dorobieniem brakujących elementów kodu BSD, aby uczynić go pełnym, ogólnodostępnym systemem operacyjnym. Ich wysiłki ostatecznie zostały uwieńczone powodzeniem na początku lat dziewięćdziesiątych, pomimo opóźnień spowodowanych zastrzeżeniami prawnymi Unix Systems Laboratories z AT&T, które starały się zachować wyłącznie dla siebie prawa do używania nazwy firmowej Unix. Jednakże już wcześniej wiele narzędzi z Berkeley znalazło swe miejsce w projekcie GNU Stallmana. + +"Wydaje się mało prawdopodobne, byśmy tak twardo parli do przodu, gdyby nie wpływ projektu GNU - przyznaje Bostic, patrząc wstecz. - Było coś, co nas ostro poganiało, a myśmy się temu z ochotą poddawali". + +Do końca roku 1980 GPL pokazała swą moc przyciągania całej społeczności twórców oprogramowania. Narzędzia BSD należały do wolnego oprogramowania nawet bez licencji GPL, ale jej użycie niosło określony komunikat. "Myślę, że pojawienie się GPL zmusiło wielu ludzi do zastanowienia się, czy naprawdę tworzą wolne oprogramowanie i w jaki sposób powinni je licencjonować" - twierdzi Bruce Perens, twórca popularnego narzędzia uniksowego Electric Fence i przyszły szef grupy programistów Debian GNU/Linux. W kilka lat po pojawieniu się GPL postanowił zrezygnować z licencji własnego pomysłu i objąć Electric Fence licencją sporządzoną przez Stallmana przy wsparciu prawników. "Było to bardzo łatwe" - wspomina. + +Rich Morin, który pierwszy anons Stallmana dotyczący projektu GNU przyjął sceptycznie, przyznaje, że z coraz większym zdumieniem spoglądał na gromadzenie się oprogramowania pod ochroną GPL. Jako przywódca grupy programistów SunOS w latach osiemdziesiątych był zobowiązany do rozsyłania taśm z nowymi wersjami najlepszego wolnego oprogramowania. Często wymagało to telefonowania do twórców oryginalnych programów i sprawdzania, czy przypadkiem prawa autorskie nie zabraniają ich rozpowszechniania i czy są przeznaczone do użytku w wolnej ogólnodostępnej domenie. Pod koniec roku 1989 zauważył, że najlepsze programy zwykle są chronione przez licencję GPL. "Jako dystrybutor oprogramowania wiedziałem, że znak GPL oznacza swobodę rozpowszechniania" - wspomina. + +Aby zrekompensować sobie kłopoty wynikające z trudności kompletowania taśm z żądanymi programami, obciążał odbiorców stosowną opłatą. Teraz zauważył, że przygotowanie taśm złożonych z programów z licencją GPL zajmuje mu dwakroć mniej czasu, dzięki czemu interes zaczął przynosić zyski. Widząc okazję do zarobku, zamienił hobby w biznes pod nazwą: Prime Time Freeware. + +Taka działalność gospodarcza była całkowicie zgodna z zasadami wolnego oprogramowania. "Gdy mówimy o wolnym oprogramowaniu, mówimy o wolności, a nie o cenie" - objaśnia Stallman w preambule GPL. Pod koniec lat osiemdziesiątych przedstawił tę myśl w postaci uproszczonego stwierdzenia: "Mówiąc wolny, nie myśl o wolnym, bezpłatnym dostępie do piwa, lecz o wolności wypowiedzi". + +Większość firm zlekceważyła argumenty Stallmana. Części przedsiębiorców wolność związana z wolnym oprogramowaniem nadal kojarzyła się z wolnym rynkiem. Usunięcie ograniczeń własności oprogramowania stwarzało sytuację, w której nawet najmniejsza firma mogła stawać w szranki z takimi potęgami jak IBM i DEC. + +Jednym z pierwszych przedsiębiorców, którzy to pojęli, był Michael Tiemann, programista i student ostatnich lat Stanford University. W latach osiemdziesiątych bez zastanowienia postępował zgodnie z zasadami projektu GNU, jak początkujący jazzman śladami swego ulubionego artysty. Dopiero po ukazaniu się w roku 1987 kompilatora GNU języka C (GNU C Compiler, w skrócie GCC) pojął, jak wielki jest potencjał wolnego oprogramowania. Samo pojawienie się GCC, który nazwał "bombą", uznał za dowód wielkiej determinacji Stallmana-programisty. + +"Tak jak każdy pisarz marzy o napisaniu wielkiej amerykańskiej powieści, tak każdy programista w latach osiemdziesiątych pragnął napisać wielki amerykański kompilator - wspomina Tiemman. - Nagle Stallman to zrobił. To było poniżające". + +"Mówicie o różnych niedociągnięciach GCC - wtóruje mu Bostic, - ale nikt przed Stallmanem nie mógł się uznać za twórcę kompilatora". + +Zamiast współzawodniczyć ze Stallmanem, Tiemann postanowił korzystać z jego pracy. Oryginalna wersja GCC liczyła około 110 tysięcy linii kodu, ale Tiemann wspomina, że był to kod, który można było bardzo łatwo odczytać i pojąć. Było to na tyle proste, że zajęło mu tylko pięć dni. Przez następny tydzień udało mu się przenieść to oprogramowanie na platformę mikroprocesora National Semiconductor 32032. W rok później zajął się tworzeniem kompilatora dla języka C+. Pewnego razu, wygłaszając na ten temat wykład w Bell Labs, zetknął się ze zmagającymi się z tym samym problemem programistami z AT&T. + +"Na sali było około 40 lub 50 osób, więc zapytałem, ilu z nich pracuje nad tym kompilatorem - wspomina. - Gospodarz odpowiedział, że ta informacja jest objęta tajemnicą, ale mogę się mniej więcej zorientować, rozglądając się po sali". + +Wkrótce potem, jak wspomina, rozjaśniło mu się w głowie. "Pracuję nad tym kodem od sześciu miesięcy - pomyślał, - co oznacza niezłą wydajność, którą wolny rynek powinien wynagrodzić". + +Dalszą zachętę znalazł w manifeście GNU, gdzie obnażano chciwość niektórych dostawców oprogramowania, zachęcając innych do rozważenia korzyści, jakie wolne oprogramowanie daje konsumentom. Wolne oprogramowanie, łamiąc potęgę monopolu oprogramowania komercyjnego, umożliwia bystrym mniejszym dostawcom konkurowanie z wielkimi za pomocą usług i konsultacji - dwóch najbardziej dochodowych nisz rynku komputerowego. + +W szkicu opublikowanym w roku 1999 Tiemann wspomina wrażenie, jakie wywarł na nim manifest Stallmana. "Czytało się to jak socjalistyczną polemikę, ale ujrzałem w tym coś zupełnie innego. Zobaczyłem tam zamaskowany biznesplan"12. + +Wraz z Johnem Gilmorem, innym zwolennikiem projektu GNU, założył firmę udzielającą konsultacji w dziedzinie korzystania i dostosowywania do potrzeb oprogramowania GNU. Cygnus Support, bo tak nazwano firmę, pierwszy kontrakt podpisał w lutym 1990 roku, a do końca roku miał już portfel kontraktów wart 725 000 dolarów. + +GNU Emacs, GDB i GCC13 to "wielka trójka" narzędzi dla programistów, ale nie były to jedyne programy stworzone przez Stallmana w pierwszej połowie dekady istnienia projektu GNU. Do roku 1999 stworzył on wersje GNU Bourne Shell (przemianowanego na Bourne Again Shell czyli BASH14), YACC15 (przemianowanego na Bison), awk (przemianowanego na gawk16). Każdy program GNU na wzór GCC projektowano tak, aby mógł być uruchamiany w różnych systemach, a nie tylko na platformie jednego dostawcy. Podczas udoskonalania elastyczności i wszechstronności programów Stallman i jego współpracownicy często zwiększali ich przydatność. + +Przypominając uniwersalistyczną filozofię GNU, Morin z Prime Time Freeware wskazuje na istotny i rozpowszechniony na świecie pakiet hello world17. "Program hello world liczy wszystkiego pięć linii kodu napisanego w C, ale jest opakowany, jakby był normalną dystrybucją GNU - mówi Morin. - Ma więc Textinfo (informacyjny plik tekstowy) i dane do konfiguracji. Dostał wszystkie dodatki inżynierii oprogramowania, jak wszystkie normalne pakiety GNU, dzięki czemu tak łatwo je instalować i uruchamiać na tak wielu różnych platformach. To diabelnie ważne i jest cechą nie tylko oprogramowania pisanego przez Stallmana lecz wszystkich pakietów tworzonych przez projekt GNU. + +Według Stallmana, ulepszanie oprogramowania to zadanie wtórne, zaś najważniejsze było budowanie nowych programów. "Każdy kawałek programu daje, bądź nie daje się ulepszyć - mówił Stallman w wywiadzie dla Byte'a. - Do pewnego stopnia korzystam z reimplementacji, która prowadzi do ulepszania programów. W pewnej dużej mierze wynika to z faktu, że siedzę w tej branży tak długo, że pracowałem z wieloma systemami. Z tego powodu mam wiele pomysłów do zastosowania"18. + +Do końca lat osiemdziesiątych narzędzia GNU zdążyły wyrobić sobie dobrą markę, a znana jeszcze z czasów AI Lab wybredność Stallmana stała się wprost legendarna w całym programistycznym świecie. + +Jeremy Alson, w latach osiemdziesiątych użytkownik Suna i programista realizujący własny projekt wolnego oprogramowania Samba, na początku lat dziewięćdziesiątych wspominał tę reputację ze śmiechem. Pod koniec lat osiemdziesiątych zaczął używać Emacsa. Zainspirowany rozwojem społeczności programistów, przesłał Stallmanowi fragment kodu jedynie po to, by został on odrzucony. + +"To coś w rodzaju nagłówka z "The Onion"19 - mówi Allison. - Modlącym się dzieciom Bóg odpowiedział: Nie". + +Rosnącemu uznaniu dla Stallmana programisty towarzyszyły kłopoty związane z zarządzaniem projektem GNU. Projekt odnosił jeden sukces za drugim w dziedzinie tworzenia narzędzi programistycznych, ale nie był w stanie stworzyć działającego jądra systemu, "centrali dowodzenia" wszystkich systemów uniksowych, decydującego o tym, które programy i narzędzia w danym momencie uzyskują dostęp do mikroprocesora. Zaczęło to wywoływać niepokój już pod koniec lat osiemdziesiątych. Jak w przypadku wielu innych zadań wykonywanych w projekcie GNU, Stallman rozpoczął pracę nad jądrem od poszukiwania istniejącego programu, który można by było zmodyfikować. Według informacji z "Gnusletters" ze stycznia 1987, przeglądał gruntownie TRIX, jądro uniksowe stworzone przez MIT. + +Przeglądając "GNUsletters", biuletyn informacyjny projektu GNU z końca lat osiemdziesiątych, wyczuwa się rosnące napięcie. W styczniu 1987 Stallman poinformował, że w ramach projektu GNU dokonywana jest dokładna analiza TRIX-a, uniksowego jądra stworzonego przez MIT. Rok później, w lutym 1988 roku, podano do wiadomości, że w centrum zainteresowania znalazł się Mach, lekkie "mikrojądro" opracowane przez Carnegie Mellon. Wszyscy przyznają jednak, że właściwe prace nad jądrem nie rozpoczęły się przed rokiem 199020. + +Opóźnienie prac nad jądrem było tylko jednym z problemów nękających wówczas Stallmana. W roku 1989 firma Lotus Development Corporation wystąpiła przeciwko swojemu rywalowi na rynku programistycznym, firmie Paperback Software International, oskarżając ją o skopiowanie poleceń menu z popularnego programu arkusza kalkulacyjnego 1-2-3. Nastąpiło to w tym samym czasie, gdy Apple i Microsoft toczyły walkę o "look and feel21". Razem wzięte przyczyniło się to do powstania dodatkowych kłopotów odczuwanych przy realizacji projektu GNU. Choć oba procesy w żadnej mierze nie dotyczyły projektu GNU, gdyż oba obracały się wokół systemów operacyjnych i aplikacji tworzonych dla komputerów osobistych niezgodnych sprzętowo z systemami uniksowymi, budziły jednak strach wśród wszystkich twórców oprogramowania. Stallman postanowił temu przeciwdziałać, więc wraz z kilkoma zaprzyjaźnionymi programistami umieścił w jednym z magazynów ogłoszenie uderzające w trwające procesy. W ślad za tym zorganizował grupę zwalczającą te zjawiska. Przyjęła ona nazwę League of Programming Freedom22 i rozpoczęła protesty przed siedzibą Lotus, Inc. i przed budynkiem sądu w Bostonie, w którym toczyła się rozprawa. + +Protest był zauważalny23. To, co się działo, było odbiciem ewolucji przemysłu programistycznego, w którym aplikacje, a nie sam system operacyjny, z wolna stawały się głównym przedmiotem sporów. Niespełnione dążenie GNU do stworzenia wolnego systemu operacyjnego zdawało się być anachronizmem. Rzeczywiście, fakt, że Stallman za nieodzowne uznał zebranie grupy zwalczającej procesy "look and feel", wielu odebrało jako oznakę starzenia się. + +W roku 1990 Fundacja Johna D. i Catherine T. MacArthurów uznała Stallmana za geniusza, nadając mu swoje członkostwo, co było połączone z wypłaceniem jego organizacji nagrody, tzw. "genius grant". Była to suma 240 tysięcy dolarów przeznaczona na rozwój projektu GNU. Projekt i głoszona idea wolnego oprogramowania na krótko stały się wówczas obiektem powszechnego zainteresowania. Przede wszystkim pozwoliło to Stallmanowi i wielu jego nieopłacanym współpracownikom z Fundacji Wolnego Oprogramowania, dotychczas dorabiającym różnymi kontraktami konsultingowymi, poświęcić więcej czasu na pisanie kodów dla projektu GNU. + +Zabawne, że ta nagroda umożliwiła Stalmanowi także udział w głosowaniu. Kilka miesięcy przed jej przyznaniem pożar w mieszkaniu strawił niewiele rzeczy, które posiadał. Do czasu przyznania nagrody mieszkał jako "dziki lokator"24 na Technology Square 545. "Komisarz wyborczy za nic nie chciał uznać, że taki jest mój adres - wspomina. - Pogodził się z tym dopiero wtedy, gdy ta informacja została potwierdzona w artykule prasowym o nagrodzie MacArthura.25" + +Najważniejsze, że nagroda MacArthura dała Stallmanowi więcej swobody. Poświęcony bez reszty idei wolności oprogramowania, wykorzystał otrzymaną wolność na podróże wspierające misję projektu GNU. + +Ciekawe, że jedna z tych podróży rzeczywiście przyczyniła się do ostatecznego sukcesu projektu GNU i ruchu wolnego oprogramowania. W roku 1990 Stallman odwiedził Politechnikę w Helsinkach w Finlandii. Wśród jego słuchaczy znalazł się 21-letni Linus Torvalds, późniejszy twórca jądra Linuksa, elementu, który wypełnił dotkliwą lukę w oprogramowaniu projektu GNU. + +Torvalds, wówczas student pobliskiego Uniwersytetu Helsińskiego, spoglądał na Stallmana bez entuzjazmu. "Zobaczyłem po raz pierwszy w życiu typowego długowłosego i brodatego hakera" - wspomina w swojej autobiografii "Just for Fun" wydanej w roku 200126 i 27. + +Choć nie całkiem odpowiadała mu "socjopolityczna" strona zadań wyliczonych przez Stallmana28, doceniał logikę zasadniczego założenia, że żaden programista nie pisze bezbłędnych kodów, a udostępnianie ich innym oznacza stawianie postępu ponad indywidualną żądzę zysku i chronienia własnego ego.29 + +Jak wielu programistów z jego pokolenia, Torvalds nie zajął się problemami wielkich komputerów "mainframe", lecz "zatopił zęby" w różnobarwnej i niejednorodnej materii systemów komputerów osobistych. Jako student i użytkownik uniwersyteckiego MicroVAXa, uczynił pierwszy krok, przechodząc od programowania w C do zagadnień systemu Unix. To wykonanie jednego kroku do przodu pozwoliło mu z innej perspektywy zobaczyć bariery broniące dostępu do maszyny. Dla Stallmana główną przeszkodą były biurokracja i przywileje, zaś dla Torvaldsa - geografia i ostra helsińska zima. Zmuszony brnąć przez teren uniwersytetu po to, by zalogować się do systemu uniksowego, rychło zaczął szukać możliwości łączenia się systemem bez wysuwania nosa ze swej ciepłej kwatery w uczelnianym campusie. + +Te poszukiwania doprowadziły go do systemu Minix30, wersji "wagi lekkiej" Uniksa napisanej w celach edukacyjnych przez profesora holenderskiego uniwersytetu Andrew Tanenbauma. System pasował do ograniczonych parametrów, zwłaszcza niewielkiej pamięci PC 386, najpotężniejszej maszyny, na jaką Torvalds mógł sobie pozwolić, ale brakowało mu niektórych funkcji. Przede wszystkim nie pozwalał na emulację terminalu, co pozwalałoby na pełnienie roli terminalu uniwersyteckiego i logowanie się do MicroVAX-a z domu. + +Latem 1991 roku Torvalds przetworzył od podstaw kod Minixa, dodając brakujące funkcje. Pod koniec lata zaczął określać swą pracę jako "terminalowe programy emulacyjne GNU/Emacs"31. Poczuł się wystarczająco pewny siebie, by poprosić miniksową grupę dyskusyjną o kopie standardów POSIX32, zbioru podstawowych zasad programistycznych, decydujących o tym, czy program można uznać za zgodny z Uniksem. Kilka tygodni później wysłał komunikat, bardzo przypominający stallmanowską zapowiedź powstania GNU w roku 1983: + +Pozdrawiam wszystkich, którzy używają minixa +Robię (wolny) system operacyjny (jako hobby, więc +nie będzie wielki i profesjonalny jak gnu dla +klonów 386 (486) AT). Szykuję to od kwietnia i +zbliżam się do końca. Czekam na odzew o tym, co +ludzie lubią/nie lubią w minixie, który mój system +przypomina (fizycznie ten sam układ systemu plików +(z przyczyn praktycznych) i podobne inne rzeczy)33. + +Komunikat spotkał się z niewielkim odzewem, a w ciągu miesiąca Torvalds opublikował wersję 0.01 swego systemu operacyjnego, co oznacza, że została ona udostępniona na serwerze FTP34. Stanęło przed nim zadanie nadania systemowi nazwy. Na dysku swojego własnego PC-ta zapisał ten program35 pod nazwą Linux, zgodną z zasadą, że nazwy różnych wariantów Uniksa powinny się kończyć na X. Uznając ją jednak za "egoistyczną", zmienił ją na Freakx - chyba tylko po to, by administrator serwera FTP mógł dokonać zmiany odwrotnej. + +Choć Torvalds założył zbudowanie pełnego systemu operacyjnego, zarówno on, jak i inni programiści doskonale wiedzieli, że wiele narzędzi jest już gotowych dzięki pracy GNU, BSD i innych programistów tworzących wolne oprogramowanie. Jednym z pierwszych narzędzi, z których skorzystała grupa twórców Linuksa, był GCC (GNU C Compiler), narzędzie pozwalające na przystosowanie do działania programów napisanych w języku C. + +Integracja z GCC zwiększyła wydajność i możliwości Linuksa, co podniosło jego rangę. Choć "wirusowa" natura GPL nie miała zastosowania do jądra Linuksa, Torvalds, pragnąc pożyczyć GCC do własnych celów, zaciągnął zobowiązanie zwrócenia długu. Potem ujął to następująco: "Wzniosłem się na barkach olbrzymów"36 i 37. Nie zaskakuje, że zaczął rozmyślać, co by się stało, gdyby inni oczekiwali takiej samej pomocy. W dziesięć lat później zgodził się ze słowami Roberta Chassela z Fundacji Wolnego oprogramowania, który w następujący sposób podsumował jego ówczesne myśli: + + Na zrobienie tego poświęciłem sześć miesięcy życia i chcę to udostępnić innym i dostać coś w zamian, ale nie chcę, aby inni czerpali z tego dla własnych korzyści. Chciałem, aby ludzie zobaczyli Linuksa, aby go zmieniali i ulepszali dla własnej satysfakcji, ale jednocześnie chciałem mieć dostęp do źródeł, aby móc robić te same ulepszenia, co oni.38 + +Gdy nadszedł czas wydania wersji Linux 0.12, pierwszej w pełni zintegrowanej z GCC, Torvalds postanowił zgłosić przystąpienie do ruchu wolnego oprogramowania. Odrzucił starą licencję jądra systemu i zastąpił ją przez GPL, co zaowocowało potokiem adaptacji i Torvalds wraz ze współpracownikami mógł się przyglądać, jak wiele programów GNU wpada do kotła z "linuksowym gulaszem". W ciągu trzech lat linuksowi programiści mogli już pokazać Linuksa 1.0, zawierającego pełne i zmodyfikowane wersje GCC i GDB, oraz wiele narzędzi zaczerpniętych z BSD. + +Do roku 1994 ten amalgamatyczny system operacyjny zdobył sobie już taki szacunek w hakerskim świecie, że niektórzy obserwatorzy zaczęli się interesować, czy Torvalds, zgadzając się na GPL, nie oddał "za frajer" kury znoszącej złote jaja. W pierwszym wydaniu Linux Journal wydawca Robert Young przeprowadził z nim wywiad. Gdy spytał fińskiego programistę, czy żałuje, że zrzekł się prawa własności do kodu źródłowego Linuksa, Torvalds zaprzeczył: "Nawet patrząc wstecz, na 100% uważam przyjęcie GPL za jedną z najlepszych decyzji, jakie podjąłem we wczesnej fazie projektu"39. + +Fakt, że decyzja ta została podjęta bez odwoływania się do Stallmana i Fundacji Wolnego oprogramowania, świadczy o rosnącej przenośności GPL. Dopiero po paru latach Stallman uświadomił sobie, że siłą rozprzestrzeniania się Linuks przypomina zdarzenia dotyczące Emacsa. Tym razem przyczyną nie były sztuczki hakerskie w rodzaju Ctrl+R lecz nowość, jaką było działanie systemu uniksowego na komputerach o architekturze PC-tów. Motywy działania były różne, ale rezultat końcowy był zgodny z założeniami etycznymi: powstał wolny, w pełni funkcjonalny system operacyjny. + +Jak zapowiadał pierwszy e-mailowy komunikat wysłany przed kilkoma miesiącami do grupy comp.os.minix, Torvalds spodziewał się, że po ukończeniu przez programistów GNU jądra HURD40 jego system rychło stanie się przeżytkiem. Ta początkowa niechęć spojrzenia na Linuksa z punktu widzenia korzyści politycznych, okazała się ciosem, który Fundacja Wolnego Oprogramowania sama sobie wymierzyła. + +Jak zauważa Torvalds, był on tylko jednym z wielu dzieciaków, które gdzieś tam z boku robiły różne rzeczy dla zabawy. Pomimo to, patrząc wstecz na oszałamiający sukces projektu, uznaje mądrość swej młodzieńczej decyzji zaakceptowania GPL, bez czego jego system mógł zakończyć żywot na jakimś zapomnianym przez wszystkich dysku twardym. + +"A mogłem tego światełka nie spostrzec - pisze, wspominając wykład Stallmana na Politecnice Helsińskiej w roku 1991 i wynikającą z tego decyzję przyjęcia GPL. - Widocznie jednak coś wtedy zapadło w moją duszę"41. + + +Rozdział 10. +GNU/Linux + +Przed rokiem 1993 ruch wolnego oprogramowania znalazł się na rozdrożu. Optymiści twierdzili, że wszystkie znaki na niebie i ziemi wskazują na zwycięstwo kultury hakerskiej. Magazyny sieciowe, dziwaczne nowe publikacje z opowiadaniami o szyfrowaniu danych, Usenecie i wolności oprogramowania zaczęły gwałtownie znikać z półek. Internet - jeszcze niedawno slangowe określenie używane tylko przez hakerów i naukowców - znalazło swe miejsce w powszechnie używanym słownictwie. Używał go nawet prezydent Clinton. Komputer osobisty, do niedawna jedynie zabawka hobbystów, stał się powszechnie uznawanym narzędziem dającym nowemu pokoleniu użytkowników dostęp do stworzonego przez hakerów oprogramowania. A skoro projekt GNU nie dostarczył jeszcze pełnego, wolnego systemu operacyjnego, ciekawscy użytkownicy, czekając nań, zajęli się wypróbowywaniem Linuksa. + +Jakby na to nie patrzyć, wiadomości były dobre i po dekadzie walki o przetrwanie hakerzy wraz z promowanymi przez siebie wartościami poczęli zdobywać akceptację społeczną. Ludzie zaczęli "w to wchodzić". + +Czy aby na pewno? Pesymiści twierdzili, że każdy znak akceptacji niesie ze sobą kolejny problem. Nagle okazało się, że świetnie być hakerem, ale czy było to dobre dla kultury, która dotychczas rozwijała się w odosobnieniu? Oczywiście, Biały Dom wychwalał Internet, a nawet zarejestrował własną domenę whitehouse.gov, ale towarzyszyły temu kontakty z firmami, zwolennikami cenzury i wpływowymi osobistościami dążącymi do prawnego postawienia tamy kulturze internetowego "dzikiego zachodu". Oczywiście, PC-ty stawały się coraz potężniejsze, ale w wyniku opanowania ich rynku przez chipy Intela znacznie wzmocniła się pozycja dostawców oprogramowania z prywatnymi prawami własności. Na każdego użytkownika, który wybierał wolny system Linux, przypadały setki lub tysiące innych, którzy zaczynali od uruchamiania komputera z preinstalowanym systemem Windows. + +Do tego dochodziła osobliwa natura Linuksa. Nie ograniczony błędami projektowymi (jak GNU) i debatami prawniczymi (jak BSD), błyskawiczny rozwój Linuksa nie był zaplanowany, a sukces tak przypadkowy i nieoczekiwany, że programiści najbliżej zaznajomieni z kodem, nie wiedzieli, co z tym począć. Była to raczej składanka niż system operacyjny, album, do którego wklejono hity oprogramowania, wszystko - od GCC, GDB i glicb (nowej biblioteki C projektu GNU), przez X (uniksowy interfejs graniczny stworzony przez MIT Laboratory for Computer Science), po opracowane przez BSD narzędzia, takie jak BIND (ang. Berkeley Internet Naming Daemon - pozwalający zastąpić liczbowe adresy IP przez łatwe do zapamiętania nazwy domen) i TCP/IP. Oczywiście, zwornikiem tej konstrukcji było jądro Linuksa - przenicowane i doładowane jądro Minixa. Zamiast budować system od podstaw Torvalds i jego grupa postąpili zgodnie z sentencją Picassa, że "dobrzy artyści pożyczają, wielcy artyści kradną". Później Torvalds, wyjaśniając tajemnicę sukcesu, tak to określił: "Jestem z natury bardzo leniwy i lubię polegać na tym, co robią inni"1. + +Takie lenistwo, choć godne pochwały z punktu widzenia efektywności, z powodów politycznych sprawiało kłopoty. Podkreślało brak celów ideologicznych. W przeciwieństwie do twórców GNU, Torvalds nie budował systemu operacyjnego z powodu chęci dostarczenia narzędzia kolegom hakerom; zbudował coś, czego sam potrzebował. Jak Tomek Sawyer bielący płot Torvalds nie zajmował się wizją ogólną lecz raczej zatrudnianiem innych hakerów w celu szybszego osiągnięcia wyniku. + +Dlaczego więc jemu i współpracującym z nim hakerom udało się to, na czym inni polegli, i czym właściwie jest Linux? Czy jest to wyraz filozofii wolnego oprogramowania ogłoszonej w manifeście GNU napisanym przez Stallmana? A może to zwykły amalgamat świetnych narzędzi, które inni podobnie myślący również byliby w stanie zmontować w system? + +Przed upływem roku 1993 rosnąca liczba użytkowników Linuksa zaczęła się skłaniać ku tej drugiej definicji i zaczęła tworzyć przeróżne opinie na jego temat. Znaleźli się nawet tacy, którzy ośmielili się swoje wariacje na temat systemu nieco inaczej opakować i przedstawić uniksowym aficionados2 jako oddzielne "dystrybucje". Rezultaty, nawet przy dobrej woli, trzeba nazwać partaniną. + +"Było to jeszcze przed pojawieniem się Red Hata i innych komercyjnych dystrybucji - wspomina Ian Murdock, w owym czasie student Purdue University3. - W każdym uniksowym piśmie można było znaleźć kilka ogłoszeń wielkości wizytówki reklamujących "Linux". Często były to firmy "krzaki", które nie widziały nic złego w próbie dodania własnego fragmentu do ogólnej składanki". + +Murdock, uniksowy programista, został pochłonięty przez Linksa w chwili, gdy po raz pierwszy zainstalował go na swoim komputerze. "To była wspaniała zabawa - mówi. - Wciągnęło mnie to". Jego zapał przygasił nieco zalew marnie napisanych dodatków. Zdecydował, że najlepszym rozwiązaniem będzie skonstruowanie wersji Linuksa oczyszczonego ze wszystkiego, co do niego doczepiono, więc przystąpił do sporządzania listy najlepszych dostępnych narzędzi programistycznych z zamiarem włączenia ich do własnej dystrybucji. "Chciałem stworzyć coś wartego nazwy Linuksa" - powiada. + +Aby wzbudzić zainteresowanie innych, ogłosił swe zamiary w Internecie, również w grupie usenetowej comp.os.linux. Jeden z pierwszych e-maili, które otrzymał, pochodził od rms@ai.mit.edu. Jako haker, natychmiast rozpoznał autora. Był to Richard M. Stallman, twórca projektu GNU i człowiek znany Murdockowi jako "haker hakerów". Widok e-maila od Stallmana w skrzynce własnej poczty elektronicznej zdziwił go. Dlaczego, u diabła, Stallman, tworzący własny system operacyjny, miałby się interesować faktem, że on postanowił zająć się Linuksem? + +Otworzył e-mail. + +"Stallman pisał, że Fundacja Wolnego Oprogramowania zaczyna dokładnie przyglądać się Linuksowi i także być może będzie zainteresowana stworzeniem z niego systemu. Z grubsza można powiedzieć, iż Stallman sądził, że nasze zamierzenia są zgodne z ich filozofią". + +Ten komunikat był odbiciem dramatycznej sytuacji Stallmana. Aż do roku 1993 nie wtykał on nosa w zdarzenia zachodzące wewnątrz linuksowej społeczności. Prawdę mówiąc, rozmyślnie unikał renegackiego systemu operacyjnego od chwili, gdy po raz pierwszy pojawił się on na horyzoncie w roku 1991. Po otrzymaniu pierwszej wiadomości o uniksopodobnym systemie operacyjnym działającym na PC-tach zbadanie sprawy polecił jednemu z przyjaciół. "Powiedział mi - mówi Stallman, - że to oprogramowanie jest naśladownictwem Systemu V, pośledniej wersji Uniksa. Dodał, że nie jest przenośne". + +Raport przyjaciela był słuszny. Linuks, zbudowany specjalnie dla PC 386, wykorzystywał maksymalnie możliwości tej technicznie ubogiej maszyny. Jednakże przyjaciel zapomniał wspomnieć o tym, że wielką wartością Linuksa było jego istnienie jako jedynego systemu operacyjnego, który można było swobodnie modyfikować. Innymi słowy, w ciągu następnych trzech lat, które Stallman spędził na wysłuchiwaniu raportów o błędach składanych przez zespół pracujący nad stworzeniem HURD-a, Torvalds wysunął się przed programistów, którzy mieli później zająć się adaptacją Linuksa na inne platformy sprzętowe. + +Do roku 1993 brak działającego jądra systemu projektu GNU stał się przyczyną kłopotów nie tylko grupy ludzi bezpośrednio w projekt zaangażowanych, lecz także całego ruchu wolnego oprogramowania. W marcu 1993 magazyn "Wired" w artykule napisanym przez Simsona Garfinkela poinformował, że projekt GNU "zapada się w grzęzawisko" pomimo sukcesów w tworzeniu wielu świetnych narzędzi4. Tym, którzy tkwili wewnątrz projektu i związanej z nim organizacji pozarządowej - Fundacji Wolnego Oprogramowania sytuacja wydawała się jeszcze gorsza od przedstawionej w artykule Garfinkela. "Było jasne, przynajmniej dla mnie, że los uśmiechnął się do nas, dając okienko, czyli czas na wprowadzenia nowego systemu operacyjnego - twierdzi Chassel. - Gdy się to okienko zamknęło, ludzie zaczęli tracić zainteresowanie. Właśnie to się zdarzyło"5. + +Wielokrotnie analizowano przyczyny trudności, które dotknęły projekt GNU w latach 1990-1993. Niektórzy winą obciążali Stallmana, ale - jak twierdzi Eric Raymond, niegdyś członek zespołu GNU Emacs, a później krytyk Stallmana - problem miał bardziej instytucjonalny charakter. "FSF stała się arogancka - uważa Raymond. - Odeszła od tworzenia gotowego do działania systemu operacyjnego w stronę badań nad systemem. Nawet gorzej, bo sądzili, że nikt spoza Fundacji nie może mieć wpływu na ich pracę". + +Murdock, osoba mniej wtajemniczona w wewnętrzne sprawy projektu GNU, widzi rzecz łagodniej. "Myślę, że częściową przyczyną kłopotów była ich wygórowana ambicja - zbyt wiele wysiłków marnotrawili na poprawianie błędów" - twierdzi. W latach osiemdziesiątych i dziewięćdziesiątych mikrojądra były gorącym tematem. Nieszczęściem projektu GNU było przystąpienie do budowy własnego jądra właśnie w tym czasie. Spowodowało to wielkie obciążenie prac i konieczność usilnego "pedałowania wstecz" w celu pozbycia się zbędnego bagażu. + +Stallman podaje wiele przyczyn wyjaśniających opóźnienie. Procesowanie się Lotusa z Apple odciągało uwagę, do tego doszła czasowa niezdolność Stallmana do używania klawiatury, co utrudniało mu udzielanie pomocy zespołowi pracującemu nad HURD-em. Inną przyczyną była marna wymiana informacji między różnymi częściami projektu GNU. "Mieliśmy wiele kłopotów z zachowaniem możliwości debuggowania środowiska, a zespół GDB w tym czasie nie był zbyt chętny do współpracy". Jednakże przyznaje, że główną przyczyną był fakt, iż on i jego współpracownicy nie docenili trudności, jakie sprawiało rozszerzenie mikrojądra Mach do postaci pełnego jądra uniksowego. + +"Myślałem: OK, część (Mach), która ma się dogadać z maszyną, już została zdebuggowana - mówił Stallman, wspominając kłopoty z HURD-em w przemówieniu z roku 2000. - Mając gotową głowę, powinniśmy resztę dorobić znacznie szybciej, ale okazało się, że debuggowanie tych asynchronicznych wielowątkowych programów było nie lada kłopotem. Wyznaczone terminy mijały i bieg czasu mógł zniweczyć nasze wysiłki. W rezultacie wyglądało na to, że wersja testowa pojawi się dopiero po latach6. + +Jak by się nie usprawiedliwiać, stworzenie jądra Linux przez konkurencyjny zespół zrodziło napiętą sytuację. Oczywiście, jądro to pojawiło się z licencją GPL, ale - jak zauważa Murdock - chęć uznania Linuksa za podstawowy system wolnego oprogramowania była niewielka. Do końca roku 1993 liczba jego użytkowników wzrosła od mniej więcej tuzina entuzjastów Miniksa do pułapu gdzieś między 20 a 100 tys.7 To, co kiedyś było jedynie hobby, stało się rynkiem dojrzałym do eksploatacji. Gdy doszło do uznania zwycięstwa Linuksa, Stallmanem miotały mieszane uczucia - jak niegdyś Churchillem patrzącym na wkraczanie do Berlina sowieckich oddziałów8. + +Choć Stallman późno zasiadł do gry, ma w niej jednak swój udział. Gdy tylko FSF ogłosiła, że jest gotowa poprzeć finansowo i moralnie projekt Murdocka, zaczęły napływać kolejne oferty wsparcia. Murdock nadał projektowi nazwę Debian - co było kompilacją imion jego żony i jego: Deborah i Ian - i już po kilku tygodniach przedstawił pierwszą gotową dystrybucję. "(Poparcie Richarda) niemal w ciągu jednej nocy przekształciło Debian z małego, interesującego niewiele osób, lokalnego projektu w przedsięwzięcie, na które niemal cała społeczność zwróciła uwagę" - twierdzi Murdock. + +W styczniu 1994 roku Murdock wydał "Manifest Debian". Napisany w duchu stallmanowskiego, wydanego przed dekadą, "Manifestu GNU", wyjaśnia wagę współpracy z Fundacją Wolego Oprogramowania (FSF). Murdock pisze9: + + Fundacja Free Software Foundation może odegrać niezmiernie ważną rolę w przyszłości Debiana. Już poprzez fakt udostępniania go przez tę organizację świat otrzyma sygnał, że Linux nie jest produktem komercyjnym i nigdy nie powinien nim zostać. Nie znaczy to, iż nigdy nie będzie mógł stanowić konkurencji na polu komercyjnym. Tym, którzy mają przeciwne zdanie, polecam przyjrzenie się fenomenowi programów GNU Emacs albo GCC, które nie są aplikacjami komercyjnymi, a jednak wywołały spore zamieszanie na rynku podobnego oprogramowania. + +Przyszedł czas bardziej skoncentrować się na przyszłości Linuksa niż na nieetycznym celu, jakim jest wzbogacanie się kosztem całej linuksowej społeczności. Rozwój i dystrybucja Debiana niekoniecznie stanowią rozwiązanie problemów, których obraz naszkicowałem w manifeście, ale mam nadzieję, że przynajmniej zwrócą na nie uwagę i w rezultacie doprowadzą do ich rozwiązania10. + +Krótko po wydaniu manifestu Fundacja Wolnego Oprogramowania wysunęła swe pierwsze żądanie. Stallman chciał, aby Murdock nadał dystrybucji nazwę "GNU/Linux". Jak twierdzi Murdock, Stallman najpierw zaproponował nazwę Lignux, jako "Linux z GNU w sercu", ale krótkotrwałe próby użycia tej nazwy na listach Usenetu wywołały liczne drwiny hakerskiej braci, co skłoniło Stallmana do przyjęcia mniej niezręcznej nazwy GNU/Linux. + +Choć niektórzy uznali żądanie Stallmana za niewczesne wyciąganie ręki po czyjąś chwałę, Murdock widział to inaczej. Sięgając myślą wstecz, widzi to jako echo kontrowersji i wzrostu napięcia między projektem GNU i grupą twórców linuksowego jądra. "Wyraźnie było widać pojawiający się rozdźwięk - wspomina. - Richard przejął się tym". + +Przyczyną najgłębszego podziału była glibc. glibc to skrót od GNU C Library (biblioteka GNU C), którym nazwano pakiet programów pozwalających programistom na kierowanie do jądra "wywołań systemowych" (wywołań usług systemowych). W latach 1993 - 1994 glibc była "wąskim gardłem" Linuksa. Ponieważ wielu użytkowników dodawało do jądra swe własne funkcje, ludzie pracujący w projekcie GNU nad utrzymaniem glibc zostali wkrótce przytłoczeni nadmiarem żądań. Część użytkowników Linuksa, sfrustrowanych opóźnieniami i szerzącym się przekonaniem o rozlazłości projektu GNU, domagała się "rozwidlenia" działań i stworzenia równoległej do glibc biblioteki C. + +W świecie hakerskim rozwidlenia są ciekawym zjawiskiem. Choć zasady etyki hakerskiej zezwalają programistom na dowolne przerabianie w kodzie źródłowym wszystkiego, na co mają ochotę, większość woli umieszczać swe zmiany w centralnym pliku źródłowym lub w "drzewie", aby zapewnić zgodność z programami tworzonymi przez innych. Rozwidlenie glibc na tak wczesnym etapie rozwoju systemu groziło potencjalną utratą setek, a być może tysięcy przyszłych linuksowych programistów. Groziło to także zwiększeniem niezgodności Linuksa i reszty systemu GNU, nad którą Stallman i jego grupa nadal pracowali. + +Jako lider projektu GNU Stallman w roku 1991 już doświadczył negatywnych rezultatów rozwidlenia oprogramowania. Grupa twórców Emacsa pracująca dla programistycznej firmy Lucid przeszła do porządku dziennego nad niechęcią Stallmana do uwzględniania części poprawek w podstawowym kodzie GNU Emacsa. Doprowadziło to do powstania równoległej wersji Lucid Emacs oraz wielu kłopotów i starć11. + +Murdock twierdzi, że Debian wyrósł z takich samych chęci rozwidlenia kodu, które leżały u podstaw żądań dotyczących glibc. Dlatego właśnie Stallman domagał się umieszczenia cząstki GNU, gdy tylko Debian stało się dystrybucja zdatną do rozpowszechniania. "Dzięki temu rozwidlające się drogi zbiegły się ponownie, jednakże społeczność linuksowa nadal odczuwała swą odrębność w stosunku do społeczności GNU, co mogło stać się siłą niszczącą jedność". + +Stallman potwierdza opinię Murdocka. Jak twierdzi, powstawaniu wszystkich najważniejszych elementów projektu GNU towarzyszyła groźba rozwidlenia. Mówi, że z początku uważał rozwidlenie za wynik rozczarowania, zawiedzenia nadziei. W przeciwieństwie do szybko działającej nieformalnej grupy twórców jądra Linuksa, pracujący dla GNU programiści starali się pracować wolniej, bez gwałtownego dostosowywania się do okoliczności, ale z myślą o przygotowaniu zmian, które będą miały znaczenie dla działania systemu w długim czasie. Nie obawiali się ostrej krytyki innych twórców kodu. Jednakże w miarę upływu czasu Stallman, czytając e-maile napływające od innych linuksowych programistów, wyczuł malejące zainteresowanie projektem GNU i jego celami. + +"Odkryliśmy, że ludzie uważający się za linuksowych programistów przestają się interesować projektem GNU - mówi Stallman. - Mówili Dlaczego mam się tym przejmować? Co mnie obchodzi projekt GNU? Pracują dla nas, użytkowników Linuksa, a poza tym, co mi do tego. Zastanawiające było, że nawet ludzie używający jakiegoś wariantu systemu GNU sam projekt GNU mieli w nosie." + +Choć kilka wcześniejszych opisów Linuksa jako "wariantu" projektu GNU wydawało mu się chwytem politycznym, Murdock, sympatyzujący z racjami wolnego oprogramowania, uznał za uzasadnione żądanie Stallmana, by Debianowi nadać nazwę GNU/Linux. "Przystałem na to bardziej ze względu na jedność niż z powodu uznania zasług" - mówi. + +Potem nastąpiły żądania natury bardziej technicznej. Choć Murdock przystosował się do żądań politycznych, usztywnił swą pozycję, gdy przyszło do ustalania zasad rozwoju istniejącego oprogramowania. To, co zaczęło się jako manifestacja solidarności, rychło stało się modelem dla innych projektów GNU. + +"Muszę przyznać, że często się z nim nie zgadzałem - mówi Murdock ze śmiechem. - Z Richardem naprawdę trudno współpracować". + +Po uzyskaniu dyplomu Purdue w roku 1996 Murdock postanowił przekazać innym sterowanie rozwijającym się projektem Debian. Obowiązki zarządcy powierzył Bruce'owi Perensowi, hakerowi znanemu z pracy przy Electric Fence, narzędziu uniksowym z licencją GPL. Perens, tak samo jak Murdock, był programistą uniksowym, który zakochał się w GNU/Linuksie, gdy tylko stały się widoczne jego uniksopodobne możliwości. Podobnie jak Murdock sympatyzował z politycznym przesłaniem Stallmana i Fundacji Wolnego Oprogramowania, jednak zachowywał pewien dystans. + +"Pamiętam, że wkrótce po ogłoszeniu manifestu GNU, wypuszczeniu GNU Emacsa i GCC wyczytałem w jakimś artykule prasowym, iż Stallman pracuje jako konsultant Intela - mówi Perens, wspominając swoje pierwsze starcie ze Stallmanem w roku 1980. - Napisałem do niego, pytając, w jaki sposób godzi rolę adwokata wolnego oprogramowania z funkcją konsultanta Intela. Odpowiedział: Pracuję jako konsultant do spraw tworzenia wolnego oprogramowania. Odpowiedź była bardzo grzeczna i myślę, że sensowna". + +Jednakże przyjmując na siebie obowiązki kierowania rozwojem Debiana, Perens uznał starcia Murdocka ze Stallmanem za kłopotliwe. Stając na czele zespołu, podjął strategiczną decyzję o oddzieleniu Debian od Fundacji Wolnego Oprogramowania. "Zdecydowałem, że nie możemy przystać na stallmanowski styl mikrozarządzania" - mówi. + +Według Perensa, ta decyzja zaskoczyła Stallmana, ale był wystarczająco mądry, by przejść nad nią do porządku dziennego. "Odczekał nieco, by ochłonąć i wysłał e-mail, który był istotny dla ustalenia wzajemnych stosunków. Zażądał zachowania nazwy GNU/Linux, na co przystałem. Decyzję podjąłem samodzielnie. Wszyscy odetchnęli z ulgą." + +Po pewnym czasie Debian zdobył opinię hakerskiej wersji Linuksa, podobnie jak Slackware, inna popularna dystrybucja powstała w latach 1993-1994. Jednakże Linux zaczął zdobywać pozycję na komercyjnym rynku uniksowym. W Północnej Karolinie firma uniksowa o nazwie Red Hat przestawiła swoją działalność na linuksowe tory. Jej dyrektorem naczelnym był Robert Young, wcześniej wydawca Linux Journal12, który w roku 1994 zapytał Linusa Torvaldsa, czy żałuje decyzji podporządkowania linuksowego jądra licencji GNU. Odpowiedź Torvaldsa znacznie wpłynęła na sposób postrzegania Linuksa przez Younga. Zamiast dążyć do zepchnięcia go w kąt rynku oprogramowania za pomocą tradycyjnie stosowanej taktyki, Young zaczął się zastanawiać nad zastosowaniem w firmie podejścia debianowskiego, budowania kompletnego systemu operacyjnego z całkowicie wolnych elementów. Cygnus Solutions, firma założona w roku 1990 przez Michaela Tiemanna i Johna Gilmore'a, pokazała już możliwość sprzedawania usług polegających na poprawianiu jakości i dostosowywaniu wolnego oprogramowania do potrzeb klientów. Co by się stało, gdyby Red Hat w ten sam sposób podszedł do Linuksa? + +"W zachodniej tradycji naukowej my dzisiaj stoimy na ramionach gigantów - powtarza Young za Torvaldsem i Newtonem. - W języku biznesu mówimy, że koła nie należy wciąż odkrywać na nowo. O pięknie licencji GPL stanowi oddanie kodu domenie publicznej13. Jeżeli jesteś niezależnym dostawcą oprogramowania i do stworzenia jakiejś aplikacji jest ci potrzebny program wdzwaniający się przez modem (modem dialer), zamiast pisać go od nowa możesz wziąć PPP z Red Hat Linuksa i użyć go jako narzędzia we własnym programie. Jeżeli potrzebujesz zestawu narzędzi graficznych, nie musisz pisać od nowa całej biblioteki graficznej. Po prostu ściągasz GTK14. Nagle masz możliwość korzystania z najlepszego, co dotychczas zostało zrobione. Jako dostawca aplikacji mniej czasu musisz poświęcać na zarządzanie oprogramowaniem i możesz go przeznaczyć na pisanie kodu aplikacji dostosowującej narzędzia do specyficznych potrzeb klienta.". + +Young nie był jedynym zarządcą firmy zainteresowanym możliwościami biznesowego wykorzystania wolnego oprogramowania. Do końca roku 1996 większość firm uniksowych przebudziła się, węsząc zapach "świeżo warzonego" kodu. Sektor linuksowy był dopiero dobre dwa, trzy lata przed pełnym komercyjnym przełomem, ale ci, którzy byli blisko hakerskiej społeczności, już "czuli pismo nosem", przewidywali wielkie wydarzenia. Chip 386 Intela, Internet i World Wide Web uderzyły w rynek jak wielkie oceaniczne fale, ale największą okazał się Linux i korzystające z niego oprogramowanie wraz ze wspólną liberalną polityką licencyjną i wolnością korzystania z kodów źródłowych. + +Dla Iana Murdocka, najpierw zwolennika Stallmana, później odstręczonego przez jego styl zarządzania, napływająca fala zdawała się należną nagrodą i należną karą dla człowieka, który znaczną część życia poświęcił na nadanie wolnemu oprogramowaniu własnej tożsamości. Jak wielu linuksowych aficionados, Murdock widział, jak naprawdę wszystko się działo. Był świadkiem oryginalnego ostrzeżenie Torvaldsa, że Linux "jest tylko hobby", a także wyznania Torvaldsa pod adresem twórcy Miniksa Andrew Tanenbauma, że: "gdyby jądro GNU było tego lata gotowe, w ogóle nie przystępowałbym do realizacji swojego projektu"15. Tak jak inni Murdock widział możliwości, które zostały zmarnowane. Odczuwał także podniecenie, jakie niosło obserwowanie nowych możliwości niesionych przez każde nowe "włókno" Internetu. + +"Dzięki Linuksowi tkwiłem w tej zabawie od początku - wspomina. - Mieliśmy wówczas coś do zrobienia, aby jakoś wykorzystać upływający czas. Jeżeli poczytacie tamte stare dyskusje (comp.os.minix), wyczujecie sentymentalną nutę: robiliśmy coś, w co mogliśmy się bawić dopóty, dopóki nie pojawi się gotowy HURD. Ludzie byli podnieceni. To zabawne, ale podejrzewam, że gdyby HURD powstał wcześniej, Linux nigdy by się nie przydarzył". + +Przed końcem roku 1996 pojawiły się kwestie sporne. Użytkownicy dyskutowali, jak to nazwać - Linux, a może GNU/Linux. 36 miesięcy pozostawionych na stworzenie jądra dobiegło kresu, okno zostało zatrzaśnięte, co oznacza, że gdyby nawet projekt GNU zbudował wreszcie swe jądro HURD, miałoby ono niewielkie szanse na zauważenie przez kogoś spoza ścisłego grona hakerskiej społeczności. Pierwszy uniksopodobny wolny system operacyjny już istniał i nabierał pędu. Hakerom pozostało jedynie oczekiwanie na kolejną falę, która miała nadciągnąć i spaść na ich głowy. Nawet na kudłatą głowę Richarda M. Stallmana. + +Gotową na to lub nie. + + +Rozdział 11. +OprogramowanieOpen Source1 + +W listopadzie 1995 Peter Salus, członek Fundacji Wolnego Oprogramowania, autor książki z roku 1994 A Quarter Century of Unix (Ćwierć wieku Uniksa), przesłał do listy dyskusyjnej zajmującej się systemami projektu GNU prośbę o nadsyłanie artykułów konferencyjnych. Conference on Freely Redistributable Software (konferencja na temat swobodnie rozpowszechnianego oprogramowania) miała być zorganizowana w Cambridge w stanie Massachusetts w lutym 1996, a Salus, wybrany na jej przewodniczącego, chciał w ten sposób zawiadomić o tym kolegów hakerów. Sponsorowana przez Fundację Wolnego Oprogramowania, miała stać się pierwszą konferencją inżynierii oprogramowania w całości poświęconą wolnemu oprogramowaniu. Dla zademonstrowania jedności zaproszono także programistów z innych ruchów wolnego oprogramowania zajmujących się "różnymi aspektami GNU, Linuksa, NetBSD, 386BSD, FreeBSD, Perla, Tcl/tk oraz innych narzędzi, których kod był wolnodostępny i mógł być swobodnie rozpowszechniany". Salus pisał: + + Przez ostatnie 15 lat wolne i tanie oprogramowanie stało się wszechobecne. Ta konferencja ma zebrać razem wszystkich, którzy dokonali implementacji różnego rodzaju wolnego oprogramowania i jego wydawców (na różnego rodzaju nośnikach). Przewidziane są wykłady informacyjne i artykuły odnoszące się do tematu, a także przewodnie wystąpienia Linusa Torvaldsa i Richarda Stallmana2. + +Jednym z pierwszych, do których dotarł e-mail Salusa, był Eric S. Raymond, jeden z członków komitetu tej konferencji. Choć nie kierował żadnym projektem, ani firmą, jak większość innych z listy, zdobył sobie przyzwoitą reputację w społeczności hakerskiej jako jeden ludzi z najaktywniej biorących udział w GNU Emacs i jako wydawca The New Hacker Dictionary (Nowego słownika hakerskiego), książkowej wersji liczącego się już pliku słownikowego Jargon File. + +Dla Raymonda konferencja w roku 1996 była oczekiwanym zdarzeniem. W latach osiemdziesiątych brał aktywny udział w projekcie GNU, po czym w roku 1992 usunął się na bok, zrażony - jak wielu przed nim - mikrozarządzaniem Stallmana. "Richard zrobił awanturę z powodu moich nieautoryzowanych modyfikacji, które wprowadziłem podczas czyszczenia emacsowych bibliotek lispowych - wspomina. - Tak mnie to sfrustrowało, że postanowiłem dalej z nim nie współpracować". + +Pomimo swego odejścia Raymond pozostał członkiem społeczności wolnego oprogramowania. Na tyle aktywnym, by gorliwie przyklasnąć pomysłowi Salusa, gdy ten zaproponował, aby na konferencji obok siebie wystąpili Torvalds i Stallman. Stallman reprezentował stary zespół hakerski związany z ITS/Unix, zaś Torvalds - młodą i dynamiczną grupę hakerów linuksowych. Ich wystąpienia na tej samej konferencji symbolizowały jedność, która mogła przynieść pożądane owoce zwłaszcza dla młodych (tzn. poniżej czterdziestego roku życia) i ambitnych hakerów w rodzaju Raymonda, co on podsumował następująco "Poczułem, jakbym stał każdą nogą w innym obozie". + +W okresie przed konferencją napięcie między tymi obydwoma obozami stawało się coraz bardziej wyczuwalne. Łączyła je wspólna chęć zobaczenia w naturze fińskiego "cudownego dziecka". Ku zaskoczeniu wszystkich Torvalds okazał się przyjemnym, czarującym mówcą. Mówiąc jedynie z lekkim szwedzkim akcentem, zdumiał audytorium błyskotliwym, zabarwionym autoironią dowcipem3. "Jeszcze bardziej zdumiewały jego cięte, rzucane mimochodem złośliwostki pod adresem innych hakerów, nie wyłączając Stallmana" - twierdzi Raymond. Do końca konferencji wszystkich młodszych i starszych uczestników ujął jego lekki, pół hakerski, pół odmienny sposób bycia. + +"Był to moment przełomowy - wspomina Raymond. - Przed rokiem 1996 Richard był jedynym uznanym przywódcą ideologicznym całej społeczności. Dysydenci nie występowali publicznie. Torvalds był tym, który złamał to tabu". + +Do następnego przełamania tabu doszło pod koniec konferencji. Podczas dyskusji o nadciągającej dominacji Microsoftu i jego systemu Windows Torvalds stwierdził, że podoba mu się PowerPoint, program Microsoftu do przygotowywania i pokazywania prezentacji. Dla hakerskich purystów ideologicznych było to jak chełpienie się mormona w świątyni swym zamiłowaniem do whisky, zaś dla Torvaldsa i jego zwolenników była to po prostu opinia zgodna ze zdrowym rozsądkiem. Dlaczego unikać wartościowych programów komercyjnych? Celem hakera jest wykonanie zadania, a nie cierpienie dla idei. + +"Było to szokujące stwierdzenie - wspomina Raymond. - Mógł sobie na nie pozwolić, gdyż w latach 1995 i 1996 gwałtownie zdobywał coraz szersze wpływy". + +Stallman z kolei nie pamięta napięcia narastającego podczas konferencji w roku 1996, ale pozostała mu w pamięci impertynencja Torvaldsa. "W dokumentacji Linuksa znalazło się stwierdzenie, by wydrukować wszystkie standardy programistyczne GNU, a potem je podrzeć - przytacza jeden przykład. - Dobrze, mógł się nie zgadzać z naszymi konwencjami, ale nie musiał wyrażać tego w tak arogancki sposób. Czyż nie mógł powiedzieć po prostu Ja tak to widzę? Nie byłoby w tym demonstracji wrogości". + +Gorące przyjęcie Torvaldsa przez innych hakerów jedynie potwierdziło podejrzenia Raymonda. Główna linia oddzielająca twórców Linuksa i GNU/Linuksa zgadzała się z podziałem pokoleniowym. Wielu hakerów linuksowych, jak Torvalds, wyrosła w świecie oprogramowania komercyjnego z zastrzeżonymi prawami własności. Jeżeli program nie jest zły, dlaczego go unikać tylko z powodu rodzaju licencji? Gdzieś tam w przestrzeni wolnego oprogramowania kiełkował program, który być może kiedyś zostanie przekształcony w wolny odpowiednik PowerPointa. Ale póki się to nie stanie, dlaczego zazdrościć Microsoftowi i zwalczać go? + +Jako uczestnik projektu GNU z większym stażem Raymond wyczuwał rosnące napięcie między Stallmanem i Torvaldsem. W ciągu dekady, która upłynęła od rozpoczęcia projektu GNU, Stallman zdobył budzącą respekt reputację doskonałego programisty. Zdobył sobie również opinię człowieka nieprzejednanego zarówno w dziedzinie programowania, jak i zarządzania ludźmi. Krótko przed konferencją z roku 1996 Fundację Wolnego Oprogramowania opuścił cały personel zrażony postępowaniem Stallmana. Brian Youmans, obecny pracownik FSF, przyjęty przez Salusa po zbiorowym odejściu innych, wspomina, że "Wówczas Peter (Salus) był jedyną osobą pracującą w biurze". + +Zbiorowe odejście pracowników jedynie potwierdziło podejrzenia Raymonda, że ostatnie opóźnienia, takie jak z HURD-em i ostatnie kłopoty, takie jak ze schizmą Lucid-Emacs wynikały nie z trudności w tworzeniu kodu, lecz z nieudolnego zarządzania projektem. Wkrótce po Freely Redistributable Software Conference Raymond rozpoczął prace nad swym własnym projektem-pupilkiem, narzędziem popmailowym (klienta pocztowego) o nazwie "fetchmail". Wzorując się na Torvaldsie, udostępnił swój program z obietnicą uaktualniania kodu źródłowego tak szybko i tak często, jak tylko będzie to możliwe. Gdy użytkownicy zaczęli nadsyłać raporty o błędach i sugestie zmian, spodziewał się jednego wielkiego bałaganu, ale ku swemu zaskoczeniu odkrył, że wszystko stanowiło zwartą całość. Analizując zwycięstwo podejścia Torvaldsa, doszedł do wniosku, że: używając Internetu jako "płytki Petriego4", a także narzędzia do dokonania surowej kontroli i naturalnej selekcji, Torvalds stworzył ewolucyjny model działania wolny od centralnego planowania. + +Ponadto, jak sobie uświadomił Raymond, Torvalds znalazł sposób obejścia prawa Brooksa. Prawo to, po raz pierwszy sformułowane przez Freda P. Brooksa, menadżera projektu OS/360 w firmie IBM i autora wydanej w roku 1975 książki The Mythical Man-Month5, głosi że dodawanie kolejnych programistów6 do projektu powoduje jedynie dalsze jego opóźnienie. Raymond, jak większość hakerów wierzący dotychczas, że zupa staje się tym gorsza, im więcej kucharzy, odkrył, że Torvaldsowi udało się pokazać, że jest przeciwnie. Zapraszając do kuchni coraz więcej i więcej kucharzy, czynił programistyczną zupę coraz lepszą7. + +Raymond przelał swe spostrzeżenia na papier. Nadał im postać przemówienia pt. "The Cathedral and the Bazaar" (Katedra i bazar), które zapewne wygłosił dla grupy przyjaciół i sąsiadów z Chester County w Pensylwanii. Sposobowi zarządzania projektem GNU przeciwstawił tam styl zarządzania stosowany przez Torvaldsa i pozostałych hakerów z grupy tworzącej jądro Linuksa. Jak twierdzi, spotkało się to od razu z entuzjastycznym przyjęciem, choć nie tak entuzjastycznym, jak na zorganizowanym na wiosnę następnego roku (1997) kongresie niemieckich użytkowników Linuksa. + +"Na tym kongresie po moim przemówieniu nastąpiła owacja na stojąco - wspomina Raymond. - Sądzę, że wynikało to z dwóch przyczyn. Po pierwsze, ludzie byli podekscytowani tym, co usłyszeli, a po drugie, cieszyli się, że zrozumieli pomimo bariery językowej". + +Ostatecznie przemówienie zostało opublikowane pod tym samym tytułem The Cathedral and the Bazaar. Tytuł był związany z główną podkreślaną przez Raymonda analogią. Programy GNU to były "katedry", monumentalne, centralnie zaplanowane pomniki hakerskiej etyki, tworzone z myślą o wytrzymaniu próby czasu. Zaś Linux przypominał "wielki rozgadany bazar", był oprogramowaniem tworzonym przez luźną, nieznającą centralizacji, dynamiczną naturę Internetu. + +Podtekstem tej analogii było porównanie Stallmana z Torvaldsem - Stallman był klasycznym architektem "katedr", wizjonerem, który potrafił zniknąć na 18 miesięcy, by potem pojawić się z czymś takim jak GNU C Compiler, zaś Torvalds przypominał raczej genialnego gospodarza przyjęcia. Pozwalając innym wieść dyskusje i wkraczając jedynie, gdy wszyscy przy stole potrzebowali punktu odniesienia, stworzył model tworzenia oprogramowania będący odbiciem jego własnej osobowości skłonnej do pozostawania w cieniu wydarzeń i działania zza kulis. Z jego punktu widzenia nadrzędnym zadaniem menadżera nie jest narzucanie sterowania i kontroli lecz zapewnienie przepływu idei. + +Podsumowując, Raymond stwierdził, że: "największym hakerskim osiągnięciem Linusa nie jest sama konstrukcja jądra Linuksa lecz stworzenie i konsekwentna realizacja nowego modelu tworzenia oprogramowania"8. + +Doceniając menedżerski sukces Torvaldsa, Raymond odniósł własny sukces. Jednym ze słuchających go na niemieckim kongresie linuksowym był Tim O'Reilly z O'Reilly & Associates, firmy specjalizującej się w wydawaniu podręczników informatycznych i książek w różny sposób dotyczących programowania i oprogramowania (wydawcy również tej książki). Po wysłuchaniu przemówienia Raymonda O'Reilly od razu poprosił go o powtórzenie go na organizowanej przez firmę inauguracyjnej konferencji poświęconej językowi Perl, która miała się odbyć nieco później w tym samym roku w Monterey w Kalifornii. + +Choć głównym tematem konferencji był Perl, język skryptowy stworzony przez uniksowego hakera Larry'ego Walla, O'Reilly zapewnił Raymonda, że inne zagadnienia dotyczące technologii wolnego oprogramowania również będą poruszane. Miał nadzieję, że coraz większe komercyjne zainteresowanie Linuksem i Apachem, popularnym wolnym serwerem WWW, pozwoli na rozpowszechnienie informacji o roli wolnego programowania w tworzeniu struktury Internetu. Od przyjaznych dla WWW języków w rodzaju Perla i Pythona, przez działające "zza kulis" takie programy jak BIND (ang. Berkeley Internet Naming Daemon), który pozwala użytkownikom stosować łatwe do zapamiętania nazwy domen (np. amazon.com)9 zamiast tajemniczych numerów IP, po najpopularniejszy program pocztowy sendmail - wolne oprogramowanie zaczynało stanowić coraz bardziej istotną część Internetu. Ale tym, którzy je tworzyli, brakowało samoświadomości, tak jak brakuje jej kolonii mrówek budujących piękny kopiec przez dokładanie pojedynczych ziarnek piasku. O'Reilly uznał, że przemówienie Raymonda nadaje się do jej rozbudzenia. Pokaże też, że ruch wolnego programowania nie zaczął się i nie kończy się na projekcie GNU. Właśnie języki Perl i Python oraz oprogramowanie internetowe BIND, Apache i sendmail były najlepszymi dowodami, że wolne oprogramowanie wszędzie znajduje swe miejsce, a jego znaczenie rośnie. Zapewnił także Raymonda, że spotka się z równie gorącym przyjęciem, jak w Niemczech, a może nawet gorętszym. + +Miał rację. "Tym razem owacja na stojąca spotkała mnie już przed przemówieniem, a nie dopiero po nim" - mówi Raymond ze śmiechem. + +Jak było do przewidzenia, audytorium składało się nie tylko z hakerów, lecz również z innych osób zainteresowanych rosnącą rolą ruchu wolnego oprogramowania. Jedna grupa reprezentowała Netscape z Mountain View w Kalifornii, firmę, której trzyletnia walka z Microsoftem o dominację na rynku przeglądarek WWW właśnie dobiegała końca. + +Członkowie tej grupy, zaintrygowani przemówieniem Raymonda i dążący za wszelką cenę do odzyskania utraconych udziałów w rynku, przesłali komunikat do głównej siedziby firmy. Kilka miesięcy później, w styczniu 1998 Netscape ogłosił plan opublikowania kodu źródłowego swego flagowego produktu - przeglądarki WWW Navigator, licząc na wsparcie hakerów w dalszym rozwoju produktu. + +Gdy dyrektor naczelny Netcape'a Jim Barksdale stwierdził, że artykuł Raymonda Cathedral and the Bazaar miał istotny wpływ na podjęcie tej decyzji, firma natychmiast uznała go za hakerską osobistość. Zdecydowany nie zmarnować nadarzającej się okazji, Raymond udał się na zachód, by udzielać wywiadów, doradzać rządzącym Netscapem oraz wziąć udział w ostatniej fazie uroczystości udostępnienia kodu źródłowego Navigatora. Kod ten nosił nazwę "Mozilla", co było odniesieniem do jego gargantuicznych rozmiarów - 30 milionów linii oraz dziedzictwa. Mozilla była komercyjnym odrostem programu Mosaic, przeglądarki stworzonej przez Marca Andressena z University of Illinois i doskonałym potwierdzeniem faktu, że większość programistów, budując nowy program, woli korzystać ze starych, dostępnych do modyfikacji kodów. + +Będąc w Kalifornii, Raymond znalazł także czas na odwiedzenie VA Research, firmy z Santa Clara sprzedającej stacje robocze z preinstalowanym systemem GNU/Linux. Zdecydował się tam na spotkanie z niewieloma osobami: z założycielem firmy Larrym Augustinem, kilkoma pracownikami oraz z Christine Peterson, prezesem zarządu Foresight Institute10, "think tanku11" z Doliny Krzemowej zajmującego się nanotechnologią. + +Plan spotkania został ograniczony do jednego zagadnienia: w jaki sposób sprawić, aby inne firmy podążyły tą samą drogą co Netscape? Raymond nie pamięta rozmowy, ale zapamiętał pierwsze zgłoszone zażalenie. Pomimo wysiłków Stallmana i innych hakerów, by uświadomić ludziom, że słowo "wolny" w określeniu "wolne oprogramowanie" oznacza uwolnienie od ograniczeń, a nie od kosztów, świadomość tego faktu jeszcze nie stała się powszechna. Większość zarządzających instytucjami, słysząc ten termin po raz pierwszy, uważa słowo "wolny" za synonim "zerowych kosztów12" i odrzuca wszelkie możliwości innej interpretacji. Dopóki hakerzy nie rozwiążą problemu tej podwójnej interpretacji, dopóty ruch nie osiągnie sukcesów, nawet po decyzji Netscape'a. + +Peterson, której organizacja była żywo zainteresowana dalszym rozwojem wolnego oprogramowania, zaproponowała termin alternatywny: oprogramowanie open source. + +Patrząc wstecz, Peterson twierdzi, że termin "oprogramowanie open source" wymyśliła podczas omawiania decyzji Netscape'a z przyjacielem z branży public relations13. Nie pamięta gdzie na ten pomysł wpadła, a także czy go skądś zapożyczyła, ale pamięta, że przyjacielowi się on nie podobał14. + +Na spotkaniu reakcja była diametralnie różna. "Wahałam się, czy tę nazwę sugerować - wspomina Peterson. - Nie miałam żadnych stałych kontaktów z tą grupą, więc użyłam terminu przypadkowo, bez podkreślania, że jest nowy." Ku jej zaskoczeniu, nowe określenie chwyciło. Pod koniec spotkania większość uczestników, łącznie z Raymondem, zdawała się używać go z przyjemnością. + +Raymond twierdzi, że publicznie terminu "oprogramowanie open source" zamiast "wolne oprogramowanie" po raz pierwszy użył dopiero w dzień lub dwa po rozmowie na lunchu w sprawie Mozilli, podczas której O'Reilly zaproponował zorganizowanie "spotkania na szczycie" w sprawie wolnego oprogramowania (Freeware Summit). O'Reilly chciał zwrócić uwagę mediów i społeczeństwa również na inne realizowane projekty, które także wpłynęły na decyzję Netscape'a o uwolnieniu Mozilli. "Wszyscy ci faceci mieli tak wiele wspólnego, iż trudno było pojąć, że nic o sobie nawzajem nie wiedzą - twierdził O'Reilly. - Chciałem, aby świat się dowiedział, jak wielki był dotychczasowy wpływ kultury wolnego oprogramowania. Ludzie wiele tracili, nie znając tej tradycji". + +Układając listę zaproszonych, O'Reilly podjął decyzję mającą dalekosiężne konsekwencje polityczne. Zdecydował się ograniczyć zaproszenia jedynie do twórców oprogramowania z zachodniego wybrzeża, takich jak Wall, Eric Allman - twórca sendmaila i Paul Vixie - twórca BIND-a. Były oczywiście wyjątki, jak pochodzący z Pensylwanii Raymond przebywający akurat w mieście z powodu spotkania w sprawie Mozilli. Został także zaproszony mieszkający w Wirginii Guido van Rossum, twórca Phytona. "Zaprosił go bez uzgadniania ze mną Frank Willison, mój redaktor naczelny i najlepszy wśród nas znawca Pythona - wspomina O'Reilly. - Byłem zadowolony z jego przyjazdu, choć, wedle moich zamierzeń, miało to być lokalne spotkanie". + +Niektórzy uznali, że niezaproszenie Stallmana było afrontem i zadzieraniem nosa. "Z tego powodu zdecydowałem, by nie brać w tym udziału" - mówi Perens, wspominając "szczyt". Raymond, który przyszedł, wspomina, że argumentował za zaproszeniem Stallmana, ale bez skutku. Oskarżenie o afront zostało wzmocnione faktem, że między gospodarzem spotkania O'Reillym i Stalmanem istniała zadawniona i powszechnie znana wrogość z powodu sporu o prawa autorskie instrukcji do oprogramowania. Przed spotkaniem Stallman ogłosił, że instrukcje do wolnego oprogramowania można dowolnie kopiować i modyfikować tak samo jak samo wolne oprogramowanie. Tymczasem O'Reilly argumentował, że komercyjne podręczniki są wartością dodaną, zwiększającą użyteczność wolnego oprogramowania, dzięki czemu staje się ono dostępne dla szerszych kręgów społeczeństwa. Przedmiotem sporu był również tytuł spotkania - Stallman upierał się przy "Free Software", zamiast mającego mniejszą wagę polityczną "Freeware"15. + +Patrząc wstecz, O'Reilly nie uważa, że niezaproszenie Stallmana było afrontem. "Do tego czasu nigdy nie spotkałem się osobiście ze Stallmanem, ale wymiana e-maili między nami świadczyła, że jest on osobą nieskłonną do jakichkolwiek kompromisów i niechętną do podejmowania dyskusji. Chciałem, aby na spotkaniu była reprezentowana tradycja GNU i dlatego zaprosiłem Johna Gilmore'a i Michala Tiemanna, których znałem osobiście i którzy byli szalenie przywiązani do GPL, ale chętniej dyskutowali o zaletach i słabościach projektów wolnego oprogramowania i jego tradycji. Mając na uwadze rwetes, który spowodowało pominięcie Richarda, sądzę, że powinienem go zaprosić, ale nadal nie uważam, że mój błąd można interpretować jako demonstrację braku szacunku dla projektu GNU i samego Richarda". + +Z afrontem lub bez, O'Reilly i Raymond twierdzą, że termin "open source" został przyjęty bez oporów przez tak znaczną większość uczestników spotkania, że można to uważać za sukces. Podzielili się oni pomysłami i doświadczeniami oraz uczestniczyli w burzy mózgów, której celem było znalezienie najlepszych sposobów poprawienia wizerunku wolnego oprogramowania. Zastanawiano się głównie, jak wykorzystać sukces wolnego oprogramowania, zwłaszcza w świecie Internetu, w wielkiej rozgrywce GNU/Linuksa z Mirosoft Windows. Ale tak jak podczas wcześniejszego spotkania w VA dyskusja szybko zbiegła na problemy związane z samym terminem "wolne oprogramowanie". Gospodarz spotkania, O'Reily, pamięta szczególnie refleksyjny komentarz biorącego udział w spotkaniu Torvaldsa: + +"Linus, który niedawno przeniósł się do Krzemowej Doliny, wyjaśnił, że dopiero ostatnio dowiedział się, że po angielsku słowo free ma dwa znaczenia: wolny i bezpłatny". + +Michael Tiemann, założyciel Cygnusa, zaproponował rozwiązanie problemu przez zastąpienie terminu "free software" (wolne oprogramowanie) przez "sourceware" (mniej więcej oprogramowanie ze źródłem), ale jak wspomina O'Reilly, "nikomu się to zbytnio nie spodobało. Wówczas Eric zaproponował open source". + +Choć niektórym termin bardzo się spodobał, niewielu poparło zmianę oficjalnej terminologii. Na koniec jednodniowej konferencji poddano pod głosowanie trzy nazwy: "free software", "open source" i "sourceware". O'Reilly twierdzi, że termin "open source" zwyciężył 9 głosami na 15 głosujących. Choć niektórzy zgłaszali obiekcje, ostatecznie zgodzono się na używanie wybranej nazwy przy późniejszych kontaktach z prasą. "Chcieliśmy zamanifestować solidarność" - mówi O'Reilly. + +Wkrótce nowe określenie znalazło swe miejsce w narodowym słowniku. Zaraz po zakończeniu spotkania O'Reilly zaprosił jego uczestników na konferencję prasową, na której zjawili się reporterzy z "New York Timesa", "Wall Street Journal" i innych liczących się pism. W ciągu kilku miesięcy twarz Torvaldsa znalazła się na okładce magazynu Forbes, w którego wnętrzu umieszczono zdjęcia Stallmana, Larry'ego Walla - twórcy Perla i Briana Behlendorfa - lidera grupy, która stworzyła Apache. Oprogramowanie "open source" stało się rzeczywiście otwarte dla biznesu. + +Dla biorących udział w spotkaniu, np. dla Tiemanna, najważniejsza była manifestacja solidarności. Choć jego firma odniosła znaczny sukces, sprzedając narzędzia wolnego oprogramowania i związane z nimi usługi, rozumiał trudności piętrzące się przed innymi programistami i przedsiębiorcami. + +"Chyba nikt nie zaprzeczy, że używanie słowa free w wielu sytuacjach powoduje zamieszanie - mówi Tiemann. - Open source robi wrażenie terminu bardziej przyjaznego i sensownego dla biznesu, zaś wolne oprogramowanie było terminem, za którym stały racje moralne. Uznaliśmy, że lepiej na dobre i na złe przyłączyć się do tłumu zwolenników oprogramowania open source." + +Stallman nie śpieszył się z wyrażeniem opinii o nowym terminie "open source". Najpierw krótko zastanawiał się nad przyjęciem nowej nazwy, lecz szybko ją odrzucił. "Wiem o tym, gdyż z nim na ten temat rozmawiałem" - twierdzi Raymond. + +Przed końcem roku 1998 Stallman sformułował swoje stanowisko: "open source" jest nazwą pomocną przy informowaniu o technicznych korzyściach stosowania wolnego oprogramowania, lecz ośmielał mówców do łagodzenia swego stanowiska w kwestiach dotyczących wolnego oprogramowania. Z powodu tej wady Stallman postanowił pozostać wierny starej nazwie wolnego oprogramowania. + +Na LinuxWorld Convention and Expo w roku 1999 podsumował swoje stanowisko i mimo iż nazwany został przez Torvaldsa "przemijającą częścią" linuksowej społeczności, błagał kolegów hakerów o nieuleganie powabom łatwego kompromisu. + +"Ponieważ pokazaliśmy już, na jak wiele nas stać, nie musimy desperacko zabiegać o współpracę firm i kompromisowo rezygnować z wyznaczonych celów - mówił podczas dyskusji panelowej. - Pozwólmy im na złożenie oferty, którą moglibyśmy zaakceptować. Nie musimy nic zmieniać w naszym postępowaniu, aby pozyskać ich pomoc. Dążąc we właściwą stronę, możecie najpierw wykonać jeden krok, potem następny, potem jeszcze jeden i jeszcze jeden, aż wreszcie dotrzecie do celu. Lub możecie działać połowicznie i przystać na kompromis, lecz wówczas nigdy nie wykonacie drugiego kroku i nigdy nie dotrzecie do celu." + +Ale już przed konferencją LinuxWorld dążenie Stallmana do zdystansowania się od swych bardziej ugodowych towarzyszy stawało się coraz bardziej widoczne. W kilka miesięcy po Freeware Summit O'Reilly zorganizował drugą doroczną konferencję języka Perl (Perl Conference). Tym razem Stallman był obecny. Podczas dyskusji panelowej, na której IBM ogłosił decyzję o umieszczeniu w swej ofercie komercyjnej wolnego serwera WWW Apache, zawładnął mikrofonem, aby przed zebraną publicznością wygłosić tyradę przeciwko Johnowi Ousterhoutowi, twórcy języka skryptowego Tcl. Nazwał Ousterhouta pasożytem żerującym na społeczności wolnego oprogramowania, a to z powodu sprzedawania przez jego firmę Scriptics komercyjnej wersji Tcl. "Nie uważam, aby do dalszego istnienia Tcl potrzebne było istnienie Scriptics" - głosił Stallman pomimo syków zgromadzonych słuchaczy16. + +"Była to obrzydliwa scena - wspomina Rich Morin z Prime Time Freeware. - John zrobił rzeczy, które należy docenić: Tcl, Tk i Sprite17. To jego znaczny dorobek". + +Pomimo sympatii dla Stallmana i jego osiągnięć wyczuwa się u Morina empatię wobec słuchaczy, którzy z powodu jego niestosownego zachowania znaleźli się w krępującej sytuacji. + +Wybuch Stallmana na Perl Conference odstraszył innego potencjalnego sympatyka, Bruce'a Perensa. W roku 1998 Eric Raymond zaproponował stworzenie Open Source Initiative czyli OSI, organizacji, która miała strzec porządku stosowania nazwy "open source" i określać zakres stosowania dla firm zainteresowanych rozwijaniem własnych programów. Raymond poprosił Perensa o sformułowanie definicji18. + +Perens odszedł potem z OSI, wyrażając żal, że organizacja stanęła w opozycji do Stallmana i Fundacji Wolnego Oprogramowania (FSF). Patrząc wstecz, uznaje ówczesną potrzebę zdefiniowania wolnego oprogramowania poza auspicjami FSF i rozumie, dlaczego część hakerów nadal woli trzymać się od niej z daleka. "Rzeczywiście, lubię i szanuję Richarda - twierdzi - ale sądzę, że wykonałby swoje zadanie lepiej, gdyby dokładniej wyważał racje. Mógłby przez kilka miesięcy odpocząć od wolnego oprogramowania". + +Jego monomaniakalna energia nie była w stanie przeciwstawić się oddziaływaniu na opinię publiczną grupy z rozmachem proponującej oprogramowanie open source. Gdy w sierpniu 1998 producent procesorów Intel wykupił część akcji firmy Red Hat, dostawcy GNU/Linuksa, "New York Times" w omawiającym ten zakup artykule napisał, że firma ta jest produktem ruchu "nazywanego alternatywnie ruchem wolnego oprogramowania lub oprogramowania open source"19. Sześć miesięcy później John Markoff w artykule na temat Apple Computer poinformował o "adoptowaniu" przez tę firmę serwera Apache należącego do oprogramowania open source, umieszczając to określenie w tytule20. + +Zbiegło się to z dążeniem wielu firm, które zaczęły używać terminu "open source". Jeszcze przed sierpniem 1999 Red Hat i inne firmy zajmujące się oprogramowaniem open source i stosujące tę nazwę zaczęły sprzedawać swe akcje na giełdzie Nasdaq21. W grudniu VA Linux, poprzednio VA Research, osiągnęło historyczne przebicie ceny IPO22. Cena otwarcia wynosząca 30 dolarów za akcję podskoczyła gwałtownie aż do 300 dolarów, by przed zamknięciem spaść jedynie do 239 dolarów. Szczęśliwcy, którym udało się kupić akcje po cenie zbliżonej do dolnego progu, mogli osiągnąć 698% zysku, co było rekordem giełdy Nasdaq. + +Wśród nich był Eric Raymond, który jako członek zarządu od czasów uruchomienia Mozilli przy debiucie giełdowym VA Linux otrzymał 150 tys. akcji. Zdumiał się faktem, że opisanie odmienności stylów menedżerskich Stallmana i Torvaldsa przyniosło mu potencjalny majątek wart 36 milionów dolarów i zasiadł do napisania kolejnego artykułu. Rozważał w nim wzajemne zależności etyki hakerskiej i bogactwa: + + Ostatnio dziennikarze często pytają, czy sądzę, że społeczność open source zostanie skorumpowana napływem wielkich pieniędzy. Komercyjne zapotrzebowanie na programistów od dawna jest tak duże, że wszyscy, których zarabianie pieniędzy bardzo pociągało, już odeszli. W naszej społeczności została już dokonana autoselekcja i pozostali ci, dla których najważniejsze było co innego: duma, artystyczna pasja i inne podobne rzeczy.23 + +Nie wiadomo, w jakim stopniu podobne komentarze uśmierzyły podejrzenia, że Raymond i inni twórcy ruchu open source działali po prostu dla pieniędzy, ale niewątpliwie uświadomili hakerskiej społeczności, że wszystko, czego potrzeba, aby sprzedać koncepcję wolnego oprogramowania, to życzliwe nastawienie i trafiająca do adresatów informacja. Zamiast za wszelką cenę zwalczać rynek, jak robił to Stallman, Raymond i Torvalds oraz inni, nowi przywódcy hakerskiej społeczności przyjęli o wiele luźniejsze zasady działania, ignorując pewne obszary rynku, a oddziałując na inne. Zamiast grać rolę tkwiących na uczelniach wygnańców, wykorzystywali zdobyte poważanie do powiększania swych możliwości. + +"W swoje najgorsze dni Richard wierzy, że Linus Torvalds i ja zmówiliśmy się, by przejąć jego rewolucję - mówi Raymond. - Odrzucenie przez niego terminu open source i jego rozmyślne, uparte tworzenie ideologicznego rozłamu bierze się, jak sądzę, z mieszaniny idealizmu i chęci zawłaszczania terytorium. Wielu ludzi sądzi, że wynika to z jego ego. Nie wierzę w to. Po prostu idea wolności oprogramowania tak bardzo stopiła się z jego osobowością, że wszelkie jej zagrożenia odczuwa jako groźbę wobec siebie samego". + +Ironią losu może się wydawać fakt, że ani open source ani jego zwolennicy nie zmniejszyli przywódczej roli Stallmana. Ciągną za nim następni kandydaci do nawrócenia. Jednakże rzucone przez Raymonda oskarżenie o dążenie do panowania na własnym terytorium, nic nie straciło ze swej przeklętej aktualności. Jest wiele przykładów, gdy chwyta on za broń bardziej ze zwyczaju niż potrzeby. Takim działaniem było na przykład wstępne odrzucenie jądra Linuksa oraz jego trwająca wciąż niechęć do działań politycznych poza światem oprogramowania. + +Ostatnie debaty na temat oprogramowania open source również pokazują, iż Stallman pozostaje przywiązany do metod, które dotychczas pozwalały mu na działanie. "Jedną z podstawowych cech jego charakteru jest niewzruszoność - mówi Ian Murdock. - Może przez dziesięciolecie tkwić w jednym miejscu, czekając, aż wokół zbiorą się ludzie, którzy podzielą jego poglądy". + +Murdock uważa tę niewzruszoność natury Stallmana za wartościową i inspirującą. Stalman może już nie być jedynym przywódcą ruchu wolnego oprogramowania, ale pozostanie dla tej społeczności gwiazdą świecącą nad biegunem. "Możecie być pewni, że zachowa wierność swym poglądom - mówi Murdock, - czego większość ludzi u niego nie lubi, ale nawet nie zgadzając się z nim, musi przyznać, że go szanuje". + + +Rozdział 12. +Krótka podróż przez hakerskie piekło + +Richard Stallman bez zmrużenia powiek spoglądał przez przednią szybę wynajętego samochodu, oczekując na zmianę świateł, by ruszyć w dalszą drogę przez centrum Kihei. + +Jechaliśmy do pobliskiego miasta Pa'ia, gdzie mniej więcej przed godziną powinniśmy się byli spotkać na obiedzie z kilkoma programistami i ich żonami. + +Znaleźliśmy się tu w dwie godziny po wykładzie Stallmana w Maui High Performance Center, a Kihei, które przed wykładem zdawało się być miastem przyjaznym dla przybyszów, teraz sprawiało kłopoty na każdym kroku. Jak wszystkie kurorty nadmorskie zdawało się być przedmieściem rozciągniętym nad miarę w jednym wymiarze. Jadąc wzdłuż głównej ulicy wypełnionej niekończącymi się straganami z hamburgerami, agencjami nieruchomości i sklepami z bikini, miałem wrażenie, że jesteśmy drobinami uwięzionymi w blaszanym pancerzu samochodu i przesuwającymi się wzdłuż przewodu pokarmowego gigantycznego handlowego potwora. Wrażenie to potęgował brak dodatkowych pasów dla ruchu lokalnego, co powodowało, że na jedynej zatłoczonej jezdni posuwanie się do przodu przypominało konwulsje drgającej sprężyny. Zielone światła zapalające się 200 metrów przed nami, gdy do nich dojeżdżaliśmy, zmieniały się na żółte. + +Stallmana, który całe życie mieszkał na wschodnim wybrzeżu, o zawał mogła przyprawić perspektywa spędzenia większej części słonecznego hawajskiego popołudnia w pułapce ruchu ulicznego. Jeszcze gorsza była świadomość, że skręcenie w prawo mniej więcej ćwierć mili wcześniej pozwoliłoby na ominięcie tej pułapki. Niestety, byliśmy na łasce jadącego przed nami programisty z laboratorium, który znał trasę i który zdecydował się przewieźć nas malowniczą trasą przez Pa'ia zamiast sąsiednią autostradą Pilani. + +"To straszne - mówił Stallman między kolejnymi zmianami świateł. - Dlaczego nie pojechaliśmy inną drogą?" + +Zielone światła ponownie zapaliły się ćwierć mili przed nami. Znowu przepełzliśmy do przodu kilka długości samochodu. Powtarzało się to przez kolejne 10 minut, aż wreszcie dotarliśmy do głównego skrzyżowania umożliwiającego skręt na sąsiednią autostradę. + +Kierowca przed nami zignorował to i przejechał przez skrzyżowanie na wprost. + +"Dlaczego on nie skręca? - narzekał Stallman, wznosząc ręce w rozpaczy. - Możesz to pojąć?" + +Postanowiłem w ogóle nie odpowiadać. Fakt, że w Maui jadę samochodem ze Stallmanem jako kierowcą i tak wydawał się trudny do uwierzenia. Jeszcze dwie godziny temu nie miałem nawet pojęcia, czy Stallman w ogóle potrafi prowadzić samochód. Teraz, słuchając przez samochodowe stereo Yo-Yo Ma1 grającego na wiolonczeli rzewne basowe nuty "Appalachian Journey" i oglądając po lewej zachód słońca, uznałem, że najlepiej zapaść się w miękką tapicerkę siedzenia. + +Kiedy kolejna możliwość skręcenia w bok została zmarnowana, Stallman włączył prawy kierunkowskaz, by w ten sposób dać wskazówkę jadącemu przed nami. Nic z tego. Przepełzliśmy na wprost przez kolejne skrzyżowanie, utykając w ruchu na 200 metrów przed kolejnymi światłami. Stallman zsiniał z wściekłości. + +"Tak jakby nas specjalnie ignorował" - powiedział i w daremnym wysiłku przyciągnięcia uwagi jadącego przed nami począł wykonywać gesty przypominające znaki dawane na lotnisku przez kierującego ruchem lądujących samolotów. Nasz przewodnik był jednak niewzruszony i przez następne pięć minut mogliśmy jedynie oglądać fragment głowy widoczny w lusterku wstecznym jego samochodu. + +Spojrzałem przez okno po stronie Stallmana. Pobliskie wyspy Kahoolawe i Lanai pięknie wyglądały w oprawie zachodzącego słońca. Widok zapierał dech w piersi i jego wspaniałość mogła czynić znośniejszym życie tubylców. Starałem się zwrócić na to uwagę Stallmana, ale wściekły, jedynie mnie ofuknął. + +Gdy nasz przewodnik przejechał przez kolejne skrzyżowanie, zupełnie ignorując napis "Autostrada Pilani na prawo", zacisnąłem zęby. Przypomniałem sobie, jak programista BSD Keith Bostic ostrzegał mnie, że "Stallmanowi niełatwo ścierpieć głupców". Twierdził, że każdemu, kto mówi lub robi coś głupiego, on mówi wprost: "To głupie". + +Patrząc na nieświadomego sytuacji kierowcę przed nami, pojąłem, że to jego głupota, a nie niedogodność podróży doprowadzają Stallmana do szału. + +"Wygląda na to, że wybierając tę drogę, w ogóle nie zastanowił się nad efektywnym dotarciem do celu" - powiedział Stallman. + +Słowo "efektywny" zawisło nad nami swym niewidocznym ciężarem. Niewiele jest rzeczy irytujących hakera bardziej niż nieefektywność. To właśnie nieefektywność wielokrotnego sprawdzania, czy drukarka się nie zacięła, spowodowała, że Stallman zaczął szukać dostępu do kodu źródłowego jej oprogramowania. To właśnie nieefektywność kodów zawłaszczonych przez komercyjnych dostawców oprogramowania doprowadziła do jego walki z firmą Symbolics i stworzenia projektu GNU. Jeżeli Jean Paul Sartre stwierdził kiedyś, że piekłem są inni ludzie, to męki piekielne hakera są spotęgowane przez ludzką głupotę, a całe życie Stallmana było dążeniem, by uchronić ludzkość przed stoczeniem się w te piekielne otchłanie. + +W miarę naszego powolnego brnięcia do przodu ta piekielna metafora stawała się coraz bardziej oczywista. Mnogość sklepów, parkingów i z rzadka zapalane lampy uliczne Kihei przywodziły na myśl nie miasto, lecz raczej marnie zaprojektowany, rozwlekły program komputerowy. Zamiast skierować ruch pojazdów na sąsiednie ulice i drogi ekspresowe, planiści miejscy zepchnęli wszystko do jednego zatłoczonego cieku głównej drogi. Dla hakera siedzenie w samochodzie w środku tego bałaganu było jak słuchanie nagranego na płcie CD zgrzytu paznokci na szkolnej tablicy. + +"Niedoskonałość systemów doprowadza hakerów do szału - zauważył Steven Levy, co było kolejnym ostrzeżeniem, jakiego mi udzielono przed wejściem do samochodu prowadzonego przez Stallmana. - Właśnie dlatego hakerzy nie lubią prowadzić samochodów w ruchu, w którym zapalające się przypadkowo czerwone światła i dziwacznie ułożone ulice jednokierunkowe powodują niepotrzebne opóźnienia. Wywołuje to u nich chęć zmiany ustawienia znaków, przeprogramowania skrzynek sterujących światłami... innego zaprojektowania całego systemu"2. + +Ale najbardziej denerwująca była głupota przewodnika, któremu zawierzyliśmy. Zamiast znaleźć skrót umożliwiający jak najszybsze dotarcie do celu - co powinien uczynić instynktownie każdy haker - włączył nas do gry wymyślonej przez miejskich planistów. Jak Wergiliusz w "Piekle" Dantego postanowił odbyć z nami pełny objazd tego hakerskiego piekła, niezależnie od tego, czy mieliśmy na to ochotę. + +Zanim zdążyłem podzielić się ze Stallmanem tą opinią, nasz przewodnik wreszcie zapalił prawy kierunkowskaz. Stallman odprężył się nieco i napięcie w samochodzie na chwilę zelżało. Wróciło, gdy kierowca przed nami zwolnił. Po obu stronach ulicy widać było znaki "Roboty drogowe", a pasma drogi dojazdowej do odległej o ćwierć mili autostrady Pilani blokował bezczynnie stojący buldożer i dwie sterty gruzu. + +Dopiero po chwili Stallman zdołał zorientować się, że nasz przewodnik manewruje, by zawrócić. Gdy jego wzrok padł na buldożer i napis "Przejazd zamknięty", wszystko się w nim zagotowało. + +"Dlaczego, dlaczego, dlaczego? - zaskowyczał. - Powinieneś wiedzieć, że tu nie ma przejazdu. Powinieneś wiedzieć, że tu nie przejedziesz. Robisz to specjalnie". + +Kierowca zakończył manewr i minął nas, wracając na główną ulicę. Potrząsnął przy tym głową i usprawiedliwiająco wzruszył ramionami. Ten gest w połączeniu z zębami wyszczerzonymi w uśmiechu był podkreśleniem kontrastu między frustracją przybysza z kontynentu a spokojnym fatalizmem wyspiarza. Przez zamknięte szyby wynajętego przez nas samochodu dotarł do nas sens tego zwięzłego komunikatu "To jest Maui i co począć?" + +Tego już Stallman nie mógł znieść. + +"Mam dość twego pieprzonego uśmiechu - wrzasnął, przyćmiewając mgiełką oddechu zamkniętą szybę. - To twoja pieprzona wina. Wszystko poszłoby łatwiej, gdybyś to robił moim sposobem". + +Stallman słowa "moim sposobem" podkreślił dwukrotnym uchwyceniem i pociągnięciem do siebie kierownicy. Przypominało to histerię dziecka, które siedząc za kierownicą, na niej wyładowuje swą złość. Dźwięki, jakie z siebie wydawał, wskazywały, że jest wściekły, udręczony i bliski łez. + +Na szczęście łzy się nie pojawiły. Jego furia ustała tak nagle, jak nagle się pojawiła. Po kilku jękliwych sapnięciach zawrócił samochód. Gdy ponownie znaleźliśmy się na głównej ulicy, jego twarz była już tak spokojna jak 30 minut temu, gdy wyjeżdżaliśmy z hotelu. + +Po pięciu minutach dotarliśmy do następnego skrzyżowania. Tym razem łatwo wjechaliśmy na autostradę i po kilku sekundach mknęliśmy w stronę Pa'ia, napawając się uspokajającą szybkością. Słońce jeszcze niedawno jasno żółcące się po lewej stronie Stallmana, teraz świeciło w lusterku wstecznym pomarańczową czerwienią, tak jakby pożyczyło barwy od drzew wili wili obrastających obie strony autostrady. + +Przez następnych dwadzieścia minut słyszeliśmy jedynie dźwięk silnika samochodowego, szum opon na asfalcie oraz dźwięki wiolonczeli i skrzypiec brzmiących smętnymi ludowymi nutami pieśni z Appalachów. + + +Rozdział 13. +Kontynuacja walki + +Czas nie mógł uleczyć wszystkich ran Stallmana, ale był jego sprzymierzeńcem. + +Nawet po czterech latach krytyka zapisana przez Raymonda w Katedrze i bazarze (The Cathedral and the Bazaar) tkwiła jak zadra w jego duszy. Boczył się także na Linusa Torvaldsa za zajęcie pozycji najsławniejszego hakera na świecie. Jeszcze dziś wspomina koszulkę typu T-shirt, która zaczęła się pojawiać na targach linuksowych w roku 1999. Zaprojektowano ją na wzór plakatu Gwiezdnych Wojen - z Torvaldsem wymachującym mieczem świetlnym jak Luke Skywalker i twarzą Stallmana na szczycie korpusu R2D21. Ta koszulka wciąż gra mu na nerwach, nie tylko dlatego, że przedstawia go w roli pomagiera Linusa, lecz z tego powodu, że podnosi Torvaldsa do rangi przywódcy społeczności wolnego oprogramowani i oprogramowania open source, roli, której nawet on sam sobie nie przypisuje. "To śmieszne, że sam Torvalds nie zamierzał dzierżyć tego miecza - mówi z żalem. - Wszyscy uznali go za przywódcę ruchu, a on nie miał ochoty na walkę. Gdzie tu sens?" + +Ta niechęć Torvaldsa do "wzięcia w dłoń miecza" pozwoliła Stallmanowi zachować pozycję najwyższego arbitra hakerskiej etyki. Pomimo poczucia krzywdy Stallman musi przyznać, że kilka ostatnich lat to niezły czas dla niego samego i jego organizacji. Odsunięty na ubocze przez nieoczekiwany sukces GNU/Linuksa, zdołał jednak odzyskać inicjatywę. Od stycznia 2000 do grudnia 2001 odwiedził 6 kontynentów, wygłaszając wykłady w krajach, w których sprawy wolnego oprogramowania cieszą się zainteresowaniem, np. Chinach i w Indiach. + +Nauczył się także budować swoją pozycję poza katedrą wykładowcy, jako osoba współodpowiedzialna za Powszechną Licencję Publiczną (GPL). Latem 2000, gdy powietrze nagle zaczęło uciekać z nadmuchanego w 1999 roku linuksowego balonu giełdowego, Stallman i jego Fundacja Wolnego Oprogramowania odnieśli dwa znaczne sukcesy. W lipcu 2000 Trolltech, norweska firma programistyczna, twórca Qt - wartościowego pakietu narzędzi graficznych dla systemu operacyjnego GNU/Linux - ogłosiła przyjęcie licencji GPL. Kilka tygodni później firma Sun Microsystems, dotychczas próbująca samodzielnie dbać o zachowanie kontroli nad prawami własności swojego oprogramowania open source, w końcu złagodziła swoje stanowisko i ogłosiła, że jej pakiet aplikacji OpenOffice będzie odtąd chroniony przez podwójną licencję - Lesser GNU Public License (LGPL)2 oraz Sun Industry Standards Source License (SISSL)3. + +Warto podkreślić, że oba zwycięstwa przyszły bez szczególnych starań ze strony Stallmana. W przypadku Trolltech Stallman pełnił jedynie rolę arcykapłana wolnego oprogramowania. W roku 1999 firma wystąpiła z własną licencją, wychodzącą naprzeciw warunkom Fundacji, ale po przeanalizowaniu jej treści Stallman zauważył prawne niezgodności, które mogły uniemożliwić łączenie Qt z programami chronionymi przez GPL. Zmęczony naleganiami Stallmana, zarząd Trolltecha ostatecznie zdecydował się rozdzielić Qt na dwie wersje chronione licencjami GPL i QPL, co umożliwiło twórcom oprogramowania obejście wytkniętych przez Stallmana problemów niezgodności. + +Sun od początku chciał postępować zgodnie z wytycznymi Fundacji Wolnego Oprogramowania. W roku 1999 na O'Reilly Open Source Conference współzałożyciel Sun Microsystems i szef działu badawczego firmy, Bill Joy, obronił "społeczną licencję" (ang. community licence) stanowiącą kompromisowe rozwiązanie o mniejszej mocy. Pozwalała ona użytkownikom na kopiowanie i modyfikowanie oprogramowania będącego własnością Suna, ale nie na pobieranie opłaty za to oprogramowanie, o ile wcześniej nie została zawarta umowa określająca sposób dzielenia zysków. Rok po przemówieniu Joya wiceprezes Sun Microsystems, Marco Boerries, z tej samej trybuny ogłosił kolejny kompromis. Dotyczył on OpenOffice, pakietu aplikacji zaprojektowanych specjalnie do stosowania w systemie operacyjnym GNU/Linux. + +"Mogę to wyrazić za pomocą trzech liter - GPL" - powiedział. + +Jak stwierdził Boerries, decyzja firmy miała niewiele wspólnego ze Stallmanem, a o wiele więcej z rozmachem rozpowszechniania się programów chronionych licencją GPL. "Przede wszystkim różne produkty są atrakcyjne dla różnych społeczności i licencja chroniąca dany produkt powinna być dostosowana do wymagań danej społeczności - stwierdził Boerries. - A jest oczywiste, że OpenOffice jest produktem dla społeczności GPL-owskiej"4 i 5. + +Takie komentarze pokazywały nierozpoznaną od razu moc GPL, a pośrednio - polityczny geniusz człowieka, który odegrał najważniejszą rolę przy jej tworzeniu. "Nie było na świecie prawnika, który potrafiłby naszkicować GPL w tej postaci - twierdzi Eben Moglen, profesor prawa na Columbia University i generalny doradca Fundacji Wolnego Oprogramowania. - A jak widać, to działa. Działa dzięki filozofii stworzonej przez Richarda". + +Moglen, niegdyś zawodowy programista, śledzi swą współpracę ze Stallmanem pro publico bono sięgającą roku 1990, gdy został poproszony o poradę prawną w sprawie prywatnej. Współpracował wówczas z ekspertem od szyfrowania, Phillipem Zimmermanem, wspierając go w prawnej batalii z National Security Administration. Prośbę Stallmana uznał za wyróżnienie: "Powiedziałem mu, że codziennie używam Emacsa i musiałbym wykonać wielką pracę prawniczą, gdybym chciał spłacić zaciągnięty dług". + +Od tego momentu Moglen o wiele dokładniej niż ktokolwiek inny mógł śledzić przeistaczanie się hakerskiej filozofii Stallmana w prawną rzeczywistość. Twierdzi, że Stalman niemal tak samo podchodzi do tekstu prawnego i kodu programu komputerowego. "Jako prawnik muszę powiedzieć, iż pomysł, aby w dokumencie prawnym wyszukać wszystkie błędy i niedociągnięcia, nie ma wielkiego sensu - mówi Moglen. - W każdym postępowaniu prawnym jest pewna doza niepewności i prawnicy starają się wyciągnąć stąd korzyści dla swego klienta. Cel Richarda był zupełnie inny. On chciał usunąć wszystkie niejasności, co jest z natury rzeczy niemożliwe. Niemożliwe jest także napisanie jednej licencji, która pasowałaby do wszystkich okoliczności we wszystkich systemach prawnych na całym świecie. Ale jeżeli wejdziesz między wrony, musisz krakać tak jak one; musiałem się dostosować. Zdumiewa elegancja i prostota wyniku. Chyba zostało tu osiągnięte wszystko, co było możliwe do osiągnięcia. Niewiele prac prawniczych może się z tym równać". + +Jako osoba odpowiedzialna za realizację zadań zgodnie z planem nakreślonym przez Stallmana, Moglen doskonale rozumie frustrację potencjalnych sojuszników. "Richard jest człowiekiem nieuznającym kompromisów w sprawach, które uważa za fundamentalne - mówi - i z trudem pojmuje pokrętność słów i poszukiwanie dwuznaczności, która okazuje się pożądana przez część społeczeństwa". + +Ponieważ Fundacja Wolnego Oprogramowania nie miała ochoty na rozważanie kwestii leżących poza zagadnienia GNU i GPL, Moglen resztę swej energii poświęcił współpracy z Electronic Frontier Foundation6, organizacji dającej wsparcie osobom ostatnio oskarżonym o łamanie praw autorskich, takim jak np. Dymitr Sklarow7. W roku 2000 Moglen był także doradcą grupy hakerów zajmujących się programem deCSS deszyfrującym zapis DVD. Moglen nauczył się doceniać upór swojego głównego klienta pomimo jego małomówności. "Zdarzało się, że przychodziłem do Richarda, mówiąc Musimy to zrobić. Musimy tamto zrobić. To jest strategicznie ważna sytuacja. Następny ruch powinien być taki. Oto, co musimy zrobić, na co on odpowiadał Nie musimy niczego robić. Poczekajmy, aż to, co potrzebne, zostanie wykonane". + +"I wiesz co? - dodaje Moglen. - Zwykle miał rację". + +Takim komentarzom przeczy wypowiedź samego Stallmana: "Nie nadaję się do prowadzenia rozgrywek - odpowiada wielu krytykom uznającym go za przebiegłego stratega. - Nie potrafię przewidywać działań innych. Zawsze zwracałem uwagę głównie na budowanie podstaw. Mówiłem Temu, co robimy, dajmy możliwie najmocniejsze podstawy". + +Rosnąca popularność GPL i coraz większa siła przyciągania tej licencji najlepiej świadczyły o jakości fundamentów założonych przez Stallmana i jego kolegów z projektu GNU. Stallman, choć nie mógł się już uważać za "ostatniego prawdziwego hakera", nadal był uznawany za kogoś, kto sam stworzył etyczne zasady ruchu wolnego oprogramowania. Niezależnie od tego, czy współczesnym hakerom w pełni odpowiadały ramy nakreślone przez Stallmana, dzięki niemu mieli wybór sposobu działania i to stanowiło największą wartość jego spuścizny. + +Mówienie o spuściźnie Stallmana zdaje się być nieco przedwczesne. W chwili, gdy piszę te słowa, Stallman ma 48 lat i przed sobą czas, w ciągu którego może powiększyć swe dzieło lub nieco uszczknąć z należnej mu chwały. Nadal samosterująca natura ruchu wolnego oprogramowania skłania do spojrzenia na życie Stallmana ponad codziennymi walkami z przemysłem programistycznym i szukania cech ogólniejszych o znaczeniu historycznym. + +Stallman odrzuca wszystkie spekulacje dotyczące jego osoby. "Nigdy nie potrafiłem opracować szczegółowego planu, przewidującego, co przyniesie przyszłość" - twierdzi i nieco przedwcześnie proponuje, aby na jego nagrobku wyryć epitafium: "Zawsze byłem gotowy do walki, choć nie wiedziałem, dokąd mnie ona zawiedzie". + +Jest oczywiste, że, wybierając walkę, odstręczył od siebie wielu ludzi, którzy mogli stać się jego największymi sprzymierzeńcami. Hołdem dla jego prostolinijnej etycznej natury jest fakt, że wielu jego niegdysiejszych przeciwników politycznych, gdy ich przyprzeć do muru, potrafi powiedzieć o nim nieco dobrego. Zdziwienie biografa budzi jednakże napięcie między Stallmanem-ideologiem i Stallmanem-genialnym hakerem, jednakże nie ma tu miejsca na rozważanie, jak ludzie będą pamiętali Stallmana, gdy jego już nie będzie". + +We wczesnych szkicach tej książki nazwałem ten rozdział "Po 100 latach". Mając nadzieję na obiektywne opisanie Stallmana i jego dzieła, wypytywałem wielu ludzi, osobistości przemysłu programistycznego. Proponowałem im wzniesienie się ponad bieżące wydarzenia i spojrzenie na sprawę z pozycji historyka, który będzie badał ruch wolnego oprogramowania po 100 latach. W chwili obecnej łatwo snuć porównania Stallmana do wielu Amerykanów z przeszłości, którzy zajmując marginalną pozycję w życiu współczesnym, z perspektywy historycznej sięgnęli wyżyn uznania. Łatwo przeprowadzić paralelę z Henrym Davidem Thoreau8 transcendentalnym filozofem i autorem "Cywilnego nieposłuszeństwa" (ang. On Civil Disobedience) oraz Johnem Muirem9, założycielem Sierra Club i propagatorem współczesnego ruchu ochrony środowiska. Łatwo też zauważyć podobieństwo do Williama Jenningsa Bryana10, znanego także jako "Wielki człowiek z ludu" (ang. Great Commoner), lidera populistyczngo ruchu społecznego, wroga monopoli, w swoim czasie człowieka potężnego, którego znaczenie jednakże maleje, gdy spoglądamy nań z perspektywy historii. + +Choć nie on pierwszy uznał oprogramowanie za własność powszechną, z powodu GPL Stallman zasłużył sobie na notkę w przyszłych podręcznikach historii. Mając to na względzie, warto przesunąć się w czasie, by spojrzeć na spuściznę Stallmana spoza obecnych ram czasowych. Czy w roku 2102 GPL będzie wciąż coś znaczyła dla programistów, czy pozostanie jedynie wspomnieniem po czymś, co dawno zostało odrzucone na margines historii? A może termin "wolne oprogramowanie" będzie jedynie taką osobliwością jak dziś "wolne srebro" (ang. free silver)11? A może jest inspirującą wytyczną przyszłych politycznych zdarzeń? + +Przewidywanie przyszłości jest zajęciem ryzykownym, ale wielu ludzi, proszonych o to, chętnie to ryzyko podejmuje. "Za sto lat Richard i kilku innych będą zasługiwali na o wiele więcej uwagi niż krótki przypisek historyczny - mówi Moglen. - Są na drodze do znalezienia się w centrum uwagi historii". + +Wśród tych "kilku innych", których Moglen uznaje za godnych znalezienia się na kartach historii, są John Gilmore, najpierw doradca Stallmana w czasie powstawania DPL, a potem założyciel Electronic Frontier Foundation, a także Theodor Holm Nelson, znany jako Ted Nelson12, autor wydanej w roku 1982 książki "Literary Machines". Moglen twierdzi, że Stallman, Nelson i Gilmore wnieśli do historii trzy różne i niezależne rozwiązania. Nelson, powszechnie znany jako ten, który ukuł pojęcie "hipertekst", był pierwszym, który przewidział niedogodności wynikające z praw własności informacji w wieku technologii cyfrowych, zaś Gilmore'owi i Stallmanowi zawdzięczamy zidentyfikowanie negatywnych politycznych efektów kontrolowania informacji. Oni też stworzyli organizacje zwalczające te zagrożenia: Gilmore - Fundację Elektronicznego Pogranicza (Electronic Frontier Foundation), zaś Stallaman - Fundację Wolnego Oprogramowania (Free Software Foundation). Jednakże, zdaniem Moglena, działania Stallmana mają bardziej osobisty i mniej polityczny charakter. + +"Richard jest jedynym, który tak wcześnie zauważył etyczne implikacje zniewolenia oprogramowania - mówi Moglen. - Choć wielu piszących o nim uważa zajęcie się tym problemem za działanie uboczne lub nawet za jego błąd życiowy, w rzeczywistości wynika to bezpośrednio z jego osobowości". + +Gilmore, który z mieszanymi uczuciami przyjął umieszczenie go między kapryśnym Nelsonem i drażliwym Stallmanem, jednak przytakuje Moglenowi, pisząc: + + Przypuszczam, że teksty Stallmana wytrzymają próbę czasu tak, jak wytrzymało ją to, co napisał Thomas Jefferson. Stallman pisze jasno i jasno wyraża swe zasady... To, czy stanie się on równie wpływowy jak Jeferson, zależy od tego, czy abstrakcje, które nazywamy "prawami obywatelskimi", staną się za 100 lat ważniejsze od abstrakcji, które nazywamy teraz "oprogramowaniem" i "technicznie narzuconymi ograniczeniami". + +Gilmore zwraca uwagę, że dorobkiem Stallmana, którego nie można nie dostrzec, jest wprowadzony w projekcie GNU pionierski model współtworzenia oprogramowania. Choć czasem w postaci skażonej, zdołał on jednak stać się standardem w przemyśle programistycznym. Gilmore przypuszcza, iż być może właśnie ten model kooperatywnego tworzenia programów w przyszłości będzie miał większe znaczenie niż projekt GNU, licencja GPL lub którykolwiek z programów napisanych przez Stallmana: + + Przed nastaniem Internetu współpraca na odległość była bardzo utrudniona i ciężko było wspólnie tworzyć programy nawet w zespole, którego członkowie znali się nawzajem i ufali sobie. Richard stworzył model kooperatywnego tworzenia programów także przez grupy złożone z osób niezorganizowanych i rzadko się spotykających. Nie zbudował żadnego z narzędzi służących do takiej współpracy (protokołu TCP, list e-mailowych, narzędzi diff/patch13, plików tar14, RCS15 lub CVS lub zdalnego CVS16), ale zawsze używał wszystkiego, co było dostępne i pomocne w tworzeniu grup programistów, którzy mogli efektywnie współpracować. + +Wtóruje mu Lawrence Lessig, profesor prawa w Stanford i autor książki roku 2001 The Future of Ideas (Przyszłość idei). Jak wielu innych wykładowców akademickich Lessig uważa GPL za główny bastion tak zwanej wspólnoty cyfrowej (ang. digital commons), wielkiej społeczności oprogramowania będącego wspólną własnością oraz standardów sieciowych i komunikacyjnych, które w ciągu ostatnich trzech dekad umożliwiły gwałtowny rozwój Internetu. Raczej nie łączy Stallmana z innymi wielkimi pionierami Internetu jak Vannear Bush17, Vinton Cerf18 i J. C. R. Licklider19, którzy przekonali innych do stosowania technologii komputerowej na szeroką skalę. Uważa, że jego wpływ był bardziej osobisty, introspektywny i niepowtarzalny: + + (Stallman) zastąpił debatę o tym, co jest, debatą o tym, co być powinno. Zmusił ludzi do zastanowienia się, jak wysoka jest stawka, i stworzył narzędzia do wprowadzenia swych idei w życie... Nie wiem, na jakim miejscu należy go umieścić obok Cerfa i Licklidera. Wymyślił coś zupełnie innego. Nie jest to jakiś nowy rodzaj kodu lub wyposażenie Internetu w nowe możliwości. To raczej uświadomienie ludziom wartości pewnej części Internetu. Nie sądzę, aby udało nam się znaleźć kogoś tej samej klasy przed nim lub po nim. + +Oczywiście, nie wszyscy traktują osiągnięcia Stallmana jako warte upamiętnienia. Eric Raymond, jeden z twórców oprogramowania open source, uważa, że przywódcza rola Stallmana znacznie zmalała po roku 1996 i oglądając w czarodziejskiej szklanej kuli świat roku 2102, spostrzega zmieszanie sprzecznych ocen: + + Myślę, że artefakty Stallmana (GPL, Emacs, GCC) będą uznane za dzieła rewolucyjne, kamienie węgielne świata informacji, ale historia będzie mniej łaskawa dla teorii będących podstawą działania RMS, a całkiem zlekceważy jego pragnienia uczynienia się kultowym przywódcą pewnej grupy. + +Sam Stallman również ma mieszane uczucia: + + Co za dwadzieścia lat historia powie o projekcie GNU, będzie zależało od tego, kto zwycięży w walce o wolność ludzkiej wiedzy. Jeżeli przegramy, pozostaniemy jedynie przypisem na kartach historii. Jeżeli zwyciężymy, nie jest pewne, czy ludzie będą znali rolę systemu operacyjnego GNU; jeżeli będą nazywać ten system "Linuksem", zbudują fałszywy obraz tego, co się działo i przyczyn, które do tego doprowadziły. + +Nawet jeżeli zwyciężymy, to, co będą pisać historycy za sto lat, będzie zależało od tego, kto będzie wówczas dzierżył ster władzy politycznej. + +Szukając swego odpowiednika wśród dziewiętnastowiecznych postaci historycznych, Stallman wspomina Johna Browna20, wojowniczego abolicjonistę21 uznanego za bohatera po jednej stronie linii Masona-Dixona (Mason Dixon line)22 i za szaleńca po drugiej stronie. + +Rewolta, której pragnął John Brown, nigdy nie wybuchła, ale podczas późniejszego procesu udało się mu rozbudzić w społeczeństwie żądanie abolicji. Podczas wojny domowej uznawano go za bohatera, ale w 100 lat później, a nawet przez większość XX wieku, podręczniki historii zwykle przedstawiały go jako szaleńca. W okresie legalnej segregacji, gdy bigoteria nie przynosiła wstydu, Stany Zjednoczone częściowo zaakceptowały to, co stany południowe miały do powiedzenia na swój temat - wiele nieprawdziwych opinii o wojnie secesyjnej i związanych z nią sprawach przeniknęło wówczas do podręczników historii. + +Takie porównania świadczą o tym, że sam Stallman postrzega swą obecną pracę jako zjawisko peryferyjne wobec głównego biegu zdarzeń, oraz o podwójnej naturze jego obecnej reputacji. Trudno sobie wyobrazić, by opinia o nim kiedykolwiek sięgnęła takich nizin infamii jak opinia o Johnie Brownie po zakończeniu odbudowy ze zniszczeń wojny secesyjnej, jednakże wojenne analogie w jego wypowiedziach nie stały się zaczynem żadnego buntu i łatwo sobie wyobrazić, że w przyszłości jego idee zostaną zapomniane. Nadając działaniom dotyczącym wolnego oprogramowania postać nie masowego ruchu, lecz raczej ciągu prywatnych potyczek z siłami upowszechniającymi oprogramowanie z prywatnymi prawami własności, Stallman zdaje się stawiać swoich, równie upartych jak on, zwolenników w sytuacji uniemożliwiającej zwycięstwo. + +Pomimo wszystko może się to kiedyś okazać jego najtrwalszą spuścizną. Moglen w ciągu ostatniego dziesięciolecia z bliska obserwujący te zdarzenia, ostrzega wszystkich, którzy błędnie chcą uważać osobowość Stallmana za dodatek do jego dokonań. Bez takiej osobowości Stallman nie stworzyłby wielu rzeczy godnych uwagi, twierdzi Moglen, były urzędnik Sądu Najwyższego: + + Największym człowiekiem, dla którego kiedykolwiek pracowałem, był Thurgood Marshall23. Wiem, co uczyniło go wielkim. Wiem, dlaczego potrafił zmienić świat zgodnie z własnym wyobrażeniem. Porównywanie ich obu, byłoby nadużyciem, gdyż trudno znaleźć dwie bardziej odmienne postaci. Thurgood Marshall był niezwykłym człowiekiem, reprezentował wyrzuconych poza nawias wobec społeczeństwa, które się przed nimi zamknęło. Jego zdolności i umiejętności były zdolnościami i umiejętnościami społecznymi. Pod wszelkimi innymi względami różnili się, ale pomimo to ze wszystkich, których poznałem, tylko Stallman jest tak samo monolitem wykonanym z jednej bryły, z materii, z której zbudowane są gwiazdy. + +Aby sprowadzić ten obraz na ziemię, Moglen wspomina spotkanie ze Stallmanem na wiosnę 2000. W mediach zajmujących się sprawami biznesu odbijało się jeszcze echo sukcesu VA Linux IPO i przy okazji omawiano kilka tematów dotyczących wolnego oprogramowania. W środku tego huraganu tematów i historii wymagających komentarza zasiadł ze Stallmanem do lunchu, czując się jak drobina w oku cyklonu. W ciągu kilku następnych godzin spokojnie omawiali zagadnienia dotyczące jednego tematu: wzmocnienia GPL. + +"Siedzieliśmy tam, rozważając, co zrobimy z kilkoma problemami, które pojawiły się we wschodniej Europie, i co poczniemy, gdy problem własności zawartości zacznie zagrażać wolnemu oprogramowaniu - wspomina Moglen. - Podczas rozmowy zastanawiałem się, co mogą o nas myśleć ludzie obok. Widzieli dwóch brodatych anarchistów kreślących plany swych następnych poczynań. Oczywiście, Richard jak zwykle wyskubywał kosmyki ze swej czupryny, upuszczając je do talerza zupy. Ktokolwiek przysłuchiwał się naszej rozmowie, zapewne doszedł do wniosku, że jesteśmy szaleni, ale wiedziałem, że przy tym stole robimy rewolucję. Mówimy o tym, co się stanie, a ten człowiek sprawi, że to się urzeczywistni." + +Moglen twierdzi, że ten moment jak nic innego przekonał go o elementarnej prostocie stylu działania Stallmana. + +"Zabawne - wspomina Moglen. - Powiedziałem do niego Richardzie, wiesz co, ty i ja to tacy dwaj faceci, którzy nie zarobią grosza na tej rewolucji, a potem zapłaciłem za lunch, bo wiedziałem, że on nie ma pieniędzy". + + +Epilog +Miażdżąca samotność + +Pisanie biografii osoby żyjącej przypomina wystawianie sztuki w teatrze. Przedstawienie na scenie często blednie w porównaniu z dramatem za kulisami. + +Pisząc "Autobiografię Malcolma X" (The Autobiography of Malcolm X), Alex Haley dał czytelnikom rzadką okazję zajrzenia za kulisy. Wychodząc poza rolę ghostwritera1, w epilogu przemówił własnym głosem. Wyjaśnił, w jaki sposób niezależny reporter, przegnany przez rzecznika Nation of Islam jako "pachołek" i "szpieg", przeniknął przez polityczne i personalne bariery, aby przelać na papier historię życia Malcolma X. + +Waham się, czy mogę porównywać tę książkę z "Autobiografią Malcolma X", ale chciałbym wyrazić głęboką wdzięczność dla Haleya za napisanie tak szczerego i otwartego epilogu. Przez ostatnich 12 miesięcy był on dla mnie podręcznikiem, instrukcją opisywania postaci, która całą karierę zbudowała na sprzeciwie. Dlatego tę biografię postanowiłem zakończyć podobnym epilogiem, który ma być hołdem złożonym Haleyowi i informacją mówiącą czytelnikom, jak ta książka powstawała. + +Przygoda z pisaniem tej opowieści zaczęła się w mieszkaniu w Oakland i prowadziła mnie przez miejsca tak różne, jak: Dolina Krzemowa, Maui, Boston i Cambridge. Ostatecznie jest to jednak historia o dwóch miastach: Nowym Jorku, światowej stolicy wydawców książek, i Sebastopolu w Kalifornii, stolicy wydawców Sonoma County. + +Wszystko zaczęło się w kwietniu 2000 roku. Pisałem wówczas historie dla złej sławy witryny WWW BeOpen (http:// www.beopen.com). Jednym z pierwszych zadań było przeprowadzenie telefonicznego wywiadu z Richardem M. Stallmanem. Wywiad wypadł dobrze, aż tak dobrze, że łącze do niego zostało umieszczone na stronie WWW VA Software, Inc. (niegdyś VA Linux Systems, a poprzednio VA Research). W ciągu kilku godzin serwery BeOpem zagrzały się od licznych kliknięć użytkowników chcących przeczytać ten artykuł. + +Wszystkie znaki na niebie i ziemi wskazywały, że na tym się skończy. Jednakże gdy w trzy miesiące później uczestniczyłem w O'Reilly Open Source Conference w Monterey w Kalifornii, otrzymałem e-mail od Tracy Pattison, zarządzającej sprawami obcych praw autorskich w jednym z wielkich wydawnictw nowojorskich: + +Do: sam@BeOpen.com +Temat: Wywiad z RMS +Data: 10 lipca 2000, 15:56:37 -0400 + +Drogi Panie Williams + +Z wielkim zainteresowaniem przeczytałam na stronie +BeOpen Pański wywiad z Richardem Stallmanem. Od +pewnego czasu intryguje mnie RMS i jego działanie i +z przyjemnością stwierdzam, że Pański tekst o nim +był doskonały. Udało się Panu świetnie przekazać +ducha działań Stallmana dotyczących GNU-Linuksa i +Fundacji Wolnego Oprogramowania. + +Chciałabym jednak dowiedzieć się więcej i sadzę, że +nie tylko ja. Czy sądzi Pan, że jest dostępnych +więcej źródeł, które pozwoliłyby na rozszerzenie i +uaktualnienie Pańskiego wywiadu w celu lepszego +nakreślenie sylwetki Stallmana? Dodanie nieco +anegdot i informacji zza kulis mogłoby naprawdę +zainteresować i poinformować wielu czytelników +spoza ścisłego kręgu programistów. + +E-mail kończył się prośbą o telefon w celu dokładniejszego omówienia sprawy. Zadzwoniłem. Tracy poinformowała mnie, że jej wydawnictwo rozpoczyna wydawanie serii książek elektronicznych i szuka historii, które mogą trafić do czytelników przyzwyczajających się do nowego medium. Format e-booka obejmował 30 tys. słów, czyli około 100 stron. Tracy przedstawiła swym szefom pomysł opisania głównych postaci hakerskiej społeczności. Szefom pomysł się spodobał, więc rozpoczęło się poszukiwanie postaci do opisania. To doprowadziło Tracy do mojego wywiadu ze Stallmanem na stronie BeOpen. Stąd ten e-mail do mnie. + +Tracy zapytała, czy zechciałbym rozszerzyć wywiad do pełnego opisu postaci Stallmana? + +Odpowiedziałem natychmiast, że tak. Poprosiła, abym spisał zarys tego, co chcę opisać, aby mogła to przedstawić swoim szefom. Dwa dni później wysłałem jej żądany opis proponowanego tekstu. Po tygodniu otrzymałem e-mail z odpowiedzią. Jej szefowie "dali zielone światło". + +Muszę przyznać, że dopiero wtedy pomyślałem o konieczności pozyskania Stallmana do udziału w tym e-bookowym projekcie. Jako reporter zajmujący się zagadnieniami oprogramowania open source, wiedziałem, że Stallman był pedantem. Do tego czasu dostałem już od niego z pół tuzina e-maili karcących mnie za używanie nazwy "Linux" zamiast "GNU/ Linux". + +Wiedziałem także, że Stallman szuka sposobów dotarcia ze swoim przesłaniem do szerszego grona odbiorców. Pomyślałem, że jeżeli przedstawię mu projekt od tej strony, być może łatwiej go zaakceptuje. Jeżeli nie, pozostanie mi korzystanie z wielkiej liczby rozsianych w Internecie dokumentów, wywiadów i zapisanych z nim rozmów, a następnie napisanie nieautoryzowanej biografii. + +Podczas poszukiwania materiałów trafiłem na esej pod tytułem Freedom-Or Copyright? (Wolność czy prawo autorskie). Napisany przez Stallmana i opublikowany w czerwcowym wydaniu MIT Technology Review (Przeglądzie technicznym MIT) artykuł nie pozostawiał suchej nitki na e-bookach, wyliczając całą litanię ich grzechów. Stallman narzekał, że czytelnicy, aby czytać tekst, muszą korzystać z oprogramowania z zastrzeżonymi prawami własności, a do tego stosuje się bardzo silne zabezpieczenia przed nieautoryzowanym kopiowaniem. Zamiast zwykłego łatwego do przekazywania pliku HTML lub PDF czytelnicy ściągają plik szyfrowany. W rzeczywistości kupowanie e-booka oznacza kupowanie nieprzekazywalnego klucza do rozpakowania zaszyfrowanego pliku. Każda próba odczytania zawartości książki bez autoryzowanego klucza jest uznawana za pogwałcenie Digital Millennium Copyright Act z roku 1998, ustawy stworzonej dla wzmocnienia praw autorskich w Internecie. Tych, którzy dokonaliby konwersji zawartości książki do pliku z otwartym formatem, czekają kary, nawet gdyby ich jedynym celem było czytanie tekstu na innym domowym komputerze. W przeciwieństwie do zwykłej książki właściciel e-booka nie może go pożyczyć, skopiować lub odsprzedać. Stallman ostrzegał, że może go jedynie czytać na autoryzowanej maszynie: + + Używając papierowych książek, zachowujemy wszystkie stare wolności. Sytuacja pogarsza się, gdy książka drukowana zostaje zastąpiona przez elektroniczną. "Elektroniczny atrament" może pisać wciąż na tym samym "papierze", a więc również czasopisma staną się efemerydami. Wyobraźcie sobie: żadnych antykwariatów z używanymi książkami, żadnego pożyczania książek przyjaciołom, żadnego wypożyczania książek z bibliotek publicznych, żadnych "przecieków", pozwalających komuś przeczytać książkę bez płacenia za nią (a uwzględniwszy dodatki Microsoft Reader, również żadnego anonimowego kupowania książek). Taki świat szykują nam wydawcy.2 + +Nie trzeba chyba wyjaśniać, że takie stawianie sprawy wprawiło nas w zakłopotanie. Ani Tracy, ani ja nie zastanawialiśmy się, jakiego oprogramowania chce użyć jej firma, i jakie prawa autorskie mają chronić e-bookowe wydanie. Wspomniałem Tracy o artykule w Technology Rewiev i poprosiłem o informacje na temat polityki wydawnictwa dotyczącej e-booków. Obiecała dowiedzieć się. + +Paląc się do roboty, postanowiłem tak czy inaczej zatelefonować do Stallmana i wspomnieć mu o e-bookowym pomyśle. Gdy o tym usłyszał, natychmiast się zainteresował i zgłosił zastrzeżenia. "Czy czytałeś mój artykuł o e-bookach?" - zapytał. + +Gdy powiedziałem, że tak i że czekam na informacje z wydawnictwa, postawił dwa warunki: nie będzie wspierał + +e-bookowego mechanizmu licencjonowania, któremu jest z zasady przeciwny, i nie chce, aby wyglądało, że ten rodzaj wydawnictw popiera. "Nie chcę brać udziału w czymkolwiek, co pokazywałoby mnie jako hipokrytę" - stwierdził. + +Dla niego samo oprogramowanie było sprawą mniejszej wagi niż sposób jego licencjonowania. Stwierdził, że dopóty jest mu obojętne, jakie oprogramowanie jest używane, dopóki wydawca w licencji praw autorskich umożliwia dosłowne kopiowanie i rozpowszechnianie zawartości e-booka. Wskazał na The Plant Stephena Kinga jako na model możliwy do zastosowania. W czerwcu 2000 King ogłosił na swej oficjalnej stronie WWW, że postanowił samodzielnie wydać The Plant w postaci kolejnych odcinków. Zgodnie z zapowiedzią, książka w całości miała kosztować 13 dolarów podzielonych na ciąg wpłat jednodolarowych. Dopóty, dopóki przynajmniej 75% czytelników będzie płacić za kolejne rozdziały, King będzie udostępniał następne. Do sierpnia wydawało się, że pomysł działa - King opublikował już dwa rozdziały i pracował nad trzecim. + +"Można by zaakceptować coś takiego - mówił Stallman, - jeżyli tylko czytelnicy otrzymają prawo sporządzania dokładnych kopii". + +Przekazałem tę informację Tracy. Przekonany, że mnie i Tracy uda się dojść do porozumienia, zatelefonowałem do Stallmana i umówiłem się z nim na pierwszy wywiad związany z tą książką. Zgodził się bez dalszego dopytywania o szczegóły prawne wydania. Wkrótce po pierwszym wywiadzie przeprowadziłem następny (ten w Kihei), zorganizowany przed + +14-dniowym urlopem Stallmana na Tahiti. + +Podczas wakacji Stallmana z wydawnictwa nadeszły złe wieści. Dział prawny nie zgadzał się na zmianę noty copyright dla e-booków. Czytelnicy, którzy chcieliby dysponować książką w postaci zdatnej do przekazywania innym, musieliby złamać kod zabezpieczający i dokonać konwersji do otwartego formatu HTML. Oznaczałoby to przestępstwo podlegające karze. + +Mając dwa nowe wywiady, resztę książki musiałbym pisać bez dostępu do nowych materiałów. Postanowiłem jak najszybciej wybrać się do Nowego Jorku na rozmowę z moim agentem i z Tracy, mając nadzieję na znalezienie kompromisowego rozwiązania. + +Po przylocie do Nowego Jorku, spotkałem się z moim agentem, Henningiem Guttmanem. Było to nasze pierwsze osobiste spotkanie - Henning stwierdził, że czarno widzi sprawę. Nie wydawało mu się, że uda się przekonać wydawcę do kompromisu. Wielkie domy wydawnicze z podejrzliwością spoglądały na e-booki i nie miały ochoty na żadne ułatwiające unikanie płatności eksperymenty z prawami autorskimi. Jednakże jako agent specjalizujący się w książkach dotyczących technologii, był zaintrygowany naturą moich kłopotów. Powiedziałem mu o dwóch już odbytych wywiadach i obietnicy niewydawania książki w sposób, który "uczyniłby ze Stallmana hipokrytę". Uznawszy to za zobowiązanie etyczne, postanowił przyjąć to za punkt wyjścia do dalszych negocjacji. + +Poza tym pozostawało nam zawsze stosowanie metody "kija i marchewki". "Marchewką" byłaby reklama związana z pierwszym w świecie wydaniem e-booka zgodnie z zasadami wewnętrznej etyki hakerskiej. "Kijem" było ryzyko niespełnienia tych zasad. Na dziewięć miesięcy przed słynną w Internecie sprawą Dimitra Sklarowa zdawaliśmy sobie sprawę, że tylko kwestią czasu jest opracowanie przez jakiegoś hakera metody transmisji plików e-bookowych do otwartego formatu. Wiedzieliśmy także, że wydanie chronionego kodem e-booka o Richardzie Stallmanie było równoważne z wydrukowaniem książki z napisem na okładce "Ukradnij mnie". + +Po rozmowie z Henningiem zatelefonowałem do Stallmana. Chcąc uczynić "marchewkę" bardziej smakowitą, dyskutowałem z nim o dalszych możliwych kompromisach. Co będzie, jeżeli wydawca opublikuje książkę w podwójnej wersji z dwiema różnymi licencjami, tak jak Sun Microsystem postąpił z Open Office, pakietem wolnego oprogramowania biurowego? Wydawca mógłby wydać wersję e-bookową w normalnym formacie, korzystając ze wszystkich standardowych obostrzeń związanych z oprogramowaniem tego rodzaju, oraz mniej estetyczną, kopiowalną wersję HTML-ową. + +Stallman orzekł, że w zasadzie nie sprzeciwia się pomysłowi rozszczepienia licencji, ale nie chce, aby wersja wolna była gorsza od płatnej. Poza tym stwierdził, że pomysł jest dość kłopotliwy. Podwójna licencja jedynie dlatego została zastosowana do Sunowskiego Open Office, że on nie miał żadnego wpływu na tę decyzję. Jednakże w tym przypadku on, Stallman, może mieć wpływ na wynik, gdyż może odmówić współpracy. + +Zasugerowałem kilka innych rozwiązań, ale bez żadnego efektu. Udało mi się jedynie przekonać go, by zawarte w licencji e-booka zezwolenie na udostępnianie ograniczyć jedynie do rozpowszechniania niekomercyjnego. + +Na koniec zasugerował, abym zawiadomił wydawcę, iż obiecałem mu, że książka będzie wolno dostępna. Na to nie mogłem przystać, ale stwierdziłem, że praca bez jego współpracy wydaje mi się niemożliwa do skończenia. Wydawał się być usatysfakcjonowany i zakończył rozmowę swym zwyczajowym "Szczęśliwego hakowania". + +Ja i Hening spotkaliśmy się z Tracy następnego dnia. Powiedziała, że firma jest skłonna zgodzić się na wydanie niezakodowanych fragmentów książki, które będzie można swobodnie kopiować, ale ich wielkość ogranicza do 500 słów. Henning stwierdził, że to nie wystarczy do spełnienia obietnicy złożonej przeze mnie Stallmanowi. Tracy wspomniała o zobowiązaniach jej firmy wobec takich dostawców sieciowych jak Amazon.com. Zgoda na jednorazowe odkrycie zawartości e-booka oznaczałaby ryzyko narażenia się na pretensje partnerów handlowych. Zakładając, że nie zmienią się stanowiska wydawcy i Stallmana, musiałem podjąć decyzję. Mogłem wykorzystać dwa już przeprowadzone wywiady i złamać obietnicę daną Stallmanowi lub postąpić zgodnie z etyką dziennikarską i wycofać się z ustnej obietnicy danej wydawcy, rezygnując z pisania książki. + +Po spotkaniu poszedłem z agentem do pubu na Third Avenue. Z jego telefonu komórkowego zadzwoniłem do Stallmana, a ponieważ nikt nie odebrał, nagrałem się na automatyczną sekretarkę. Henning zostawił mnie samego, abym miał czas na zebranie myśli. Po chwili wrócił i podając mi telefon komórkowy, powiedział: + +"To Stallman" + +Od samego początku rozmowa przebiegała marnie. Przekazałem, co Tracy mówiła o zobowiązaniach zewnętrznych wydawcy. + +"Tak - stwierdził Stallman beznamiętnie. - A co mnie obchodzą ich przeklęte zobowiązania i kontrakty z innymi?" + +Stwierdziłem, że wymaganie, by jeden z głównych domów wydawniczych ryzykował bitwę prawną z partnerami z powodu zawierającego 30 000 słów e-booka, to zbyt wiele. + +"Nie rozumiesz, że właśnie o to chodzi? - powiedział Stallman. - Właśnie po to to robię. Potrzebne jest symboliczne zwycięstwo. Chcę, aby dokonali wyboru między wolnością i biznesem". + +Słowa "symboliczne zwycięstwo" odbijały się echem w moje głowie, gdy wzrokiem bezwiednie błądziłem po oknie, przyglądając się pieszym przesuwającym się po chodniku. Wchodząc do baru, byłem zadowolony, że znajduje się on zaledwie o przecznicę od rogu ulicy upamiętnionego w roku 1976 piosenką Ramonesa 53rd and 3rd, którą lubiłem grać, gdy byłem muzykiem. Tak samo jak owa opisana tam "męska prostytutka" czułem, że wszystko, co wcześniej miało sens, właśnie się rozpada. Ironia losu była niemal namacalna. Po tygodniach spokojnego przyglądania się zmaganiom innych sam znalazłem się w sytuacji kogoś usiłującego dokonać rzeczy niemal niemożliwej: namówienia do kompromisu Richarda Stallmana. + +Gdy nadal uśmiechając się i chrząkając, starałem się usprawiedliwić stanowisko wydawcy i przekonać Stallmana o mojej sympatii do niego, on, jak drapieżnik wyczuwający krew, zaatakował: + +"Ach, to tak? Starasz się mnie przycisnąć do muru? Zamierzasz po prostu przekonać mnie do ich racji?" + +Wróciłem do sprawy podwójnej licencji. + +"To znaczy licencji" - uciął krótko. + +"Tak licencji. Copyright. Prawo autorskie. Cokolwiek" - powiedziałem, czując się jak ranny zwierz zostawiający za sobą krwawy ślad. + +"Aha, więc dlaczego po prostu nie robisz tego, co ci mówię" - wrzasnął. + +Musiałem do końca wyciągać przeróżne argumenty w obronie stanowiska wydawcy, bo w moich notatkach pozostała wzmianka, że Stallman rzucił na koniec: "A co mi do tego? To, co robią, to diabelstwo, a ja czortów wspierać nie będę. Żegnam". + +Gdy tylko skończyłem rozmowę, mój agent wsunął mi w rękę szklankę świeżo nalanego Guinnessa. "Myślę, że to ci się przyda - powiedział ze śmiechem. - Widziałem, że pod koniec diabli cię brali". + +Rzeczywiście trząsłem się ze złości. I nie mogłem przestać, dopóki nie opróżniłem ponad połowy Guinnessa. Szlag mnie trafił, gdy usłyszałem, że jestem wysłannikiem "diabła". Byłem wściekły tym bardziej, że jeszcze trzy miesiące temu w mieszkaniu w Oakland rozmyślałem, o czym będę teraz pisał. A teraz siedziałem w miejscu, które dotąd znałem jedynie z rockowych piosenek, spotykałem się wydawcami, piłem piwo z agentem, którego do dnia wczorajszego nigdy na oczy nie widziałem. Było to tak surrealistyczne jak oglądanie odbicia własnego życia na filmie wyświetlanym wstecz. + +Po jakimś czasie mój organizm jednak odreagował i poczucie absurdu zamieniło się w niepohamowany wybuch śmiechu. W oczach mojego agenta zapewne wyglądało to na nerwowe załamanie kolejnego przewrażliwionego autora. A ja po prostu zacząłem doceniać absurdalne piękno mojej sytuacji. Interes wyjdzie lub nie, ale i tak zbierałem materiał na doskonałą historię. Gdy wybuchy mego konwulsyjnego śmiechu przycichły, wzniosłem toast. + +"Witam na froncie, przyjacielu - powiedziałem, stukając się z agentem kuflami. - "Cieszmy się, miast smucić". + +Gdyby to rzeczywiście była sztuka odgrywana na scenie, miałaby swe romantyczne interludia. Wyczerpani napięciem ostatniego spotkania, zostaliśmy zaproszeni przez Tracy na drinka z jej współpracownikami. Opuściliśmy bar na Third Avenue i skierowaliśmy się w stronę East Village, by spotkać się z nimi. + +Rozmawiając z Tracy, starannie unikałem tematów biznesowych. Rozmowa była przyjemna, relaksująca. Przed rozstaniem umówiliśmy się na spotkanie następnego wieczoru. I znów wieczór był tak przyjemny, że Stallman i e-book stały się odległym wspomnieniem. + +Po powrocie do Oakland dzwoniłem do różnych zaprzyjaźnionych dziennikarzy i znajomych. Opowiadałem o kłopotliwym położeniu, w jakim się znalazłem. Większość wyrzucała mi, że zbyt dużo obiecałem Stallmanowi na wstępnym spotkaniu. Były wykładowca szkoły dziennikarskiej radził, bym zignorował komentarz Stallmana na temat "hipokryty" i po prostu napisał, co mam do napisania. Dziennikarze, którzy znali stallmanowskie podejście do mediów, dawali dowody sympatii, ale jak jeden mąż mówili to samo: sam musisz się z tym uporać. + +Postanowiłem odłożyć książkę na drugi plan. Nawet z dwoma dotychczasowymi wywiadami nie posunąłem się zbytnio do przodu. Poza tym dawało mi to szansę rozmawiania z Tracy bez wcześniejszego ustalania spraw z Henningiem. Umówiliśmy się na spotkania jeszcze przed Bożym Narodzeniem: raz ona przyleciała na zachodnie wybrzeże, raz ja poleciałem do Nowego Jorku. Przed końcem stycznia spakowałem laptopa, wszystkie notatki i wylądowałem na lotnisku JFK. Pobraliśmy się 11 maja. To sporo jak na jedną nienapisaną książkę. + +Latem zacząłem rozmyślać nad notatkami z wywiadów i napisaniem na ich podstawie artykułu. Nie miałem żadnych wyrzutów sumienia, gdyż ustalając warunki wywiadów, nic nie mówiliśmy o klasycznych mediach drukowanych. Przyznaję, że czułem się swobodniej, gdyż przez kilka miesięcy sprawa w ogóle nie była poruszana. Od czasu naszej rozmowy telefonicznej otrzymałem od Stallmana tylko dwa e-maile. W obu dawał mi burę za użycie terminu "Linux" zamiast "GNU/ Linux", co mi się przydarzyło w kilku artykułach pisanych dla magazynu WWW Upside Today. Poza tym miałem spokój. W czerwcu, mniej więcej w tydzień po przemówieniu na Uniwersytecie Nowojorskim, przymierzyłem się do napisania o Stallmanie artykułu prasowego na około 5000 słów. Tym razem poszło gładko. Upływ czasu spowodował, że emocje opadły i pisałem spokojnie. + +W lipcu, w rok od otrzymania pierwszego e-maila od Tracy, zadzwonił Henning. Powiedział, że O'Reilly & Associates, wydawnictwo z Sebastopola w Kalifornii, jest zainteresowane biografią Stallmana. Ucieszyło mnie to. Ze wszystkich wydawnictw na świecie O'Reilly, które wydało The Cathedral and the Bazaar Erica Raymonda, zdawało się najlepiej wyczuwać problem, który zniweczył pierwszą próbę napisania książki o Stallmanie. Jako reporter często korzystałem z wydanego przez O'Reilly Open Sources jako źródła informacji historycznych. Wiedziałem, że różne rozdziały tej książki, w tym rozdział napisany przez Stallmana, zostały opublikowane z licencją zezwalającą na redystrybucję. Takie informacje mogły być przydatne, gdyby ponownie doszło do dyskusji na temat wydania elektronicznego. + +I rzeczywiście, sprawa wróciła. Od Henninga dowiedziałem się, że wydawnictwo zamierza wydać książkę w dwóch wersjach, klasycznej oraz w nowej serii subskrybowanych książek elektronicznych Safari Tech Books Online. Henning ostrzegł mnie, że licencja użytkownika Safari zawierała pewne ograniczenia3, ale O'Reilly jest skłonne zezwolić użytkownikom na kopiowanie i rozpowszechnianie tekstu niezależnie od rodzaju publikacji. W zasadzie jako autor mogłem wybierać między Open Publication License i GNU Free Documentation License. + +Sprawdziłem zawartość, pochodzenie i podteksty obu licencji. Open Publication License (OPL)4 daje czytelnikom prawo reprodukcji i rozpowszechniania pracy w całości lub w częściach w dowolnej postaci "fizycznej lub elektronicznej" z warunkiem objęcia kopii tą samą licencją. Pozwala także, pod pewnymi warunkami, na dokonywanie modyfikacji tekstu. Na koniec licencja ta zawiera kilka punktów ograniczeń do wyboru przez autora, który może ograniczyć tworzenie "istotnie zmienionych wersji" i książek pochodnych bez uzyskania jego wcześniejszej zgody. + +Natomiast GNU Free Documentation License (GFDL)5 pozwala na kopiowanie i rozpowszechnianie dokumentu w dowolnej postaci, jeżeli tylko zachowana zostanie pierwotna licencja. Pozwala także na modyfikowanie dokumentu pod pewnymi warunkami. Jednak w przeciwieństwie do OPL nie zawiera opcji pozwalających autorowi na ograniczanie wprowadzania zmian. Nie zezwala także na odrzucanie przez autora modyfikacji, które mogą prowadzić do powstania produktu konkurencyjnego. Narzuca także określoną postać przedniej i tylnej okładki, jeżeli ktoś inny niż właściciel praw autorskich zamierza opublikować więcej niż 100 egzemplarzy. + +Badając licencje, odwiedziłem także witrynę WWW projektu GNU i jej stronę Various Licenses and Comments About Them (Różne licencje i komentarze o nich)6 i 7. Znalazłem tam krytyczną opinię Stallmana na temat Open Publication License. Dotyczyła ona tworzenia wersji zmodyfikowanych i możliwości wybierania przez autora punktów ograniczających wprowadzanie zmian. Według Stallmana, jeżeli autor nie zamierzał wprowadzać żadnych ograniczeń, lepiej było zdecydować się na GFDL, gdyż minimalizowało to ryzyko wynikające z możliwości, jakie dawały opcje nie wybrane. + +W obu licencjach zezwolenie na dokonywanie modyfikacji wynikało z ich pochodzenia. W obu przypadkach prawo modyfikowania tekstu miało dać możliwość poprawiania instrukcji i podręczników i umożliwienie innym korzystania z wprowadzonych poprawek. Ponieważ moja książka nie miała być podręcznikiem, niewiele mnie obchodziły klauzule dotyczące modyfikacji. Zależało mi jedynie na tym, aby użytkownicy wersji elektronicznej mieli taką samą wolność rozpowszechnia kopii jak ci, którzy kupią książkę drukowaną. Uważając obie licencje za spełniające moje wymagania, podpisałem umowę przysłaną przez wydawnictwo O'Reilly. + +Jednak nadal intrygowała mnie możliwość nieograniczonego modyfikowania tekstu. Podczas moich poprzednich negocjacji z Tracy zastanawiałem się, jaki wpływ na książkę elektroniczną mogą mieć warunki licencji w stylu GPL. Doszedłem do wniosku, że w najgorszym razie taka licencja zapewni niezłą reklamę, zaś w najlepszym - skłoni czytelników do udziału w procesie tworzenia książki. Jako autor miałem ochotę pozwolić ludziom na wnoszenie poprawek, aby tylko moje nazwisko pozostawało na stronie tytułowej. Ciekawiła mnie także możliwość obserwowania ewolucji książki. Wyobrażałem sobie następne wydania jak rodzaj elektronicznej wersji Talmudu, gdzie mój oryginalny tekst, umieszczony w środkowej kolumnie, byłby otoczony objaśniającymi komentarzami umieszczonymi na obu marginesach. + +Inspiracją tej wizji był Project Xanadu (http://www.xanadu.com), legendarna koncepcja programistyczna Teda Nelsona z roku 1960. Na Open Source Conference, zorganizowanej przez O'Reilly w roku 1999, widziałem pierwszą demonstrację projektu Udanax będącego odrostem Xanadu i to, co widziałem, zachwyciło mnie. Podczas prezentacji dokument pierwotny i pracę pochodną pokazano w dwóch sąsiednich kolumnach zwykłego tekstu. E-bookowa biografia Stallmana nie miała stać się Udanaxem, ale dawała taką możliwość technologiczną, więc nie należało użytkownikom odbierać szansy takiej zabawy8. + +Gdy Laurie Petrycki, moja redaktorka w O'Reilly pozwoliła mi na wybieranie między OPL i GFDL, mogłem znów popuścić wodze fantazji. Do września 2001, gdy podpisałem kontrakt z O'Reilly, stało się jasne, że e-booki się nie przyjęły. Wiele wydawnictw, w tym wydawnictwo Tracy, straciło zainteresowanie ich wydawaniem. Zadziwiło mnie to i zaciekawiło. Czy ta forma przetrwałaby, gdyby została użyta nie jako inna postać publikacji lecz jako narzędzie do budowania więzi społecznych? + +Po podpisaniu umowy poinformowałem Stallmana, że sprawa książki znów jest aktualna. Wspomniałem, że O'Reilly daje mi możliwość wyboru między Open Publication License i the GNU Free Documentation License. Stwierdziłem, że skłaniam się raczej ku OPL tylko z tego powodu, aby nie dać innym wydawnictwom możliwości wydania tej samej książki w innych okładkach. Stallman na obronę GFDL podał argument, że O'Reilly już kilkakrotnie z tej licencji korzystało. Zaproponowałem umowę: wybiorę GFDK, jeżeli Stallman zgodzi się na większą liczbę wywiadów i przyczyni się do rozreklamowania książki. Przystał na wywiady, ale zastrzegł, że jego ewentualny udział w reklamowaniu książki będzie zależał od jej treści. Uważając to za uczciwe postawienie sprawy, umówiłem się na wywiad w Cambridge 17 grudnia 2001. + +Postarałem się na skoordynowanie terminu wywiadu ze służbową podróżą Tracy do Bostonu. Na dwa dni przed podróżą Tracy zaproponowała, aby zaprosić Stallmana na obiad. + +"Tak, czy inaczej, to przecież on nas połączył" - stwierdziła. + +Wysłałem do niego e-mail z propozycją i natychmiast otrzymałem akceptującą odpowiedź. Po przyjeździe następnego dnia do Bostonu spotkałem się z Tracy w hotelu, gdzie się zatrzymała, i zamówiłem taksówkę do MIT. Gdy znaleźliśmy się na Tech Squre, jeszcze przed zapukaniem do drzwi usłyszeliśmy Stallmana zajętego dyskusją. + +"Myślę, że nie będziecie mieć nic przeciwko" - powiedział, otwierając drzwi na tyle, abyśmy oboje mogli wejść i zobaczyć osobę, z którą rozmawiał. Była to młoda, około + +25-letnia kobieta. Na imię miała Sarah. + +"Pozwoliłem sobie zaprosić kogoś jeszcze do towarzystwa przy obiedzie" - powiedział, zerkając na mnie z chytrym uśmieszkiem, takim samym, jakim mnie obdarzył w restauracji w Palo Alto. + +Prawdę mówiąc, nie byłem zbytnio zaskoczony. Już kilka tygodni wcześniej przez matkę Stallmana dotarły do mnie wieści, że ma on nową przyjaciółkę. "W ostatnim miesiącu razem byli w Japonii, gdzie Richard pojechał odebrać nagrodę Takeda" - powiedziała mi pani Lippman9. + +W drodze do restauracji dowiedziałem się, w jaki sposób Sarah i Richard się poznali. Ciekawe, że te okoliczności nie były mi obce. Pracując nad powieścią, Sarah usłyszała o Stallmanie i jego interesującej osobowości. Postanowiła, że posłuży jej jako wzór dla jednej z powieściowych postaci. Chcąc dowiedzieć się, jak w rzeczywistości wygląda pierwowzór jej bohatera, poprosiła go o wywiad. Potem wszystko potoczyło się szybko. Jak powiedziała, byli razem od początku roku 2001. + +"Szczerze podziwiam sposób, w jaki Richard zbudował cały ruch polityczny poświęcony zaspokojeniu tego, co przepełniało całe jego jestestwo" - powiedziała Sarah, wyjaśniając, co ją przyciągnęło do Stallmana. + +Moja żona natychmiast spytała: "A cóż to było?" + +"Miażdżąca samotność". + +Podczas obiadu panie zajęły się własną rozmową, ja zaś spędziłem większość czasu, starając się dociec, czy ostatnie 12 miesięcy nieco zmiękczyło Stallmana. Nie spostrzegłem niczego, co mogłoby sugerować taką zmianę osobowości. Stał się może nieco bardziej figlarny i jego oczy dość często spoczywały na piersiach mojej żony, ale poza tym pozostał tak samo "kłujący jak jeż". W pewnym momencie moja żona powiedziała dość stanowczo "Broń Boże" jedynie po to, by usłyszeć typowe Stallmanowskie upomnienie: + +"Z przykrością muszę ci powiedzieć, że nie ma żadnego Boga". + +Jednakże gdy po obiedzie Sarah nas opuściła, obniżył nieco gardę. Gdy szliśmy do pobliskiej księgarni, przyznał, że 12 ostatnich miesięcy diametralnie zmieniło jego spojrzenie na życie. "Myślałem, że moim przeznaczeniem jest spędzić życie w samotności - powiedział. - Cieszę się, że się myliłem". + +Przed pożegnaniem wręczył mi swoją "rozrywkową" wizytówkę z adresem, telefonem i wyliczeniem ulubionych przyjemności (dobre książki, dobre jedzenie, egzotyczna muzyka i taniec), abym o tym pamiętał, umawiając się na następny wywiad. + +"Rozrywkowa" wizytówka Stallmana wręczona mi podczas wieczornego obiadu + +Następnego dnia, po kolejnym posiłku za sumę, która niech pozostanie w niepamięci, zdawał się być w jeszcze bardziej lirycznym nastroju. Wspominając swe debaty z Currier House na temat korzyści i niedogodności, jakie by przyniosła szczepionka dająca nieśmiertelność, wyraził nadzieję, że naukowcy kiedyś znajdą klucz do tej tajemnicy. "Teraz, gdy zażyłem nieco szczęścia, chciałbym mieć go więcej" - powiedział. + +Kiedy wspomniałem komentarz Sarah na temat "miażdżącej samotności", stwierdził, że nie widzi związku między samotnością w sensie fizycznym i duchowym a samotnością hakera. Jednakże, gdy później wróciliśmy do tego tematu, przyznał, że samotność lub obawa przed wieczną samotnością była główną siłą pchającą go do działania w pierwszym okresie projektu GNU. + +"Moja fascynacja komputerami nie była od czegokolwiek uzależniona - rzekł. - Moje zainteresowanie nie byłoby mniejsze, gdybym był popularny, a kobiety tłoczyłyby się wokół mnie. Jednakże jest prawdą, że na mój charakter głęboko wpłynął fakt, że nigdy nie miałem domu, a gdy znalazłem jeden, zaraz go straciłem, gdy znalazłem drugi, rychło legł w gruzach. Tym, który straciłem, była sypialnia w internacie, a tym, który został zburzony, było AI Lab. Poczucie niepewności wynikające z braku domu i przynależności do jakiejś społeczności było przemożne. Walczyłem, by odzyskać to, co straciłem." + +Po tym wywiadzie bezwiednie wytworzyło się we mnie pewne poczucie emocjonalnej symetrii. Słuchając Sarah mówiącej o tym, co ją pociąga w Stallmanie, i słuchając jego opisu uczuć, które pchnęły go do stworzenia ruchu wolnego oprogramowania, rozmyślałem nad tym, co skłoniło mnie do napisania tej książki. Od lipca 2000 nauczyłem się doceniać zarówno uwodzicielską, jak i odpychającą stronę charakteru Stallmana. Jak Eben Moglen przede mną tak i ja uznałem, że błędem jest traktowanie tej osobowości jako istniejącej obok i wyabstrahowanej z ruchu wolnego oprogramowania. Są to rzeczy, zjawiska wzajemnie się kształtujące i często nierozdzielne. + +Jestem pewien, że nie każdy czytelnik w tym samym stopniu odczuwa pokrewieństwo duchowe ze Stallmanem, niektórzy po przeczytaniu tej książki zapewne w ogóle się od niego odżegnają, ale większość chyba go zaakceptuje. Niewiele jest osób o osobowości tak pełnej humanizmu. Mam szczerą nadzieję, że inni, wsparci licencją GFLD, poczują nieprzepartą ochotę do uzupełnienia tego wstępnego portretu i rzucą nowe światło na osobę Richarda M. Stallmana. diff --git a/examples/txt/gpl-en.txt b/examples/txt/gpl-en.txt new file mode 100755 index 0000000..96ac7bf --- /dev/null +++ b/examples/txt/gpl-en.txt @@ -0,0 +1,226 @@ +GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright © 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +Preamble + +The GNU General Public License is a free, copyleft license for software and other kinds of works. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. +TERMS AND CONDITIONS +0. Definitions. + +“This License” refers to version 3 of the GNU General Public License. + +“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + +To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + +A “covered work” means either the unmodified Program or a work based on the Program. + +To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + +To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. +1. Source Code. + +The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + +A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. +2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. +7. Additional Terms. + +“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. +11. Patents. + +A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. + +A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + +You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . + +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . + diff --git a/examples/txt/gpl-pl.txt b/examples/txt/gpl-pl.txt new file mode 100755 index 0000000..edcd198 --- /dev/null +++ b/examples/txt/gpl-pl.txt @@ -0,0 +1,254 @@ +POWSZECHNA LICENCJA PUBLICZNA GNU + +Wersja 3, 29 czerwca 2007 r. + +Copyright (C) 2007 Free Software Foundation, Inc. + +Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + +Preambuła + +Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + +Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. Ty także możesz ją stosować do swoich programów. + +Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + +Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + +Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + +Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + +Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + +Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + +Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + +Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + +ZASADY I WARUNKI + +0. Definicje + +„Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + +„Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + +„Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + +„Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + +„Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + +„Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + +„Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + +Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + +1. Kod źródłowy + +„Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + +„Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + +„Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + +„Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + +Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + +Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + +2. Podstawowe zezwolenia + +Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + +Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + +Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + +3. Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + +Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + +Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + +4. Przekazywanie wiernych kopii + +Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + +Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + +5. Przekazywanie zmodyfikowanych wersji Źródła + +Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + +a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + +b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + +c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + +d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + +Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + +6. Przekazywanie form niebędących źródłem + +Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + +a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + +b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + +c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + +d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + +e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + +Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + +„Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + +„Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + +Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + +Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + +Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + +7. Warunki dodatkowe + +„Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + +Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + +Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + +a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + +b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + +c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + +d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + +e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + +f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + +Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + +Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + +Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + +8. Wygaśnięcie + +Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + +Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + +Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + +Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + +9. Brak wymogu akceptacji przy otrzymaniu kopii + +Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + +10. Automatyczne udzielenie licencji kolejnym odbiorcom + +Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + +„Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + +Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + +11. Patenty + +„Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + +„Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + +Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + +W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + +Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + +Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + +Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + +Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + +12. Zakaz ograniczania praw (wolności) osób trzecich + +Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + +13. Używanie z Powszechną Licencją Publiczną GNU Affero + +Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + +14. Poprawione wersje niniejszej Licencji + +W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + +Każdej wersji nadaje się wyróżniający ją numer. Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + +Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + +Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + +15. Zastrzeżenia dotyczące gwarancji + +W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + +16. Ograniczenie odpowiedzialności + +O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + +17. Interpretacja punktów 15 i 16 + +Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + +KONIEC ZASAD I WARUNKÓW + +Jak stosować niniejsze warunki do twoich nowych programów + +Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + +W tym celu do programu dołącz poniższe informacje. Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + +Copyright (C) + +Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + +Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + +Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. Jeżeli nie została dostarczona, odwiedź . + +Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + +Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + Copyright (C) + +Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + +To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + +Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + +Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie . + +Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. Najpierw jednak przeczytaj . + diff --git a/examples/txt/help-en.txt b/examples/txt/help-en.txt new file mode 100755 index 0000000..f90bb26 --- /dev/null +++ b/examples/txt/help-en.txt @@ -0,0 +1,1156 @@ +#$ +A Few Words About Automatic Translation + +The idea of translating texts from one language to another using a computer is almost as old as the computer itself. In the course of the cold war Allied secret service workers hoped the computer to replace qualified spies in translating secret Russian documents into English. Even though translation of documents becomes a reality today, the vision of an international conference without human translators seems as distant as it was half a century ago. + +With years, linguists, philologists, and computer scientists verified their expectations from an automatic translator and simultaneously tried to alter the attitude of users. Both parties came to the conclusion that the computer cannot translate Shakespeare, Joyce, nor Wharton. It is not able to translate even a simple joke. Automatic translation is not applicable in the case of translation of literary texts, it is, however, adequate when dealing with professional texts from specific, preferably narrowed, domains. + +In the case of texts from general domain the computer may only help man establish the subject matter of a text, or do the hard work that boils down to the specification of most appropriate equivalents in particular contexts. It can also order them in the most probable linguistic units. Nevertheless, the task of the ultimate establishment of meaning still depends on man. + + +Direct Translation + +The easiest fashion of translating texts is the substitution of a words of a source language with respective equivalents from a target language. Setting aside the fact that as early as in '60 it was acknowledged that the method is unreliable, systems of automatic translation that rely on it are still being developed. This method is applied in the majority of translating systems available on the Polish market. + +Test +djshusf + + +Transfer-Based Translation + +The most widespread method incorporated in the automatic translation systems around the world is the transfer method. It comprises the following: +• dictionary; +• text representation; +• grammar; +• syntax analysis. + + +Dictionary + +The most laborious part in the process of developing an automatic translation system is the compilation of its dictionary. The description of a dictionary data should meet the following requirements: +• the description must be compatible with the translation algorithm, +• the coverage of dictionary should be as complete as possible, +• entries of the dictionary should be elaborated in as much detail as possible; +The simultaneous fulfilment of the conditions mentioned above is not straightforward, and the compilation of a 'decent' dictionary is time-consuming. That is why automatic translation systems most of the times rely heavily on a vocabulary from a limited domain only. + + +Text Representation + +A pivotal stage in a translation is the manner of presenting an analysed section (most frequently a sentence) in the form that can be then transferred to a representation of a target sentence. The Phrase Structure and the Relation Tree are the two most commonly found representation methods. +The former is the traditional fashion of presenting the structure of a sentence. The Polish sentence 'Zły wilk goni słabą owieczkę' is structured as follows: + + +The tree represents the following organizational pattern: The sentence comprises the nominal and the verb phrase. The nominal phrase comprises the adjective 'zły' and the noun 'wilk'. The verb phrase comprises the verb 'goni' and the sub-structure: the nominal phrase. The sub-structure of the nominal phrase is constituted by the adjective 'słabą' and the noun 'owieczkę'. + +In the tree structure approach it is assumed that every word (with the exception of the predicate verb) in a sentence is dependent on another one. The tree represents this dependence. An example of a sentence represented by the means of a relation tree structure is shown below: + +Figure 3. An example of the relation tree + +The subject of the activity ('pies') and the object of the activity ('mysz') depend on the verb. Adjectives determining the noun ('duży' and 'wściekłą') depend on the respective nouns ('pies' and 'mysz'). It is not always easy to determine relationship between individual components -- related words do not have to be adjacent. The sentence 'Słabą goni wilk zły owieczkę', for instance, may be presented using the tree structure from Figure 3. The dependence between the adjective 'słabą' and the noun 'owieczkę' is established on the premises of case, gender, and number agreement of both words. + + +Grammar + +Having determined the manner of representation of a text it becomes necessary to establish a method of such a representation. Most often this task comprises of grammar description and syntax analysis of a text. By the notion of grammar a number of rules that specify how correct sentence structures can be formed is understood. Additionally, grammar may contain information about the structure of sentences formed on the basis of those rules. + +Grammar is a mathematical attempt to delineate linguistic processes that are reluctant to subdue to mathematical formalisation. As for now, no formal representation of a language have been developed that would encompass all possible constructions. In other words, no matter the level of advancement of a grammar description, man can produce a sentence the structure of which has not been included in this description. + + +Syntax Analysis + +The process of verification of compatibility between a text and a grammar description is called syntax analysis. Its outcome is both to affirm whether a particular sentence agrees with the grammar description (a sentence that meets such requirements is correct) and to yield a sentence structure in a given representational method (e.g. in a tree structure). In the case of automatic translation it is vital that the syntax analysis yields representational schemata also for sentences that do not agree with the grammar description. + + +Transfer + +A text representation that has been syntactically analysed then undergoes transfer. In TRANSLATICA this stage entails transformation of a syntactical structure of a source language into a respective tree structure in a target language. Both representations can be compared by using the option of translating with the display of tree structure (button ) + + +Generating Translation + +The last stage of the transfer-based method of translation is generating a translated text on the basis of the previously obtained representation. At this stage one has to be mindful of a specific word order in a given language and of the manner of inflecting words. + +#$ +Main Features of TRANSLATICA + +The History of Development + +The TRANSLATICA system was developed between 1996 and 2002 as the POLENG system that translated only from Polish into English. It originated at Adam Mickiewicz University in Poznan at the Faculty of Mathematics and Computer Science, with the help of The State Committee for Scientific Research (between 1999 and 2000), Polish Phonetic Association (between 1996 and 2001), and Allied Irish Bank (2002). + +The TRANSLATICA system originated in the year 2004, when, on the basis of the previously developed translation techniques on the one hand and the lexicon based on the PWN-Oxford English-Polish Dictionary, the function of translating from English into Polish was added. +In 2005 the new edition of TRANSLATICA was published. It included a broader dictionary of words and phrases, larger sets of transfer rules and integration with a wider range of office application. + + +TRANSLATICA Dictionary + +A dictionary used in a machine translation system has to be compatible with a computer algorithm. + +As the development of entries in such a dictionary is laborious, a very careful selection of the words to be included in the dictionary becomes a prerequisite. In the course of the development of Polish-English translation by the POLENG team a number of computer, legal, economic and internet texts was assembled, from which the most frequent words and phrases were selected. Afterwards, the phrases were carefully annotated according to the rules of the translation system and incorporated in the TRANSLATICA dictionary. The source of vocabulary used in the English-Polish translation is the PWN-Oxford English-Polish Dictionary (a Polish abbreviation for the name is WSAP). The following versions of TRANSLATICA are to be based on the Polish-English PWN-Oxford dictionary (currently under construction - 2004). The WSAP dictionary was also used (after being reverseA +d) to supplement Polish-English dictionary in TRANSLATICA, the result being the greater accuracy of Polish-English entries. However, the greater accuracy of the dictionary does not entail a better quality of translation. In the authors' opinion, the quality of Polish-English translation is higher than the English-Polish one. + + +Grammar, Representation, and Syntax Analysis + +The authors have developed their own formalism for the description of both grammar and transfer rules. The same formalism is used for both Polish-English and English-Polish translation, but the rules themselves differ. As a result, the translation process is irreversible: e.g. an attempt to translate a Polish text to English and then back to Polish will usually result in the original and the resulting Polish texts being different. The idea of reversible translation is tempting, but given the differences between languages it has not yet been implemented even for closely related languages. + +In TRANSLATICA, the text is processed to the form of a phrase structure (see Text Representation in the section A few words about automatic translationIDH_ABOUT_MT). Syntactic analysis allows structures incongruent with the grammatical description (including language errors), and for each such construction a text representation is generated and transferred. + + +Some Interesting Issues in Translation + +As Polish and English belong to different language families (Slavonic and Germanic respectively) even the simplest sentence constructions may differ. + + +Syntax Differences + +Polish allows a relatively unrestrained variation in the order of sentence components (e.g. the verb often precedes the subject). English syntax is much more restrictive. Moreover, it is sometimes the case that the subject in a Polish sentence becomes the object in the English equivalent of that sentence, or the other way round. Additionally, a dummy subject may operate in Polish, whereas it does not occur in English. Let us consider a few examples: + +Ty mi się wcale nie podobasz. +Ty nie podobasz się mi wcale. +Ty wcale nie podobasz się mi. +Ty wcale mi się nie podobasz. +Wcale mi się nie podobasz. +Mi się wcale nie podobasz. +Mi się nie podobasz wcale. +Nie podobasz się mi wcale. + +The English equivalent for all of those sentences is: I don't like you at all. And that is the translation produced by TRANSLATICA for any of the Polish sentences listed above. + + +Differences in the Meanings of Words + +A Polish word may have a number of equivalents in English, and vice versa. The task of a machine translation system is to choose the most appropriate equivalent in a given context and in a given sentence. For instance, in TRANSLATICA dictionary the verb stop has 20 different equivalents (nothing to say about noun meanings of the word). TRANSLATICA translation algorithm finds the most appropriate equivalent on the basis of a sentence structure analysis and the context of translation, as in: +The car stopped at lights. Samochód zatrzymał się na światłach. +The pain stopped when she had a cup of coffee. Ból ustał, gdy wypiła filiżankę kawy. +He stopped the hole with wax. Zatkał dziurę woskiem. +He wondered if the wind would stop. Zastanawiał się czy wiatr ustanie. +How to stop violence in the family? Jak powstrzymać przemoc w rodzinie? +The strike will stop the production. Strajk spowoduje przerwę w produkcji. +The judge has unfortunately stopped the trial. Sędzia niestety nie dopuścił do rozprawy. +In the southern regions of the country the electricity has been stopped. W południowych regionach kraju elektryczność została odcięta. +When he enters the room, the music will stop. Gdy on wejdzie do pokoju, muzyka ucichnie. +After 10 minutes he stopped smoking. Po 10 minutach przestał palić. +They stopped for a lunch in a nice restaurant. Zatrzymali się na lunch w ładnej restauracji. + + +#$ +Local Installation + +To install the TRANSLATICA software launch TRANSLATICA_Setup.exe file. The installation program copies the files to the user's computer and then initiates the Integrator. The role of the Integrator is to add the functionality of TRANSLATICA to the applications chosen by the user (see IntegratorIDH_VERSIONS). The program can be uninstalled by clicking the Start menu and selecting: Programs -> Translatica Enterprise/Office+ > Uninstall. + + +#$ +Installation in the Local Area Network + +In case of local networks that run under Microsoft Windows it is possible to install TRANSLATICA for specific users or computers. This requires that the services: Active Directory, DNS, DHCP are configured correctly on the server. +The installation file (Translatica-Enterprise.msi) should be copied into a chosen folder (e.g. Msi_Pack) on any partition that does not store the operating system or boots the computer. +The folder should be shared in the network. + + + +Choose Start ->ProgramS -> Administrative Tools -> Active Directory Users and Computers. From the pop-up menu of the domain click New -> Organizational Unit. + + + +When the organization unit is created, add new users to the organizational unit. + + + +Next, set the properties of the unit: Choose Properties from the pop-up menu. Add a new Group Policy in the Group Policy tab. Edit the policy according to the required configuration. + +Installation dedicated for the User + +The aim of such an installation is to enable the chosen user to run TRANSLATICA on any computer of the network. +To do that, click the icon UserConfiguration, next choose Software Settings. + + + +Right-click Software installation, choose New -> Package, and point to the msi file, located in the installtion folder. Choose the method of installation in the Deployment Software window. Choose Assigned if the installation should be executed automatically directly after the user logs in. Choose Published if you wish the user to install the software on his/her demand (this is done via Control Panel -> Add or Remove Programs -> Add New Programs). + + + +Installation dedicated for the Computer + +This aims to enable any user to run TRANSLATICA on a specific computer. +To do that, click Computer Configuration, next Software Settings. + + + +Right-click Software installation, choose New -> Package, and point to the msi file located in the installation folder. The installation will be started on the computer directly after the re-start. + +#$ +Versions of TRANSLATICA + +The TRANSLATICA translation program comes in two basic versions: Premium and Office, and two other versions dedicated for corporations: Office+ and Enterprise. + +The Premium version is intended for fast processing of documents connected with Internet - web pages or Outlook Express documents. + +Versions: Office, Office+ and Enterprise add the functions of translating documents within MS Office programs: MS Word, MS Excel, MS PowerPoint, MS Outlook and two Open Office programs: Writer and Calc. + +Office+ and Enterprise versions include Batcher, the program that allows for translation of a number of documents in the batch mode. The Enterprise version is additionally equipped with functions that allow the system to be adjusted to the requirements of a particular company. These functions include: Domain Dictionaries, Translation Memory and Company Dictionary. + +In all versions, the user can apply the translation text editor. Translation Editor allows the user to use the translation function in a user-friendly editing environment. + + +#$ K +Integrator + +You can launch the Integrator by clicking the Start menu and selecting: Programs -> Translatica X -> Integrator. The Integrator verifies which of the programs that can work with TRANSLATICA are installed on the computer and then it allows the user to choose the ones that should be integrated. + +The Integrator displays the following dialogue box: + + +By checking appropriate check boxes, the user can choose applications he or she would like to integrate with TRANSLATICA. + +At any time, the user can turn on or turn off the translation functionality within any of the applications mentioned above. To do this, launch the Integrator application (Start-> Programs -> Translatica Enterprise/Office+ -> Integrator) and click on the applications of your choice. + + +#$ +Language Versions + +The default language version of the application is Polish, but you can choose English from the pull-down menu displayed in the Tools -> Application Language dialogue box of the Translation Editor + + +This dialogue box, apart from giving you the option to choose the language version of the application, allows you to choose the appropriate code page. For the Polish edition of Microsoft Windows the default code page is Window-1250. The remaining code pages may be useful in non-Polish versions of Microsoft Windows. + + +#$ K +Translating in Internet Explorer + +Having integrated TRANSLATICA with Internet Explorer (by means of the Integrator), four additional icons appear on the toolbar: + + +Clicking on initiates translation from Polish to English, whereas clicking on initiates translation from English to Polish. The third icon enables the user to save a translated page on the computer (NOTE: using Internet Explorer function: File > Save would save the page before translation). +Click the button to display the Settings window. The window allows for choosing the options of translation (see SettingsIDH_MENU_TRANSLATION_SETTINGS). +The translation process may take place both on-line (when the user is connected to the Internet) and off-line (when the user is disconnected from the Internet and the page is saved on the computer). In the translation mode, the screen is divided into two windows: the upper one contains the source of translation and the lower one contains the translated page. Every page that the user visits when following hyperlinks is translated. To quit the translation mode, toggle the translation button on the toolbar. Translation of a single page takes from a few seconds to over a minute (for complex pages). + + +#$ K K +Translating in Mozilla and Mozilla Firefox +When Mozilla is integrated with TRANSLATICA, the Mozilla toollbar contains three additional buttons: + +Translation process is identical to that in Internet Explorer (see +Translation in Internet ExplorerIDH_MS_INTERNET_EXPLORER). Mozilla allows for browsing a few documents by means of tabs (Ctrl-t opens a new tab). If Mozilla is integrated with TRANSLATICA, this feature makes it possible to browse a few pages together with their translations. +Mozilla is freely downloadable from: http://www.mozilla.org/start/1.7/*!EF(‘http://www.mozilla.org/start/1.7/’)) + +#$ K +Translating in Outlook Express +If Outlook Express is integrated with TRANSLATICA, it is possible to translate both the received and composed messages. When a message is opened, three buttons are added: + + () start translation into English or Polish respectively, opens the Settings window (see SettingsIDH_MENU_TRANSLATION_SETTINGS). +The translated text appears as a new message. + +#$ K K +Translating in Microsoft Excel and Microsoft Word + +With the integration of TRANSLATICA with MS Excel additional buttons appear in the toolbar and a Translatica option is added to the Tools menu. TRANSLATICA toolbar looks like this: + + + +The buttons are linked to the following actions: + + - change the direction of translation; + - Translate to a new document. This button creates a new document containing the translated text. If the user has not made any selection in the document the whole of it will be translated; + - Translate within the original document. This button replaces the selected fragment with the translation. If the user has not made any selection the whole document will be translated. + +In MS Excel, the user can also use the following options: clicking on one of the above two buttons while pressing Shift causes the translation of the current worksheet only; clicking on one of the above two buttons while pressing Ctrl initiates the translation of the current cell only. + - Export to Translation Editor; + - Import from Translation Editor; + +Clicking on the button Export to Translation Editor will launch the TRANSLATICA Dic and feed the selection (or the whole) of the document to its source window. After that, the document can be translated and post-edited in the target window (e.g. variant equivalents may be adjusted). To retrieve the translated text back in the source application, click Import button in the source application. + + Options The button opens the Settings window (SettingsIDH_MENU_TRANSLATION_SETTINGS). + +Translation in MS Word is analogous to the translation in MS Excel with the difference that the translation of individual worksheets or cells is not possible. + + +#$ K +Translating in Microsoft PowerPoint + +Translation in MS PowerPoint is analogous to the translation in MS Excel with the difference that in Microsoft PowerPoint the user can translate individual slides. To do this, select View -> Slide Sorter from the menu bar, choose slides you want to translate and press the translation button. It is worth noting that objects embedded in MS Office documents are also translated, e.g. Excel charts in PowerPoint documents. + + + +#$ K +Translating in Microsoft Outlook + +In MS Outlook two new buttons are added, each corresponding to one direction of translation. You can translate one or more letters (to translate a group of letters select them from the appropriate folder and press the Translate button). You can find the translated letters in the Translated folder. + + +#$ K K +Translating in Writer and Calc + +If TRANSLATICA is integrated with Writer or Calc, then the following icons appear at the Writer Toolbar: + - translate into English + - translate into Polish + - open the Settings window (see SettingsIDH_MENU_TRANSLATION_SETTINGS). +These actions are also available from Translatica menu in the main menu. + +The TRANSLATICA function integrated in the Calc program allows for translating only complete documents - in contrast to MS Excel where single cells or sheets may be selected for translation. + +#$ K +Translating in Translation Editor + +The Translation Editor is initiated after running TRANSLATICA (Start > Programs > TRANSLATICA ENTERPRISE/OFFICE+ > TRANSLATICA). + +#$K +Main Menu + +FileIDH_MENU_FILE The File menu enables performing actions on files. +EditIDH_MENU_EDIT Choose the Edit menu to edit files. +ViewIDH_MENU_VIEW Choose the View menu to define display parameters. +TranslateIDH_MENU_TRANSLATION Choose the Translate menu to translate the source text or to set the translation parameters. +ToolsIDH_MENU_TOOLS Choose the Tools menu to access additional program tools. +HelpIDH_MENU_HELP Choose the Help menu to obtain more information about the program. + + +#$K +File Menu + +Choose the File menu to open or save the content of the source/target window or to exit the program. + +NewIDH_MENU_FILE_NEW New +Open source textIDH_MENU_FILE_OPEN Open source +ReopenIDH_MENU_FILE_REOPEN Reopen +Save source textIDH_MENU_FILE_SAVE_SOURCE Save source +Save source text asIDH_MENU_FILE_SAVE_SOURCE_AS Save source as +Save target textIDH_MENU_FILE_SAVE_DESTINATION Save target +Save target text asIDH_MENU_FILE_SAVE_DESTINATION_AS Save target as +Save bothIDH_MENU_FILE_SAVE_BOTH Save both +Save allIDH_MENU_FILE_SAVE_ALL Save all +CloseIDH_MENU_FILE_CLOSE Close +Close allIDH_MENU_FILE_CLOSE_ALL Close all +ExitIDH_MENU_FILE_EXIT Exit + + +#$K +File|New + +Choose File|New to start a new translation. The content of the source window will be deleted. + +#$K +File|Open source text + +Choose File|Open source text to open the source language text. Open source text dialogue box allows the user to choose a source language file and feed its content into the source editing window. + +Open source text dialogue box + +Look in Lists the current directory. Use the drop down list to select a different drive or directory. + +Files Displays the files in the current directory that match the wildcards in File Name or the file type in Files Of Type. You can display a list of files or you can show details for each file. + +File name Enter the name of the file you want to load or type wildcards to use as filters in the Files list box. + +Files of Type Choose the type of file you want to open. + +Back Click this button to go back from the current directory to the last visited directory. + +Up one level Click this button to move up one directory level from the current directory. + +Create new folder Click this button to create a new subdirectory in the current directory. + +View menu Click this to change the way in which files are displayed. + + +#$K +File|Reopen + +Choose File|Reopen to open one of last opened source files. + +#$K +File|Save source text + +Choose File|Save source text to save changes in the source window text. If the file has not yet been saved, there will appear a new dialogue box Save asIDH_MENU_FILE_SAVE_SOURCE_AS, enabling the user to enter a filename. + + +#$K +File|Save source text as + +Choose File|Save source text as to save the source window content to a text file. Save source text asIDH_MENU_FILE_SAVE_SOURCE_AS dialogue box allows the user to enter or select the name of the file to which the content of the source window is saved. + +Save source text dialogue box + +Look in Lists the current directory. Use the drop down list to select a different drive or directory. + +Files Displays the files in the current directory that match the wildcards in File Name or the file type in Files Of Type. You can display a list of files or you can show details for each file. + +File name Enter the name of the file you want to load or type wildcards to use as filters in the Files list box. + +Files of Type Choose the type of file you want to open. + +Back Click this button to go back from the current directory to the last visited directory. + +Up one level Click this button to move up one directory level from the current directory. + +Create new folder Click this button to create a new subdirectory in the current directory. + +View menu Click this button to select the type of information to be displayed. + + +#$K +File|Save target text + +Choose File|Save target text to save the changes in the target window content. +If the file has not yet been saved, a new dialogue box will appear Save target text asIDH_MENU_FILE_SAVE_DESTINATION_AS, that enables to user to enter a filename. + +#$K +File|Save target text as + +Choose File|Save target text as to save the target window content to a text file. Save target text asIDH_MENU_FILE_SAVE_DESTINATION_AS dialogue box allows the user to enter or select the name of the file to which the content of the target window is saved. + +Save target text dialogue box + +Look in Lists the current directory. Use the drop down list to select a different drive or directory. + +Files Displays the files in the current directory that match the wildcards in File Name or the file type in Files Of Type. You can display a list of files or you can show details for each file. + +File name Enter the name of the file you want to load or type wildcards to use as filters in the Files list box. + +Files of Type Choose the type of file you want to open. + +Back Click this button to go back from the current directory to the last visited directory. + +Up one level Click this button to move up one directory level from the current directory. + +Create new folder Click this button to create a new subdirectory in the current directory. + +View menu Click this button to change the way in which files are displayed. + + +#$K +File|Save both +Choose File|Save both to save both the source and the target window contents to text files. If either of the files has not yet been saved, a dialogue box Save source textIDH_MENU_FILE_SAVE_SOURCE_AS or/and Save target textIDH_MENU_FILE_SAVE_DESTINATION_AS will appear, which enables the user to enter a filename for the source/target file. + + +#$K +File|Save all + +Choose File|Save all to save all tabs contents to text files. If either of the files has not yet been saved, a dialogue box Save source textIDH_MENU_FILE_SAVE_SOURCE_AS or/and Save target textIDH_MENU_FILE_SAVE_DESTINATION_AS will appear, which enables the user to enter a filename for the source/target file. + + +#$K +File|Close +Choose File|Close to close the current tab. + +#$K +File|Close all +Choose File|Close all to close all tabs. + +#$K +File|Exit + +Choose File|Exit to quit the translation editor. + +#$K +Edit Menu + +Choose the Edit menu to execute basic editing actions that allow copying, pasting and cutting of text selections. + +UndoIDH_MENU_EDIT_UNDO Undo +RedoIDH_MENU_EDIT_REDO Redo +CutIDH_MENU_EDIT_CUT Cut +CopyIDH_MENU_EDIT_COPY Copy +PasteIDH_MENU_EDIT_PASTE Paste +DeleteIDH_MENU_EDIT_DELETE Delete +Select allIDH_MENU_EDIT_SELECT_ALL Select all +FindIDH_MENU_EDIT_FIND Find +ReplaceIDH_MENU_EDIT_REPLACE Replace +Find nextIDH_MENU_EDIT_FIND_NEXT Find next + + +#$K +Edit|Undo + +Choose Edit|Undo to undo the last text editing operation performed in the source or target window. + + +#$K +Edit|Redo + +Choose Edit|Redo to redo the last text editing operation performed in the source or target window. + + +#$K +Edit|Cut + +Choose Edit|Cut to remove the selected text from the editing window and store it in the clipboard. + + +#$K +Edit|Copy + +Choose Edit|Copy to copy the selected text to the clipboard. + + + +#$K +Edit|Paste + +Choose Edit|Paste to paste the text from the clipboard at an insertion point in either of the text editing windows. + +#$K +Edit|Delete + +Choose Edit|Delete to delete the selected text. + +#$K +Edit|Select all + +Choose Edit|Select all to select the whole text in the active editing window. + + +#$K +Edit|Find +Choose Edit|Find to find text in the current window. + +Find dialogue box + +Text to find Type text to find. + +Options | Case +sensitive Check if matching is to be case-sensitive + +Direction | Forward/Backward Check the right options to process searching forward/backward current position of the cursor + + +#$K +Edit|Replace +Choose Edit|Find to replace one text with another. + +Replace dialogue box + +Text to find Type the text to be found and replaced. + +Replace with Type the text to replace the searched text. + +Options | Case +sensitive Check if matching is to be case-sensitive + +Direction | Forward/Backward Check the right options to process searching forward/backward current position of the cursor + +Skip Click the button if the text should be skipped + +Replace all Click the button if replace all occurrences of the text. + + +#$K +Edit|Find next +In order to find the text, choose Edit|Find next to find next occurrence of the text + + +#$K +View Menu + +Choose the View menu to modify the interface display options. + +Source word boundariesIDH_MENU_VIEW_SOURCE_TOKENS Toggle display of source word boundaries +Source unknown wordsIDH_MENU_VIEW_SOURCE_UNKNOWN Toggle underlining of source unknown words +Target word boundariesIDH_MENU_VIEW_TARGET_TOKENS Toggle display of target word boundaries +Target unknown wordsIDH_MENU_VIEW_TARGET_UNKNOWN Toggle underlining of target unknown words +Source editorIDH_MENU_VIEW _SOURCE Toggle display of source editing window +Target editorIDH_MENU_VIEW_DESTINATION Toggle display of target editing window +Horizontal layoutIDH_MENU_VIEW_HORIZONTAL Horizontal layout +Vertical layoutIDH_MENU_VIEW_VERTICAL Vertical layout +Tool barIDH_MENU_VIEW_TOOLBAR Toggle display of tool bar +Status barIDH_MENU_VIEW_STATUSBAR Toggle display of status bar +FontIDH_MENU_VIEW_FONT Font selection + +#$K +View|Source word boundaries + +Choose View|Source word boundaries to show/hide word boundaries in the source text window. The boundaries are highlighted by blue markers. Markers at sentence boundaries are highlighted by dots. + + +#$K +View|Target word boundaries + +Choose View|Target word boundaries to show/hide word boundaries in the target text window. The boundaries are highlighted by blue markers. Markers at sentence boundaries are highlighted by dots. + + +#$K +View|Source unknown words + +Select View|Source unknown words to mark words that have not been recognized in the source text analysis. Such words are underlined with a yellow line. During translation these words are transferred in their original form. + + +#$K +View| Target unknown words + +Select View|Target unknown words to mark words that have not been recognized in the target text analysis. Such words are underlined with a yellow line. + + +#$K +View|Horizontal layout + +Select View|Horizontal layout to set the horizontal layout of editing windows (one below the other). + + +#$K +View|Vertical layout + +Select View|Vertical layout to set the vertical layout of editing windows (one next to the other). The layout makes it easy to compare the source and target texts. + + +#$K +View|Source editor +Select View|Source editor to show/hide the window that contains the source text. If the user wants to hide the source window when the target window is also hidden, the target window will show (at least one window must be visible). + + +#$K +View|Target editor +Select View|Target editor to show/hide the window that contains the target text. If the user wants to hide the target window when the source window is also hidden, the source window will show (at least one window must be visible). + +#$K +View|Tool bar + +Select View|Tool bar to show/hide the tool bar (at the top of the application) + + +#$K +View|Status bar + +Select View|Status bar to show/hide the status bar (at the bottom of the application). +The status bar provides basic information about the edited text: the cursor position and the current context. + + +#$K +View|Font + +Select View|Font to change the type or the size of the font in the editing windows. + + +#$K +Translate Menu + +Choose the Translate menu to run the commands related to translation. + +TranslateIDH_MENU_TRANSLATION_TRANSLATE Translate +Polish-EnglishIDH_MENU_TRANSLATION_PLEN Polish-English +English-PolishIDH_MENU_TRANSLATION_ENPL English-Polish +SettingsIDH_MENU_TRANSLATION_SETTINGS Settings + +#$K +Translate|Translate + +Select Translate|Translate to translate the text. If a text fragment is selected in the source window, only the fragment is translated; otherwise the whole content of the window is translated. +The translated text is pasted into a target window. The previous content of the target window is removed. + +If a longer chunk of text is translated, the progress window is displayed during the process of translation. The translation can then be cancelled by pressing the Cancel button. + +The progress window contains the following information: +Sentences shows the number of translated sentences in a text; + +Words shows the number of processed words in the source text; + +Translated shows the number of translated words; + +Copied shows the number of words that have been copied untranslated from the source text to the target text; + +Close the window +when finished if this box is checked, the progress window will be automatically closed when the translation is finished. Otherwise the window should be closed by the user. + + +#$K +Translate|Polish-English + +Select Translate|Polish-English to set the direction of translation: from Polish into English. +If the direction has been changed while the text analysisIDH_MENU_TOOLS_ANALYSE is on, the source text will be re-analysed. + + +#$K +Translate|English-Polish + +Select Translate|English-Polish to set the direction of translation: from English into Polish. +If the direction has been changed while the text analysisIDH_MENU_TOOLS_ANALYSE is on, the source text will be re-analysed. + + +#$K +Translate|Settings + +Choose the command Translate settings from the menu in order to set the translation option. The options include: context, dictionaries and untranslated words. + + +Context tab + +Select Contex tab to set the context of translation. The context affects the choice of the translation equivalents. +Once the command has been selected, a window shows up that allows for choosing the context in the following categories: +• Domains – thematic contexts that correspond to domains of knowledge +• Styles – stylistic contexts +• Dialects – dialect variants of English + + +Dictionaries tab + +Choose Dictionaries to set what dictionaries should be used by the system: +• Company – company’s dictionary +• Domain – domain dictionaries +• System – system (general) dictionary + +Non-translated words tab + +Choose Non-translated Words to browse and edit lists of words that should not be translated. + +Remove button Click Remove button to remove the word from the list of non-translated words + +Check/Uncheck button Click the button to toggle the translation of the word + +Show local/global window Check if local/global window should be displayed while adding word to the non-translated words + + +#$K +Tools Menu + +Choose the Tools menu to use additional functions of TRANSLATICA. + +Analyse source textIDH_MENU_TOOLS_ANALYSE Analyse text +Spell checkingIDH_MENU_TOOLS_SPELLCHECKING Spell checking +Generate variantsIDH_MENU_TOOLS_VARIANTS Toggle display of variant equivalents +Generate syntax treesIDH_MENU_TOOLS_SYNTAX_TREE Generate syntax trees +DictionaryIDH_MENU_TOOLS_DICTIONARY Dictionary +SpeakIDH_MENU_TOOLS_SPEAK Speak text +ListenIDH_MENU_TOOLS_DICTATE Listen +Enterprise Data CompilerIDH_DATA_COMPILER Enterprise Data Compiler +PWN-Oxford DictionaryIDH_PWN_DICTIONARY PWN-Oxford Dictionary +Application languageIDH_MENU_TOOLS_APPLICATION_LANGUAGE Application language + + +#$K +Tools|Analyse source text + +Select Analyse source text to toggle the pre-processing of the text. +During analysis single words, translation units and sentences are recognized. Moreover, if the Spell checkingIDH_MENU_TOOLS_SPELLCHECKING option is on, the spelling correctness is verified. +If a longer chunk of text is being analysed, the progress window appears. The analysis process can then be cancelled by pressing the Cancel button. The progress dialogue box contains the following information: +Sentences shows the number of analysed sentences. + +Words shows the number of analysed words. + +Corrections shows the number of unknown words, to which lists of hints are available. + +Unknown shows the number of unknown words, to which lists of hints are not available. + +Close the window +when finished if this field is checked, the progress dialogue window will be automatically closed when the analysis has finished. Otherwise the window should be closed by the user. + + +#$K +Tools|Spell checking + +SelectTools|Spell checking to toggle spell checking. Words underlined in red are not included in the TRANSLATICA dictionary. Right-clicking on one of them displays the menu of dictionary words similar to the queried one. From these, the user can select a word to substitute the unrecognized word. Words underlined in yellow are not included in the TRANSLATICA dictionary and no dictionary hints are available for them (in the translation process they will be left untranslated). + + +#$K +Tools|Generate variants + +Select Tools|Generate variants to acquire the selection of alternative translations. Words that have alternative translations are underlined with a grey dotted line in the target window. + + +#$K +Tools|Generate syntax trees + +SelectTools|Generate syntax trees to translate a selected text or the whole text and see the syntax trees generated by the program. +After the translation has been completed, the syntax tree window is displayed. The window makes it possible to see the syntactical structures of sentences both in source and target languages. +The progress window is shown while translating long texts. + + +#$K +Tools|Dictionary + +SelectTools|Dictionary to run the dictionary viewer. + + +#$K +Tools|Speak +Choose Tools|Speak to generate speaking text in English + +#$K +Tools|Listen +Choose Tools|Listen to dictate to the system text in English. + + +#$K +Tools|Company Translation Compiler + +Choose Tools|Company Translation Compiler to run the compiler of Company Translation DatabaseIDH_CORP_DATA. The compiler builds an msi file. Run the msi file to install Company Translation DatabaseIDH_CORP_DATA for selected users or computers in the domain. + +The Company Translation Compiler window contains the fields: +Input file Enter the name of the Company Translation Database file. + +Output path Enter the output path for the msi file to be located in. + +Version Enter the version number of the new msi file. + +Compile button Click the button to run the compilation of the Company Translation Database. + +Build MSI button Click the button to build the msi file after the compilation. + +Messages The window displays information on the result of compilation and creation of the msi file. + +Warning: In order to create an MSI it is necessary to have the Net Framework installed on the server. The framework is delivered with the latest versions of MS Windows. If required, the installation file for the framework may be found at the microsoft.com*!EF(‘www.microsoft.com’). web page. + + +#$K +Tools|PWN-Oxford Dictionary + +Choose Tools|PWN-Oxford Dictionary to run the PWN-Oxford dictionary if it is installed on your computer. + + +#$K +Tools|Application language + +Select Tools|Application language to change the language of the application. + + +#$K +Help Menu + +Choose the Help menu to display program help or to display the information about Translatica. + +Translatica HelpIDH_MENU_HELP_TRANSLATICA_HELP Translatica Help +AboutIDH_MENU_HELP_ABOUT About + + +#$K +Help|Help + +Select Help|Help to run Translatica Help. + + +#$K +Help|About Command + +Select Help|About to display the information about TRANSLATICA. + + +#$ +Translation Memory and Company Dictionary + +Translation Memory stores a set of sentences that should be translated in a specific way – skipping the TRANSLATICA procedures. An exemplary application may be translation of forms where the names of the fields and some comments should be translated in the way required by the institution. Translation Memory may include practically unlimited number of sentences. If a text to be translated includes a sentences from the Translation Memory, the process of automatic translation for this sentence is suspended, and the translation taken from Translation Memory is taken instead. It should be noted though, that the system does not browse Translation Memory in search of sentences similar to the one given – it searches only for exact matches. +Company Dictionary includes words and multiword phrases, which should be translated in a uniform way within the company, when they appear in any inflected form. For example, if a bank wishes to have the phrase pożyczka długoterminowa translated as long-period loan (rather than long-term loan as suggested by TRANSLATICA), all occurrences of any inflected form of this phrase in any sentence will be translated in that way. + +To make it easier, sentences in Translation Memory and phrases in Company Dictionary are kept in one file, called Company Translation Database. +Company Translation Database consists of words, phrases and sentences in a source language together with their equivalents and the direction of translation. The file may be created in two formats: simple format, and XML format. + +Simple format assumes subsequent lines to consist of the following elements separated by tab +keys: +IsPhrase describes the entry as either a phrase which should be searched for in all inflected forms within the sentences (such an entry is the element of the Company Dictionary), or a sentence (the element of the Translation Memory). Possible values: + yes (or tak or 1) for a phrase + no (or nie or 1) for a sentence. + +Direction describes the direction of the translation for the entry. Possible values: + “>” – translation only from Polish into English + “<” – translation only from English into Polish + “<>” (or empty string) – translation in both directions + +Phrase1 text in Polish + +Phrase2 text in English + +Simple format can be easily obtained from an .xls file. If the elements of the entry description are given in consecutive columns, Simple is arrived at by using the Save as Text (separated by tab keys). + +An exemplary file in Simple format: + +no < Być, albo nie być – oto jest pytanie. To be, or not to be: that is the question. +no <> Drogi Kliencie. Dear customer. +yes > Biały Dom White House + +Company Traslation Database file in the XML format should be unified with the pattern included in the bin/win/enterprise_data.xsd file. + +An exemplary file in XML file: + + + + To be, or not to be: that is the question. + Być, albo nie być – oto jest pytanie. + + + Drogi Kliencie. + Dear customer. + + Biały Dom + White House + + + + +#$K +Batcher + +TRANSLATICA allows for the use of batch processing of a number of MS Office files. To do that use the Batcher program, opened from the Start menu: Start -> Translatica Enterprise/Office+ -> Batcher. + + + +The buttons have the following functions: +Add Opens a dialog window for the selection of one or more files to be translated. + +Remove Removes files from the list of files to be translated. + +Remove All Removes all files from the list of files to be translated. + +Options Opens a window for the translation settings for each file (see Settings).IDH_MENU_TRANSLATION_SETTINGS + + or Changes the direction of translation, the flag symbol stands for the target language. + +Translate Begins the translation process. + +Cancel Shuts down the program. + +A tree showing the list of files to be translated is displayed in the main window of the Batcher program. Each of the files is associated with a application that opens it. Three types of documents are allowed: MS Word, MS Excel, MS PowerPoint. If an application of the MS Office package is not installed or has not been integrated, it is indicated by the symbol next to the document. + +After new files have been added, each one is displayed with a or icon, which represent the source language of the file. + +Before the translation process is launched, a dialog window appears in which the user selects the destination folder for the translated files to be placed in. +After the translation process has been completed a symbol of the target language should appear next to each of the translated files. If a two-language symbol or has been displayed instead, it means that the translation of the file has failed. + +After the completion of the translation process, the location of each translated file is shown on the status bar. + + +#$K +Updater + +TRANSLATICA system is equipped with the Updater program for automatic updates via the Internet. To run the program, the menu Start command should be chosen: Start -> Translatica -> Updater. If the relevant update is available, the message box will appear. The user should confirm downloading the update: + + + +The buttons have the following functions: +Yes Start downloading and installing the update. + +No Ignore this version of the update. + +Options Show/hide the options of the update. + +Update automatically Automatically start the update when starting TRANSLATICA. + +Inform about updates Show the information about new updates and confirm installing them. + +Disable automatic update Updates should be started only by the user. + +Apply Apply the changes made in the options. + +# IDH_ABOUT_MT +$ A Few Words About Automatic Translation +# IDH_CHARACTERIZATION +$ Main Features of TRANSLATICA +# IDH_LOCAL_INSTALLATION +$ Local Installation +# IDH_NET_INSTALLATION +$ Installation in Local Net +# IDH_VERSIONS +$ Versions of TRANSLATICA +# IDH_INTEGRATOR +$ Integrator +K Integrator, program +# IDH_LANGUAGE_VERSIONS +$ Language Versions +# IDH_MS_INTERNET_EXPLORER +$ Translating in Microsoft Internet Explorer +K Integrator, Internet Explorer +# IDH_MOZILLA +$ Translating in Mozilla +K Integrator, Mozilla +K Integrator, Mozilla Firefox +# IDH_OUTLOOK_EXPRESS +$ Translating in Outlook Express +K Integrator, Outlook Express +# IDH_MS_WORD_AND_EXCEL +$ Translating in Microsoft Excel and in Microsoft Word +K Integrator, Microsoft Word +K Integrator, Microsoft Excel +# IDH_MS_POWERPOINT +$ Translating in Microsoft PowerPoint +K Integrator, Microsoft PwerPoint +# IDH_MS_OUTLOOK +$ Translating in Microsoft Outlook +K Integrator, Microsoft Outlook +# IDH_OO_WRITER +$ Translating in Writer +K Integrator, Writer +K Integrator, Calc +# IDH_EDITOR +$ Translating in Translation Editor +K Translation Editor +# IDH_MENU +$ Main Menu +K main menu +# IDH_MENU_FILE +$ File Menu +K File, menu +# IDH_MENU_FILE_NEW +$ File|New +K New, command +# IDH_MENU_FILE_OPEN +$ File|Open +K Open, command +# IDH_MENU_FILE_REOPEN +$ File|Reopen +K Reopen, command +# IDH_MENU_FILE_SAVE_SOURCE +$ File|Save source +K Save source, command +# IDH_MENU_FILE_SAVE_SOURCE_AS +$ File|Save source as +K Save source as, command +# IDH_MENU_FILE_SAVE_DESTINATION +$ File|Save target +K Save target, command +# IDH_MENU_FILE_SAVE_DESTINATION_AS +$ File|Save target as +K Save target as, command +# IDH_MENU_FILE_SAVE_BOTH +$ File|Save both +K Save both, command +# IDH_MENU_FILE_SAVE_ALL +$ File|Save all +K Save all, command +# IDH_MENU_FILE_CLOSE +$ File|Close +K Close, command +# IDH_MENU_FILE_CLOSE_ALL +$ File|Close all +K Close all, command +# IDH_MENU_FILE_EXIT +$ File|Exit +K Exit, command +# IDH_MENU_EDIT +$ Edit Menu +K Edit, menu +# IDH_MENU_EDIT_UNDO +$ Edit|Undo +K Undo, command +# IDH_MENU_EDIT_REDO +$ Edit|Redo +K Redo, command +# IDH_MENU_EDIT_CUT +$ Edit|Cut +K Cut, command +# IDH_MENU_EDIT_COPY +$ Edit|Copy +K Copy, command +# IDH_MENU_EDIT_PASTE +$ Edit|Paste +K Paste, command +# IDH_MENU_EDIT_DELETE +$ Edit|Delete +K Delete, command +# IDH_MENU_EDIT_SELECT_ALL +$ Edit|Select all +K Select all, command +# IDH_MENU_EDIT_FIND +$ Edit|Find +K Find, command +# IDH_MENU_EDIT_REPLACE +$ Edit|Replace +K Replace, command +# IDH_MENU_EDIT_FIND_NEXT +$ Edit|Find next +K Find next, command +# IDH_MENU_VIEW +$ View Menu +K View, menu +# IDH_MENU_VIEW_SOURCE_TOKENS +$ View|Source word boundaries +K Source word boundaries, command +# IDH_MENU_VIEW_TARGET_TOKENS +$ View|Target word boundaries +K Target word boundaries, command +# IDH_MENU_VIEW_SOURCE_UNKNOWN +$ View|Source unknown words +K Source unknown words, command +# IDH_MENU_VIEW_TARGET_UNKNOWN +$ View|Target unknown words +K Target unknown words, command +# IDH_MENU_VIEW_HORIZONTAL +$ View|Horizontal layout command +K Horizontal layout, command +# IDH_MENU_VIEW_VERTICAL +$ View|Vertical layout command +K Vertical layout, command +# IDH_MENU_VIEW_SOURCE +$ View|Source editor command +K Source editor, command +# IDH_MENU_VIEW_DESTINATION +$ View|Target editor command +K Target editor, command +# IDH_MENU_VIEW_TOOLBAR +$ View|Tool bar command +K Tool bar, command +# IDH_MENU_VIEW_STATUSBAR +$ Status bar command +K Status bar, command +# IDH_MENU_VIEW_FONT +$ View|Font command +K Font, command +# IDH_MENU_TRANSLATION +$ Translate menu +K Translate, menu +# IDH_MENU_TRANSLATION_TRANSLATE +$ Translate|Translate command +K Translate, command +# IDH_MENU_TRANSLATION_PLEN +$ Translate|Polish-English command +K Polish-English, command +# IDH_MENU_TRANSLATION_ENPL +$ Translate|English-Polish command +K English-Polish, command +# IDH_MENU_TRANSLATION_SETTINGS +$ Translate|Settings +K Settings, command +# IDH_MENU_TOOLS +$ Tools menu +K Tools, menu +# IDH_MENU_TOOLS_ANALYSE +$ Tools|Analyse text command +K Analyse text, command +# IDH_MENU_TOOLS_SPELLCHECKING +$ Options|Spell checking command +K Spell checking, command +# IDH_MENU_TOOLS_VARIANTS +$ Tools|Generate variants command +K Generate variants, command +# IDH_MENU_TOOLS_SYNTAX_TREE +$ Tools|Generate syntax trees command +K Generate syntax trees, command +# IDH_MENU_TOOLS_DICTIONARY +$ Tools|Dictionary command +K Dictionary, command +# IDH_MENU_TOOLS_SPEAK +$ Tools|Speak +K Speak, command +# IDH_MENU_TOOLS_DICTATE +$ Tools|Listen +K Listen, command +# IDH_DATA_COMPILER +$ Tools|Enterprise Data Compiler command +K Enterprise Data Compiler, command +# IDH_PWN_DICTIONARY +$ Tools|PWN-Oxford Dictionary command +K PWN-Oxford Dictionary, command +# IDH_MENU_TOOLS_APPLICATION_LANGUAGE +$ Tools|Application language command +K Application language, command +# IDH_MENU_HELP +$ Help menu +K Help, menu +# IDH_MENU_HELP_TRANSLATICA_HELP +$ Help|Help command +KTranslatica help, command +# IDH_MENU_HELP_ABOUT +$ Help|About command +K About, command +# IDH_CORP_DATA +$ Translation Memory and Company Dictionary +# IDH_BATCHER +$ Batcher +K Batch Processing +# IDH_UPDATER +$ Updater +K Automatic update +?? + +?? + +?? + +?? + diff --git a/examples/txt/help-pl.txt b/examples/txt/help-pl.txt new file mode 100755 index 0000000..19448ec --- /dev/null +++ b/examples/txt/help-pl.txt @@ -0,0 +1,1227 @@ +#$ +Kilka słów o tłumaczeniu automatycznym + +Idea tłumaczenia tekstów z jednego języka na drugi przy pomocy komputera jest prawie tak samo stara jak idea samego komputera. Już w czasach zimnej wojny wywiadowcy aliantów oczekiwali, że komputer zastąpi wykwalifikowanych szpiegów w tłumaczeniu tajnych rosyjskich tekstów na język angielski, oszczędzając zapracowanym agentom wiele czasu i zachodu. Minęło wiele lat, a wizja międzynarodowej konferencji czy rozmowy bez udziału ludzkiego tłumaczenia mieści się wciąż w sferze marzeń. + +Z czasem językoznawcy, filologowie i informatycy zweryfikowali swoje oczekiwania w stosunku do automatycznego komputerowego tłumacza i postarali się zmienić nastawienie użytkowników. Obie strony doszły zgodnie do wniosku, że komputer nie przetłumaczy Szekspira, Joyce’a, czy Whartona; ba! nie przetłumaczy dobrze nawet krótkiego dowcipu. Tłumaczenie komputerowe nie ma zupełnie zastosowania przy przekładach literackich, świetnie sprawdza się natomiast do tłumaczenia tekstów fachowych z określonej, najlepiej +jak najwęższej dziedziny. + +W tekstach ogólnych komputer może pomóc człowiekowi jedynie w zorientowaniu się w tematyce tekstu lub wykonać za niego „czarną robotę”, polegającą na odnalezieniu najwłaściwszych odpowiedników w danych kontekstach i ułożenie ich w najbardziej prawdopodobne konstrukcje językowe; ale to profesjonalnemu tłumaczowi pozostaje wygładzenie językowe przetłumaczonego tekstu. + + +Tłumaczenie bezpośrednie + +Zastępowanie wyrazów języka źródłowego odpowiednimi wyrazami języka docelowego to najprostszy sposób dokonania tłumaczenia. Pomimo tego, że już w latach 60-tych wyciągnięto wniosek, że metoda ta daje nieakceptowalne wyniki, do dzisiaj rozwijane są systemy automatycznego tłumaczenia, w których jest ona stosowana. + + +Tłumaczenie metodą transferu + +Najbardziej powszechną metodą w działających obecnie systemach tłumaczenia automatycznego jest metoda transferu. W jej skład wchodzą następujące części: +• słownik, +• reprezentacja tekstu, +• gramatyka, +• analiza składniowa. + + +Słownik + +Słownik jest najbardziej pracochłonną częścią systemu tłumaczenia automatycznego metodą transferu. Opis danych w słowniku musi spełniać następujące kryteria: +• opis musi być czytelny dla komputera, czyli na tyle uporządkowany, aby przy pomocy określonego algorytmu można było odczytać niezbędne informacje, +• słownik powinien zawierać możliwie największą liczbę haseł, +• hasła w słowniku powinny być opisane możliwie jak najdokładniej. +Spełnienie powyższych trzech warunków równocześnie nie jest łatwe, a utworzenie “dobrego” słownika jest pracochłonne – dlatego też systemy tłumaczenia nierzadko opierają się na ograniczonym słownictwie. + + +Reprezentacja tekstu + +Istotnym etapem tłumaczenia jest przedstawienie analizowanego fragmentu tekstu – najczęściej zdania – w pewnej postaci, którą można następnie przenieść na reprezentację zdania docelowego. Dwa najbardziej popularne sposoby reprezentowania zdania to struktura frazowa i drzewo zależności. +Struktura frazowa jest najbardziej tradycyjnym sposobem przestawiania budowy zdania. Strukturę frazową zdania Zły wilk goni słabą owieczkę można przedstawić następująco: + + +Powyższe drzewo reprezentuje budowę zdania rozumianą następująco: Zdanie składa się z frazy rzeczownikowej i frazy czasownikowej. Pierwsza z tych fraz składa się z przymiotnika zły i rzeczownika wilk, natomiast druga składa się z czasownika goni i podstruktury: frazy rzeczownikowej. Podstruktura frazy rzeczownikowej realizowana jest przez przymiotnik słabą i rzeczownik owieczkę. +W reprezentacji przy użyciu drzewa zależności zakłada się, że w zdaniu każdy wyraz – za wyjątkiem najważniejszego, tj. czasownika głównego orzeczenia – jest zależny od innego wyrazu. Drzewo zależności obrazuje zestaw tych zależności. Reprezentacja przykładowego zdania w postaci drzewa zależności pokazuje następujący rysunek: + + + +Od czasownika goni zależne są: podmiot czynności, tj. pies oraz obiekt czynności, tj. mysz. Od rzeczowników zależne są określające je przymiotniki: duży od rzeczownika pies i wściekłą od rzeczownika mysz. + +Ustalenie zestawu zależności nie zawsze jest rzeczą oczywistą – wyrazy zależne od siebie nie muszą ze sobą sąsiadować. Na przykład drzewo zależności zdania Biedną goni wilk zły owieczkę będzie identyczne z drzewem z rys. 3. Zależność pomiędzy przymiotnikiem słabą i rzeczownikiem owieczkę zostanie ustalona na wskutek zgodności przypadku, rodzaju oraz liczby obu wyrazów. + + +Gramatyka + +Ustaliwszy sposób reprezentacji tekstu w systemie tłumaczenia należy wypracować metodę wyznaczania takiej reprezentacji. Najczęściej zadanie to dzielone jest na dwa zagadnienia: opis gramatyki i analizę składniową tekstu. + +Gramatyka rozumiana jest jako zestaw reguł, które określają w jaki sposób można tworzyć poprawne konstrukcje językowe. W opisie gramatyki można zawrzeć oprócz reguł tworzenia także informacje o budowie zdań konstruowanych na bazie gramatyki. + +Gramatyka jest próbą matematycznego opisu zjawisk lingwistycznych, które łatwo nie poddają się matematycznemu sformalizowaniu. Dotychczas nie udało się stworzyć formalnego opisu żadnego języka mówionego, który by obejmował wszystkie możliwe konstrukcje. Innymi słowy, obojętnie jak bardzo skomplikowany byłby opis gramatyki, człowiekowi i tak uda się stworzyć zdanie, wychodzące poza taki opis. + + +Analiza składniowa + +Proces sprawdzania, czy wybrany fragment tekstu (np. zdanie) zgodny jest z opisem gramatyki nazywany jest analizą składniową. Wynikiem analizy jest stwierdzenie, czy dane zdanie zgodne jest z opisem gramatyki (takie zdanie uznawane jest jako poprawne) oraz podanie budowy zdania w wybranej reprezentacji (np. w postaci struktury składniowej czy drzewa zależności). Dla celów tłumaczenia automatycznego istotne jest to, by analiza składniowa podawała jakąś reprezentację również dla zdań, które nie są zgodne z opisem gramatyki. + + +#$ +Charakterystyka systemu TRANSLATICA + +Historia rozwoju + +System TRANSLATICA rozwijany był w latach 1996 - 2002 jako system POLENG, tłumaczący wyłącznie w kierunku polsko-angielskim, na Wydziale Matematyki i Informatyki Uniwersytetu im. Adama Mickiewicza w Poznaniu, między innymi dzięki przychylności ze strony Komitetu Badań Naukowych (w latach 1999-2000), Polskiego Towarzystwa Fonetycznego (w latach 1996-2001) oraz Allied Irish Bank (2002). + +W roku 2004 powstały pierwsze wersje systemu TRANSLATICA (TRANSLATICA STANDARD i TRANSLATICA PRO), w których w oparciu o wytworzone techniki tłumaczenia oraz słownictwo zaczerpnięte z Wielkiego Słownika Angielsko-Polskiego PWN dodano funkcję tłumaczenia w kierunku angielsko-polskim. + +TRANSLATICA PREMIUM i TRANSLATICA OFFICE zostały wydane w roku 2005. W stosunku do swoich poprzedników znacznie poszerzono słownictwo systemu – na wielkich słownikach PWN opiera się teraz tłumaczenie w obu kierunkach. Wprowadzono dziesiątki tysięcy nowych idiomów. Poszerzono i poprawiono zestaw reguł tłumaczenia, zastosowano nowe techniki analizy tekstu (np. statystyczne metody oznaczania części mowy dla tekstu angielskiego). Działania te owocują wyraźną poprawą jakości tłumaczenia. Wiele uwagi poświęcono polepszeniu szybkości działania, np. słownik systemu (pomimo znacznie zwiększonej objętości) jest obecnie wczytywany mniej więcej trzy razy szybciej. + +Dodano możliwość integracji z nowymi programami: Outlook Express, Mozilla, Writer. Tak szerokich możliwości współpracy z aplikacjami zewnętrznymi nie umożliwia żaden system translacji na świecie. + + +Słownik systemu TRANSLATICA + +Jak wspomniano, słownik systemu tłumaczenia automatycznego musi spełniać kryterium czytelności dla algorytmu komputerowego. Opracowanie haseł w takim słowniku jest pracochłonne, dlatego niezbędne jest odpowiednie ich wyselekcjonowanie. Podczas prac nad kierunkiem z polskiego na angielski zebrano zbiór tekstów komputerowych, prawniczych, ekonomicznych i internetowych (taki wyselekcjonowany zbiór nazywany jest korpusem) i wyznaczono hasła najczęściej się w nim pojawiające. Hasła te zostały następnie opisane zgodnie z formalizmem systemu tłumaczenia i włączone do słownika systemu. + +Źródłem słownictwa w kierunku angielsko-polskim jest Wielki Słownik Angielsko-Polski PWN – w skrócie WSAP (w kolejnych wersjach systemu planowane jest włączenie tworzonego obecnie słownika PWN w odwrotnym kierunku). Słownik WSAP został również wykorzystany (poprzez odwrócenie) do częściowego uzupełnienia haseł w polsko-angielskim słowniku systemu. Efekt tych działań jest taki, że opis haseł w kierunku angielsko-polskim jest bardziej dokładny (jedno hasło ma zazwyczaj więcej odpowiedników). Okazuje się, że większa dokładność jakość słownika nie przekłada się automatycznie na lepszą jakość tłumaczenia. Autorzy oceniają, że w obecnej wersji systemu lepsze jakościowo jest tłumaczenie w kierunku polsko-angielskim. + + +Gramatyka, reprezentacja i analiza składniowa + +Autorzy stworzyli własny formalizm opis reguł gramatyki oraz reguł transferu (czyli przeniesienia reprezentacji jednego języka do innego). Ten sam formalizm stosowany jest do obu kierunków tłumaczenia, ale same reguły nie są swoim lustrzanym odbiciem. Innymi słowy, proces tłumaczenia nie jest odwracalny: przetłumaczenie tekstu w jednym kierunku i z powrotem najczęściej skutkuje innym tekstem niż wyjściowy (idea odwracalności tłumaczenia jest kusząca, ale ze względu na różnice między budową języków nie udało jej się dotychczas zastosować dla żadnej, nawet najbliższej, pary języków). + +W systemie TRANSLATICA tekst przetwarzany jest do postaci struktury frazowej. Analiza składniowa dopuszcza istnienie konstrukcji niezgodnych z opisem gramatyki (także tych, które są całkowicie niepoprawne językowo) i dla każdej konstrukcji tworzona (a następnie transferowana) jest jakaś reprezentacja tekstu. + + +Niektóre ciekawe zagadnienia tłumaczenia + +Języki polski i angielski należą do różnych rodzin języków (odpowiednio do słowiańskiej i germańskiej) i dlatego konstrukcje nawet prostych zdań mogą się od siebie znacznie różnić. + + +Różnice w składni + +W języku polskim dopuszczana jest znacznie większa swoboda kolejności składników (np. orzeczenie często poprzedza podmiot), w języku angielskim składnia zdania podlega znacznie większym ograniczeniom. Zdarza się i tak, że podmiot w zdaniu polskim pełni funkcję dopełnienia w odpowiadającym zdaniu angielskim i na odwrót. Ponadto w języku polskim funkcjonuje pojęcie podmiotu domyślnego - nieobecne z zasady w języku angielskim. Przyjrzyjmy się przykładom zdań, które obrazują wspomniane problemy. + +Ty mi się wcale nie podobasz. +Ty nie podobasz się mi wcale. +Ty wcale nie podobasz się mi. +Ty wcale mi się nie podobasz. +Wcale mi się nie podobasz. +Mi się wcale nie podobasz. +Mi się nie podobasz wcale. +Nie podobasz się mi wcale. + +Wszystkim tym zdaniom odpowiada w języku angielskim to samo zdanie: + +I don't like you at all. + +Właśnie w ten jednakowy sposób powyższe różne zdania polskie są tłumaczone na język angielski w systemie TRANSLATICA. + + +Różnice w znaczeniu wyrazów + +Ten sam wyraz w języku polskim może mieć wiele odpowiedników w języku angielskim i na odwrót. Zadaniem sytemu tłumaczenia jest wyszukanie najlepszego odpowiednika w danym kontekście, w danym zdaniu. Na przykład w słowniku systemu POLENG czasownik take ma 41 różnych odpowiedników a może mieć jeszcze inne znaczenia w połączeniu ze specyficznymi przyimkami (np. take in - nabrać kogoś), czy też rzeczownikami (np. take part – wziąć udział). Algorytm tłumaczenia systemu TRANSLATICA stara się dopasować najlepszy odpowiednik dzięki analizie struktury zdania i kontekstu tłumaczenia, jak na przykład w poniższych zdaniach: + +I took a shower. +Wziąłem prysznic. + +We shall take a taxi. +Weźmiemy taksówkę. + +We shall take a bus. +Pojedziemy autobusem. + +My horse took a fence. +Mój koń przeskoczył ogrodzenie. + +He has never taken a bribe. +Nigdy nie przyjął łapówki. + +Such a jump takes courage. +Taki skok wymaga odwagi. + +I am going to take tea. +Zamierzam wypić herbatę. + +Tomorrow I will be taking a difficult exam. +Jutro będę zdawać trudny egzamin. + +Take a seat. +Usiądź. + +Will you take part in the meeting? +Weźmiesz udział w spotkaniu? + + + +#$ +Instalacja lokalna + +W celu zainstalowania programu TRANSLATICA należy uruchomić program Setup.exe. Program instalacyjny kopiuje pliki do komputera użytkownika, a następnie wywołuje program Integrator. Zadaniem Integratora jest połączenie systemu TRANSLATICA z wybranymi przez użytkownika aplikacjami (patrz rozdział Integrator). System można odinstalować z menu Start: Start->Programy->Translatica X ->Uninstall. + + +#$ +Instalacja przez sieć + +W przypadku sieci lokalnych zarządzanych przez systemy Microsoft Windows z dostępnymi usługami Active Directory, DNS, DHCP możliwe jest również uruchomienie programu instalacyjnego w taki sposób, aby program TRANSLATICA został zainstalowany na wybranych końcówkach lub dla wybranych użytkowników. Aby móc zastosować instalację sieciową, usługi Active Directory, DNS, DHCP powinny być poprawnie skonfigurowane. + +Na dowolnej partycji (nie będącej partycją systemową ani rozruchową) należy założyć folder (np. Msi_Pack), do którego kopiujemy plik instalacyjny Translatica-Enterprise.msi. Następnie folder ten udostępniamy w sieci. + + + + + +Z menu Start wybieramy opcję Programy -> Narzędzia administracyjne -> Użytkownicy i komputery usługi Active Directory. Z menu podręcznego interesującej nas domeny wybieramy opcję Nowy -> Jednostka organizacyjna. + + + +Do utworzonej jednostki organizacyjnej dodajemy istniejących użytkowników i/lub komputery. + + + +Następnie ustalamy właściwości jednostki organizacyjnej. W tym celu z menu podręcznego wybieramy opcję Właściwości. W zakładce Zasady grupy dodajemy nową zasadę grupy, po czym ją edytujemy. Po ukazaniu się okna Edytora obiektów zasad grupy dokonujemy konfiguracji użytkownika lub komputera w zależności od rodzaju instalacji, jaką chcemy przeprowadzić. + + +Instalacja przez sieć dla użytkownika + +Celem takiej instalacji jest umożliwienie korzystania z programu TRANSLATICA wybranemu użytkownikowi na dowolnym komputerze domeny. +Aby zainstalować program dla użytkownika, należy kliknąć ikonę Konfiguracja użytkownika a następnie Ustawienia oprogramowania. + + + +Klikamy prawym przyciskiem myszy na folderze Instalacja oprogramowania i wybieramy z menu opcję Nowy -> Pakiet, a następnie wskazujemy plik msi, który umieściliśmy w udostępnionym folderze instalacyjnym. Po wyświetleniu okna Rozmieszczenie oprogramowania wybieramy sposób instalacji. Jeżeli chcemy, aby instalacja przebiegła automatycznie bezpośrednio po zalogowaniu się użytkownika, wybieramy metodę Przypisany. Jeśli natomiast instalację chcemy pozostawić użytkownikowi, wybieramy metodę Opublikowany. Wtedy użytkownik będzie mógł uruchomić pakiet instalacyjny na komputerze klienckim poprzez Panel sterowania -> Dodaj/Usuń programy -> Dodaj nowe programy. + + + +Aby zmienić metodę rozmieszczania, należy kliknąć prawym przyciskiem myszy na ikonie pakietu instalacyjnego i wybrać opcję Właściwości. W zakładce Rozmieszczanie zaznaczamy odpowiednią metodę. + + +Instalacja przez sieć na wybranym komputerze + +Celem takiej instalacji jest umożliwienie korzystania z programu Translatica dowolnemu użytkownikowi na wybranym komputerze. + +Aby zainstalować program na wybranym komputerze, należy kliknąć ikonę Konfiguracja komputera a następnie Ustawienia oprogramowania. +Klikamy prawym przyciskiem myszy na folderze Instalacja oprogramowania i wybieramy z menu opcję Nowy -> Pakiet, a następnie wskazujemy plik msi, który umieściliśmy w udostępnionym folderze instalacyjnym. W tym przypadku instalacja programu na komputerze zostanie przeprowadzona bezpośrednio po restarcie bądź uruchomieniu komputera. + +Uwaga: Szczegóły kolejnych kroków instalacji przez sieć mogą się różnić w zależności od systemu operacyjnego. + +#$ +Wersje programu + +System tłumaczący TRANSLATICA jest dostępny w dwóch wersjach podstawowych: Premium i Office, oraz dwóch wersjach dedykowanych dla firm: Office+ i Enterprise. + +Wersja Premium przeznaczona jest do szybkiego przetwarzania dokumentów prostych językowo, lecz o złożonym formacie – właśnie takich jak strony internetowe czy dokumenty (maile) klienta pocztowego Outlook Express. + +Wersje Office, Office+ i Enterprise rozszerzają te możliwości o funkcje tłumaczenia dokumentów z programów pakietu MS Office: MS Word, MS Excel, MS PowerPoint i MS Outlook oraz programów Writer i Calc (dwie ostatnie aplikacja należą do pakietu Open Office). + +Wersje Office+ i Enterprise dają ponadto możliwość tłumaczenia wielu dokumentów w trybie wsadowym. Wersja Enterprise jest dodatkowo wyposażona w funkcje pomagające dostosować system do potrzeb konkretnej firmy. Do funkcji tych należą: możliwość korzystania ze słowników dziedzinowych, budowanie i stosowanie pamięci tłumaczeń oraz korzystanie ze słownika firmy. + +#$ +Integrator + +Program Integrator uruchamia się z menu Start: Start -> Programy -> Translatica X -> Integrator. Aplikacja sprawdza, które z programów umożliwiających integrację z systemem TRANSLATICA są zainstalowane na komputerze, a następnie pozwala użytkownikowi dodać funkcję tłumaczenia do wybranych programów. + +Uruchomienie Integratora powoduje ukazanie się następującego okna: + + + +Dla programów niezainstalowanych na komputerze odpowiednia kratka jest nieaktywna (przyciemniona). +Użytkownik ma możliwość wybrania jednej lub kilku aplikacji poprzez zaznaczenie odpowiednich kratek. + +W każdym momencie użytkownik może odłączyć lub ponownie dołączyć funkcję tłumaczenia do wybranych programów. W tym celu należy uruchomić program Integrator (Start -> Programy -> Translatica X -> Integrator) i odpowiednio odznaczyć lub zaznaczyć wybrane aplikacje. + + +#$ +Wersje językowe + +Program uruchamiany jest domyślnie w polskiej wersji językowej, ale możliwa jest zmiana języka obsługi na język angielski. W tym celu należy w oknie Edytora Translacji z menu Narzędzia wybrać polecenie Język programu. Pojawi się wówczas okno dialogowe Wybór języka programu. + + + +Okno to oprócz wyboru języka umożliwia wybór strony kodowej dla języka polskiego. Dla systemu Microsoft Windows w wersji polskiej domyślnie ustawiona jest strona kodowa Windows-1250. Pozostałe strony kodowe mogą być użyteczne w niepolskojęzycznych wersjach systemu Microsoft Windows. + +#$ +Tłumaczenie w programie Microsoft Internet Explorer + +Po włączeniu funkcji tłumaczenia do programu Internet Explorer (przy pomocy INTEGRATORaIDH_INTEGRATOR) na pasku zadań programu Internet Explorer pojawiają się cztery dodatkowe ikony: + + +Naciśnięcie ikony rozpoczyna proces tłumaczenia z języka polskiego na język angielski, a naciśnięcie ikony rozpoczyna tłumaczenie w odwrotnym kierunku. Trzecia ikona umożliwia zapis przetłumaczonej strony na komputerze (wykonanie zapisu przy pomocy funkcji programu Internet Explorer: Plik -> Zapisz spowodowałoby zapis strony przed tłumaczeniem). + +Przycisk służy do uruchomienia okna Ustawienia, za pomocą którego można dokonać wyboru kontekstów i słowników używanych przez system (patrz UstawieniaIDH_MENU_TRANSLATION_SETTINGS). + +Tłumaczenie może odbywać się zarówno on-line (gdy użytkownik połączony jest z Internetem) jak i off-line (gdy połączenia nie ma, a przeznaczona do tłumaczenia strona internetowa zapisana jest w komputerze). Podczas tłumaczenia ekran podzielony zostaje na dwa okna: górne dla strony tłumaczonej (w języku źródłowym) i dolne dla strony przetłumaczonej. W trybie translacji automatycznie tłumaczone są wszystkie strony, do których użytkownik przemieszcza się przy pomocy odsyłaczy (hiperlinków). Aby wyjść z trybu translacji należy ponownie kliknąć wciśniętą ikonę tłumaczenia. Tłumaczenie jednej strony trwa od kilkunastu sekund do ponad minuty (dla złożonych stron). + + +#$ +Tłumaczenie w programie Mozilla + +Po włączeniu funkcji tłumaczenia do programu Mozilla (przy pomocy INTEGRATORaIDH_INTEGRATOR) na pasku zadań programu Mozilla pojawiają się trzy dodatkowe przyciski: + + +W programie Mozilla nie ma potrzeby dołączania przycisku zapisu, gdyż zapis przetłumaczonej strony możliwy jest z menu programu Mozilla. + +Proces tłumaczenia odbywa się jak w przypadku programu Internet Explorer (patrz Tłumaczenie w programie Internet ExplorerIDH_MS_INTERNET_EXPLORER). + +Można podać przynajmniej dwa argumenty za korzystaniem z programu Mozilla (można go ściągnąć bezpłatnie ze strony (http://www.mozilla.org/start/1.7/*!EF(‘http://www.mozilla.org/start/1.7/’)) nawet w przypadku posiadania programu Internet Explorer. Po pierwsze, program ten jest znacznie bardziej bezpieczny, jeśli chodzi o możliwość ataku z Internetu na nasz komputer, po drugie umożliwia przeglądanie kilku dokumentów jednocześnie przy pomocy zakładek. W połączeniu z systemem TRANSLATICA daje to możliwość jednoczesnego przeglądania kilku przetłumaczonych stron. + +Otwarcie nowej zakładki w programie Mozilla dokonuje się poprzez wciśnięcie kombinacji klawiszy Ctrl-t. W otwartej zakładce można otworzyć nową stronę i przetłumaczyć ją (poprzez wciśnięcie przycisku translacji). Przetłumaczona strona jest pamiętana nawet po przejściu do innej zakładki. Powrót do zakładki z przetłumaczoną stroną umożliwia przeglądanie obu okien: z tekstem źródłowym i docelowym. + + +#$ +Tłumaczenie w programie Outlook Express + +Po zintegrowaniu TRANSLATICA z Outlook Express, możliwe jest korzystanie z systemu tłumaczenia w trybie edycji lub odczytu poszczególnych wiadomości. Po otwarciu wybranej (lub nowej) wiadomości, na pasku narzędzi pojawiają się trzy dodatkowe przyciski: + +Naciśnięcie przycisków lub powoduje rozpoczęcie procesu tłumaczenia odpowiednio z języka polskiego na język angielski lub języka angielskiego na język polski. Przycisk służy do wyboru kontekstów i słowników systemu tłumaczenia (patrz UstawieniaIDH_MENU_TRANSLATION_SETTINGS). +Przetłumaczony tekst wiadomości pojawia się w osobnym oknie jako nowa wiadomość, przy czym tłumaczeniu podlegają zarówno treść jak i tytuł wiadomości. + + +#$ +Tłumaczenie w programie Microsoft Word i Microsoft Excel + +Włączenie funkcji tłumaczenia do programu MS-Excel powoduje dodanie dodatkowego paska narzędzi (umieszczony on jest w górnym obszarze ekranu) oraz dodatkowej opcji w Menu Narzędzia. +Pasek narzędzi systemu TRANSLATICA ma następujący wygląd: + +Pierwsza ikona umożliwia zmianę kierunku tłumaczenia. Kolejne przyciski mają następujące znaczenie: +Przycisk Tłumacz do nowego powoduje otwarcie nowego dokumentu i umieszczenie w nim przetłumaczonego tekstu. Jeśli nie zaznaczono fragmentu, naciśnięcie przycisku powoduje tłumaczenie całego dokumentu. +Przycisk Tłumacz w oryginale powoduje zamianę zaznaczonego uprzednio fragmentu przetłumaczonym tekstem. Jeśli nie zaznaczono fragmentu, naciśnięcie przycisku powoduje tłumaczenie całego dokumentu. +W programie MS-Excel dodano do powyższych dwóch przycisków dodatkowe funkcje: równoczesne wciśnięcie klawisz Shift powoduje tłumaczenie tylko bieżącego arkusza (a nie całego skoroszytu), zaś wciśnięcie klawisz Ctrl powoduje tłumaczenie tylko bieżącej komórki. + +Przyciski Eksportuj do Edytora Translacji i Importuj z Edytora Translacji umożliwiają współpracę aplikacji MS-Office z edytorem programu TRANSLATICA. Kliknięcie przycisku Eksportuj powoduje wysłanie zaznaczonego fragmentu (lub całego dokumentu) do Edytora Translacji. Uruchomiony zostaje program-edytor systemu TRANSLATICA, a wyeksportowany tekst umieszczany zostaje w oknie tekstu źródłowego. Użytkownik może przetłumaczyć tekst, a po przetłumaczeniu dokonać post-edycji w oknie tekst docelowego (np. poprzez wybranie wariantów tłumaczenia). Aby przetłumaczony tekst powrócił do aplikacji wysyłającej trzeba kliknąć przycisk Importuj w aplikacji MS-Excel. Wyeksportowany uprzednio tekst zostanie podmieniony przetłumaczonym tekstem z Edytora Translacji. + + Opcje. Naciśnięcie przycisku powoduje wyświetlenie okna wyboru kontekstów i słowników używanych przez system (UstawieniaIDH_MENU_TRANSLATION_SETTINGS). + +Obsługa funkcji tłumaczenia w programie MS-Word jest analogiczna do obsługi w programie MS-Excel. Z oczywistych względów nie ma możliwości tłumaczenia pojedynczego arkusza, czy też komórki. + + +#$ +Tłumaczenie w programie Microsoft PowerPoint + +W programie MS-PowerPoint możliwe jest dodatkowo tłumaczenie wybranych slajdów. W tym celu należy przejść do widoku sortowania slajdów (Widok -> Sortowanie slajdów), zaznaczyć interesujące slajdy i nacisnąć ikonę tłumaczenia. + +Warto zauważyć, że system dokonuje tłumaczenia obiektów osadzonych w dokumentach MS-Office (np. wykresu Excela w dokumencie PowerPoint). + + +#$ +Tłumaczenie w programie Microsoft Outlook + +W programie tym system TRANSLATICA dodaje dwa nowe przyciski, odpowiadające kierunkom tłumaczenia. Tłumaczyć można jeden lub więcej listów (w celu przetłumaczenia grupy listów należy je zaznaczyć w wybranym folderze przed wciśnięciem ikony tłumaczenia). Przetłumaczone dokumenty przechowywane są w folderze Przetłumaczone (Translated w wersji angielskojęzycznej). + + +#$ +Tłumaczenie w programach Writer i Calc + +Po integracji systemu TRANSLATICA z programem Writer lub Calc, do paska narzędzi dodawane są ikony pozwalające na uruchomienie tłumaczenia w obu kierunkach: + - tłumaczenie na język angielski + - tłumaczenie na język polski +Dostępne jest również ustawianie opcji tłumaczenia (ikona ). +Wszystkie powyższe akcje można również uruchomić, wybierając odpowiednie elementy z menu Translatica, dodanego do menu głównego programu. + +W przypadku programu Calc możliwe jest tłumaczenie jedynie całego skoroszytu a nie, jak w programie MS ExcelIDH_MS_WORD_AND_EXCEL, pojedynczych arkuszy czy komórek. + + +#$ +Tłumaczenie za pomocą Edytora Translacji + +Edytor Translacji pojawia się na ekranie po uruchomieniu systemu TRANSLATICA (Start -> Programy -> Translatica X -> Translatica). + + +#$K +Menu programu + +PlikIDH_MENU_FILE Wybierz menu Plik w celu wykonania operacji na plikach. +EdycjaIDH_MENU_EDIT Wybierz menu Edycja w celu wykonania poleceń edycyjnych. +WidokIDH_MENU_VIEW Wybierz menu Widok w celu określenia parametrów wyświetlania. +TłumaczIDH_MENU_TRANSLATION Wybierz menu Tłumacz w celu przetłumaczenia tekstu lub ustawienia parametrów tłumaczenia. +NarzędziaIDH_MENU_TOOLS Wybierz menu Narzędzia w celu wykorzystania dodatkowych narzędzi programu. +PomocIDH_MENU_HELP Wybierz menu Pomoc w celu uzyskania pomocy o programie. + + +#$K +Menu Plik + +Wybierz menu Plik w celu otwarcia lub zapisania tekstów okien źródłowego i docelowego lub w celu wyjścia z programu TRANSLATICA. + +NowyIDH_MENU_FILE_NEW Nowy +Otwórz tekst źródłowyIDH_MENU_FILE_OPEN Otwórz +Otwórz ponownieIDH_MENU_FILE_REOPEN Otwórz ponownie +Zapisz tekst źródłowyIDH_MENU_FILE_SAVE_SOURCE Zapisz źródłowy +Zapisz tekst źródłowy jakoIDH_MENU_FILE_SAVE_SOURCE_AS Zapisz źródłowy jako +Zapisz tekst docelowyIDH_MENU_FILE_SAVE_DESTINATION Zapisz docelowy +Zapisz tekst docelowy jakoIDH_MENU_FILE_SAVE_DESTINATION_AS Zapisz docelowy jako +Zapisz obaIDH_MENU_FILE_SAVE_BOTH Zapisz oba +Zapisz wszystkoIDH_MENU_FILE_SAVE_ALL Zapisz wszystko +ZamknijIDH_MENU_FILE_CLOSE Zamknij +Zamknij wszystkoIDH_MENU_FILE_CLOSE_ALL Zamknij wszystko +ZakończIDH_MENU_FILE_EXIT Zakończ + + +#$K +Polecenie Plik|Nowy + +Wybierz z menu polecenie Plik|Nowy w celu rozpoczęcia nowego tłumaczenia. Okno tekstu źródłowego zostanie wyczyszczone. + + +#$K +Polecenie Plik|Otwórz tekst źródłowy + +Wybierz z menu polecenie Plik|Otwórz tekst źródłowy w celu otwarcia okna dialogowego Otwórz tekst źródłowy. +Okno dialogowe Otwórz tekst źródłowy pozwala na wybór pliku i wczytanie go do okna źródłowego. + +Okno dialogowe Otwórz plik źródłowy + +Szukaj w Wyświetla katalog bieżący. Użyj listy rozwijalnej, aby wybrać inny dysk lub katalog. + +Pliki Wyświetla pliki z katalogu bieżącego, które pasują do wzorca z pola Nazwa pliku lub Pliki typu. + +Nazwa pliku Wpisz nazwę pliku, który chcesz wczytać lub wpisz wzorzec, żeby wyświetlić pliki o nazwie zgodnej z wzorcem. + +Pliki typu Wybierz wzorzec plików, które mają być wyświetlane w liście plików. + +Przejdź do ostatnio +odwiedzanego +katalogu Naciśnij ten przycisk, by wrócić do poprzedniego katalogu bieżącego. + +Do góry o jeden +poziom Naciśnij ten przycisk, żeby przejść do katalogu nadrzędnego. + +Utwórz nowy folder Naciśnij ten przycisk, żeby utworzyć nowy katalog jako katalog podrzędny do bieżącego. + +Menu Widok Naciśnij ten przycisk, żeby zmienić sposób wyświetlania plików. + + +#$K +Polecenie Plik|Otwórz ponownie + +Wybierz z menu polecenie Plik|Otwórz ponownie w celu otwarcia jednego z ostatnio otwieranych plików tekstu źródłowego. + + +#$K +Polecenie Plik|Zapisz tekst źródłowy + +Wybierz z menu polecenie Plik|Zapisz tekst źródłowy w celu zapisania zmian dokonanych w tekście w oknie źródłowym. +Jeżeli plik nie był jeszcze zapisywany, to otworzy się okienko dialogowe Zapisywanie jakoIDH_MENU_FILE_SAVE_SOURCE_AS, które pozwoli na wprowadzenie nazwy pliku. + + +#$K +Polecenie Plik|Zapisz tekst źródłowy jako + +Wybierz z menu polecenie Plik|Zapisz tekst źródłowy jako w celu zapisania tekstu zawartego w oknie źródłowym do pliku. +Okno dialogowe Zapisz tekst źródłowy pozwala na wpisanie lub wybór nazwy pliku, do którego ma zostać zapisany tekst. + +Okno dialogowe Zapisz tekst źródłowy + +Zapisz w Wyświetla katalog bieżący. Użyj listy rozwijalnej, aby wybrać inny dysk lub katalog. + +Pliki Wyświetla pliki z katalogu bieżącego, które pasują do wzorca z pola Nazwa pliku lub Zapisz jako typ. + +Nazwa pliku Wpisz nazwę pliku, który chcesz wczytać lub wpisz wzorzec, żeby wyświetlić według niego pliki. + +Zapisz jako typ Wybierz wzorzec plików, które mają być wyświetlane w liście plików. + +Przejdź do ostatnio +odwiedzanego +katalogu Naciśnij ten przycisk, by wrócić do poprzedniego katalogu bieżącego. + +Do góry o jeden +poziom Naciśnij ten przycisk, żeby przejść do katalogu nadrzędnego. + +Utwórz nowy folder Naciśnij ten przycisk, żeby utworzyć nowy katalog jako katalog podrzędny do bieżącego. + +Menu Widok Naciśnij ten przycisk, żeby zmienić sposób wyświetlania plików. + + +#$K +Polecenie Plik|Zapisz tekst docelowy + +Wybierz z menu polecenie Plik|Zapisz tekst docelowy w celu zapisania zmian dokonanych w tekście w oknie docelowym. +Jeżeli plik nie był jeszcze zapisywany, to otworzy się okienko dialogowe Zapisywanie jakoIDH_MENU_FILE_SAVE_DESTINATION_AS, które pozwoli na wprowadzenie nazwy pliku. + + +#$K +Polecenie Plik|Zapisz tekst docelowy jako + +Wybierz z menu polecenie Plik|Zapisz tekst docelowy jako w celu zapisania tekstu zawartego w oknie docelowym do pliku. +Okno dialogowe Zapisz tekst docelowy jako pozwala na wpisanie lub wybór nazwy pliku, do którego ma zostać zapisany tekst. + +Okno dialogowe Zapisz tekst docelowy + +Zapisz w Wyświetla katalog bieżący. Użyj listy rozwijalnej, aby wybrać inny dysk lub katalog. + +Pliki Wyświetla pliki z katalogu bieżącego, które pasują do wzorca z pola Nazwa pliku lub Zapisz jako typ. + +Nazwa pliku Wpisz nazwę pliku, który chcesz wczytać lub wpisz wzorzec, żeby wyświetlić pliki o nazwie zgodnej z wzorcem. + +Zapisz jako typ Wybierz wzorzec plików, które mają być wyświetlane w liście plików. + +Przejdź do ostatnio +odwiedzanego +katalogu Naciśnij ten przycisk, by wrócić do poprzedniego katalogu bieżącego. + +Do góry o jeden +poziom Naciśnij ten przycisk, żeby przejść do katalogu nadrzędnego. + +Utwórz nowy folder Naciśnij ten przycisk, żeby utworzyć nowy katalog jako katalog podrzędny do bieżącego. + +Menu Widok Naciśnij ten przycisk, żeby zmienić sposób wyświetlania plików. + + +#$K +Polecenie Plik|Zapisz oba +Wybierz z menu polecenie Plik|Zapisz oba w celu zapisania tekstów z okien źródłowego i docelowego. Jeżeli któryś tekst nie był jeszcze zapisywany, otworzy się okno dialogowe Zapisz odpowiednio dla tekstu źródłowegoIDH_MENU_FILE_SAVE_SOURCE_AS lub/i docelowegoIDH_MENU_FILE_SAVE_DESTINATION_AS. + + +#$K +Polecenie Plik|Zapisz wszystko + +Wybierz z menu polecenie Plik|Zapisz wszystko w celu zapisania tekstów wszystkich zakładek z okien źródłowego i docelowego. Jeżeli któryś tekst nie był jeszcze zapisywany, otworzy się okno dialogowe Zapisz odpowiednio dla tekstu źródłowegoIDH_MENU_FILE_SAVE_SOURCE_AS lub/i docelowegoIDH_MENU_FILE_SAVE_DESTINATION_AS. + + +#$K +Polecenie Plik|Zamknij +Wybierz z menu polecenie Plik|Zamknij, aby zamknąć aktywną zakładkę edytora. + + +#$K +Polecenie Plik|Zamknij wszystko +Wybierz z menu polecenie Plik|Zamknij wszystko, aby zamknąć wszystkie zakładki edytora. + +#$K +Polecenie Plik|Zakończ + +Wybierz z menu polecenie Plik|Zakończ w celu zakończenia pracy z edytorem programu TRANSLATICA. + + +#$K +Menu Edycja + +Wybierz menu Edycja w celu wykonania podstawowych operacji edycyjnych pozwalających na kopiowanie, wklejanie i wycinanie zaznaczonych fragmentów tekstów. + +CofnijIDH_MENU_EDIT_UNDO Cofnij +PonówIDH_MENU_EDIT_REDO Ponów +WytnijIDH_MENU_EDIT_CUT Wytnij +KopiujIDH_MENU_EDIT_COPY Kopiuj +WklejIDH_MENU_EDIT_PASTE Wklej +UsuńIDH_MENU_EDIT_DELETE Usuń +Zaznacz wszystkoIDH_MENU_EDIT_SELECT_ALL Zaznacz wszystko +ZnajdźIDH_MENU_EDIT_FIND Znajdź +ZamieńIDH_MENU_EDIT_REPLACE Zamień +Znajdź następnyIDH_MENU_EDIT_FIND_NEXT Znajdź następny + + +#$K +Polecenie Edycja|Cofnij + +Wybierz z menu polecenie Edycja|Cofnij w celu cofnięcia ostatnio dokonanej operacji edycyjnej w oknie źródłowym lub docelowym. + + +#$K +Polecenie Edycja|Ponów + +Wybierz z menu polecenie Edycja|Ponów w celu ponownego wykonania ostatnio użytej operacji edycyjnej w oknie źródłowym lub docelowym. + + +#$K +Polecenie Edycja|Wytnij + +Wybierz z menu polecenie Edycja|Wytnij w celu przeniesienia do schowka zaznaczonego fragmentu tekstu. + + +#$K +Polecenie Edycja|Kopiuj + +Wybierz z menu polecenie Edycja|Kopiuj w celu skopiowania zaznaczonego fragmentu tekstu do schowka. + + +#$K +Polecenie Edycja|Wklej + +Wybierz z menu polecenie Edycja|Wklej w celu wklejenia tekstu zawartego w schowku.na pozycji, w której ustawiony jest kursor edycyjny. + + +#$K +Polecenie Edycja|Usuń + +Wybierz z menu polecenie Edycja|Usuń w celu usunięcia zaznaczonego fragmentu tekstu. + + +#$K +Polecenie Edycja|Zaznacz wszystko + +Wybierz z menu polecenie Edycja|Zaznacz wszystko w celu zaznaczenia całego tekstu. + + +#$K +Polecenie Edycja|Znajdź +W celu znalezienia w bieżącym oknie Edytora określonego wyraz lub frazy, wybierz polecenie Edycja|Znajdź. +Okno dialogowe Znajdź pozwala na wpisanie szukanego wyrazu lub frazy wyrazowej oraz określenie opcji wyszukiwania. + +Okno dialogowe Znajdź + +Szukany tekst Wpisz tekst do wyszukania. + +Opcje | Uwzględniaj +wielkość liter Zaznacz opcję, jeżeli dopasowanie tekstu ma uwzględniać wielkość liter. + +Kierunek | W przód/W tył Zaznacz odpowiednią opcję, jeżeli wyszukiwanie ma się odbywać na tekście znajdującym się przed/za bieżącą pozycją kursora. + +#$K +Polecenie Edycja|Zamień +W celu zamiany określonego tekstu na inny, wybierz polecenie Edycja|Zamień. +Okno dialogowe Zamień pozwala na wpisanie tekstu do zastąpienia oraz tekstu, który ma być wpisany. + +Okno dialogowe Zamień + +Szukany tekst Wpisz tekst, który ma być wyszukany i zastąpiony. + +Zamień na Wpisz tekst, którym ma być zastąpiony tekst szukany. + +Opcje | Uwzględniaj +wielkość liter Zaznacz opcję, jeżeli dopasowanie tekstu ma uwzględniać wielkość liter. + +Kierunek | W przód/W tył Zaznacz odpowiednią opcję, jeżeli wyszukiwanie ma się odbywać na tekście znajdującym się przed/za bieżącą pozycją kursora. + +Pomiń Kliknij przycisk, jeżeli dane wystąpienie tekstu ma być pominięte. + +Zamień wszystko Kliknij przycisk, jeżeli wszystkie znalezione wystąpienia tekstu mają być zamienione + + +#$K +Polecenie Edycja|Znajdź następny +Po włączeniu procesu wyszukiwania tekstu wybierz polecenie Edycja|Znajdź następny, żeby wyszukać kolejne wystąpienie podanego tekstu. + + +#$K +Menu Widok + +Wybierz menu Widok w celu dostosowania wyglądu programu. + +Granice wyrazówIDH_MENU_VIEW_SOURCE_TOKENS +tekstu źródłowegoIDH_MENU_VIEW_SOURCE_TOKENS Pokaż/Ukryj granice wyrazów tekstu źródłowego + +Wyrazy nieznaneIDH_MENU_VIEW_SOURCE_UNKNOWN +tekstu źródłowegoIDH_MENU_VIEW_SOURCE_UNKNOWN Włącz/wyłącz zaznaczenie wyrazów nieznanych w tekście źródłowym + +Granice wyrazówIDH_MENU_VIEW_TARGET_TOKENS +tekstu docelowegoIDH_MENU_VIEW_TARGET_TOKENS Pokaż/Ukryj granice wyrazów tekstu docelowego + +Wyrazy nieznaneIDH_MENU_VIEW_TARGET_UNKNOWN +tekstu docelowegoIDH_MENU_VIEW_TARGET_UNKNOWN Włącz/wyłącz zaznaczenie wyrazów nieznanych w tekście źródłowym + +Okno źródłoweIDH_MENU_VIEW_SOURCE Okno źródłowe + +Okno doceloweIDH_MENU_VIEW_DESTINATION Okno docelowe + +Ustawienie poziomeIDH_MENU_VIEW_HORIZONTAL Ustawienie poziome + +Ustawienie pionoweIDH_MENU_VIEW_VERTICAL Ustawienie pionowe + +Pasek narzędziIDH_MENU_VIEW_TOOLBAR Pasek narzędzi + +Pasek stanuIDH_MENU_VIEW_STATUSBAR Pasek stanu + +CzcionkaIDH_MENU_VIEW_FONT Wybór czcionki + + +#$K +Polecenie Widok|Granice wyrazów tekstu źródłowego + +Wybierz z menu polecenie Widok|Granice wyrazów tekstu źródłowego w celu pokazania lub ukrycia granic wyrazów w tekście źródłowym. Granice te są oznaczone znacznikami w kolorze niebieskim. Znaczniki kończące zdanie są dodatkowo oznaczane kropką. + + +#$K +Polecenie Widok|Granice wyrazów tekstu docelowego + +Wybierz z menu polecenie Widok|Granice wyrazów tekstu docelowego w celu pokazania lub ukrycia granic wyrazów w tekście przetłumaczonym. Granice te są oznaczone znacznikami w kolorze niebieskim. Znaczniki kończące zdanie są dodatkowo oznaczane kropką. + + +#$K +Polecenie Widok|Wyrazy nieznane tekstu źródłowego + +Wybierz z menu polecenie Widok|Wyrazy nieznane tekstu źródłowego w celu oznaczenia wyrazów w tekście źródłowym, które nie zostały rozpoznane przez Analizator tekstu. Wyrazy te są podkreślone żółtą linią. Wyrazy oznaczone w ten sposób nie są tłumaczone, lecz przenoszone do tekstu docelowego. + + +#$K +Polecenie Widok|Wyrazy nieznane tekstu docelowego + +Wybierz z menu polecenie Widok|Wyrazy nieznane tekstu docelowego w celu oznaczenia wyrazów w przetłumaczonym tekście, które nie zostały rozpoznane przez Analizator tekstu. Wyrazy te są podkreślone żółtą linią. + + +#$K +Polecenie Widok|Ustawienie poziome + +Wybierz z menu polecenie Widok|Ustawienie poziome w celu poziomego (jedno nad drugim) ustawienia okien źródłowego i docelowego. + + +#$K +Polecenie Widok|Ustawienie pionowe + +Wybierz z menu polecenie Widok|Ustawienie pionowe w celu pionowego (jedno obok drugiego) ustawienia okien źródłowego i docelowego. Ustawienie to pozwala na łatwiejsze porównywanie tekstu źródłowego i docelowego. + + +#$K +Polecenie Widok|Okno źródłowe + +Wybierz z menu polecenie Widok|Okno źródłowe w celu pokazania lub ukrycia okna z tekstem źródłowym. W przypadku, gdy chcemy ukryć okno źródłowe, a okno docelowe jest także ukryte, pokaże się okno docelowe (co najmniej jedno okno musi być widoczne). + + +#$K +Polecenie Widok|Okno docelowe + +Wybierz z menu polecenie Widok|Okno docelowe w celu pokazania lub ukrycia okna z tekstem docelowym. W przypadku, gdy chcemy ukryć okno docelowe, a okno źródłowe jest także ukryte, pokaże się okno źródłowe (co najmniej jedno okno musi być widoczne). + + +#$K +Polecenie Widok|Pasek narzędzi + +Wybierz z menu polecenie Widok|Pasek narzędzi w celu pokazania lub ukrycia paska narzędzi (u góry okna aplikacji). + + +#$K +Polecenie Widok|Pasek stanu + +Wybierz z menu polecenie Widok|Pasek stanu w celu pokazania lub ukrycia paska stanu (u dołu okna programu). +Pasek stanu podaje podstawowe informacje o edytowanym tekście: pozycję kursora i aktualny kontekst. + + +#$K +Polecenie Widok|Czcionka + +Wybierz z menu polecenie Widok|Czcionka w celu zmiany kroju i wielkości czcionki w oknach edycyjnych. + + +#$K +Menu Tłumacz + +Wybierz menu Tłumacz w celu uruchomienia poleceń związanych z tłumaczeniem. + +TłumaczIDH_MENU_TRANSLATION_TRANSLATE Tłumacz +Polsko-AngielskieIDH_MENU_TRANSLATION_PLEN Polsko-Angielskie +Angielsko-PolskieIDH_MENU_TRANSLATION_ENPL Angielsko-Polskie +UstawieniaIDH_MENU_TRANSLATION_SETTINGS Ustawienia + + +#$K +Polecenie Tłumacz|Tłumacz + +Wybierz z menu polecenie Tłumacz|Tłumacz w celu przetłumaczenia tekstu. + +Jeżeli pewien fragment tekstu w oknie źródłowym jest zaznaczony, wówczas tłumaczony jest tylko zaznaczony fragment. W przeciwnym przypadku tłumaczony jest cały tekst z okna źródłowego. +Przetłumaczony tekst umieszczany jest w oknie docelowym. Poprzednia zawartość okna docelowego jest usuwana. + +Jeżeli tłumaczony jest dłuższy fragment tekstu, to podczas tłumaczenia pokazywane jest okno postępu tłumaczenia. Tłumaczenie można wówczas przerwać wciskając przycisk Anuluj w oknie postępu tłumaczenia. + +Okno postępu tłumaczenia zawiera następujące pola: + +Zdania Podaje ilość przetłumaczonych zdań tekstu. + +Wyrazy Podaje ilość przetłumaczonych wyrazów. + +Tłumaczonych Podaje ilość zdań, które zostały przetłumaczone. + +Skopiowanych Podaje ilość zdań, które zostały przeniesione z tekstu źródłowego do docelowego. + +Kontekst Podaje aktualny kontekst tłumaczonego tekstu. + +Zamknij okno po +zakończeniu Jeśli pole jest zaznaczone, okno postępu tłumaczenia zostanie zamknięte po zakończeniu tłumaczenia. W przeciwnym przypadku okno należy zamknąć wciskając przycisk Zamknij. + + +#$K +Polecenie Tłumacz|Polsko-Angielskie + +Wybierz z menu polecenie Tłumacz|Polsko-Angielskie w celu ustawienia kierunku tłumaczenia na kierunek z języka polskiego na język angielski. +Po zmianie kierunku tłumaczenia, jeżeli włączona jest analizaIDH_MENU_TOOLS_ANALYSE tekstu, tekst w oknie źródłowym zostanie ponownie przeanalizowany. + + +#$K +Polecenie Tłumacz|Angielsko-Polskie + +Wybierz z menu polecenie Tłumacz|Angielsko-Polskie w celu ustawienia kierunku tłumaczenia na kierunek z języka angielskiego na język polski. +Po zmianie kierunku tłumaczenia, jeżeli włączona jest analizaIDH_MENU_TOOLS_ANALYSE tekstu, tekst w oknie źródłowym zostanie ponownie przeanalizowany. + + +#$K +Polecenie Tłumaczenie|Ustawienia + +Wybierz z menu polecenie Tłumaczenie|Ustawienia w celu ustawienia opcji tłumaczenia. Do opcji tych należą: konteksty, słowniki oraz wyrazy nietłumaczone. + + +Zakładka Konteksty + +Wybierz zakładkę Konteksty w celu ustawienia kontekstu tłumaczenia. Ustawienie kontekstu wpływa na sposób tłumaczenia wyrazu. + +W wyniku wybrania polecenia pojawi się okno pozwalające na wybór kontekstu w następujących kategoriach: +• Dziedziny – zawiera konteksty tematyczne opisujące dziedziny wiedzy +• Style – zawiera konteksty określające styl tłumaczonego tekstu +• Dialekty – zawiera konteksty określające wariant języka angielskiego + + +Zakładka Słowniki + +Wybierz zakładkę Słowniki w celu określenia, z jakich słowników system ma pobierać informacje o tłumaczeniu poszczególnych wyrazów i fraz. Dostępne są następujące słowniki: +• Lokalny użytkownika – budowany w trakcie użytkowania systemu +• Systemowy – dołączany do systemu + + +Zakładka Wyrazy nietłumaczone + +Wybierz zakładkę Wyrazy nietłumaczone, aby przeglądać i edytować listę wyrazów i form wyrazowych wyjętych z tłumaczenia. + +Przycisk Usuń Kliknij przycisk usuń, aby usunąć wybrany wyraz z listy wyrazów nietłumaczonych + +Przycisk Zaznacz/Odznacz Kliknij przycisk, aby zaznaczyć/odznaczyć wybrany wyraz jako wyraz nietłumaczony + +Wyświetlaj okno wyboru +lokalnie/globalnie Zaznacz opcję, jeżeli przy dodawaniu wyrazu do listy wyrazów nietłumaczonych ma być wyświetlane okno globalnego lub lokalnego wyłączenia wyrazu z tłumaczenia + + +#$K +Menu Narzędzia + +Wybierz menu Narzędzia w celu uaktywnienia dodatkowych możliwości programu TRANSLATICA. + +Analizuj tekst źródłowyIDH_MENU_TOOLS_ANALYSE Analizuj tekst +Sprawdzaj pisownięIDH_MENU_TOOLS_SPELLCHECKING Sprawdzaj pisownię +Generuj wariantyIDH_MENU_TOOLS_VARIANTS Pokaż/Ukryj warianty +Generuj drzewa składnioweIDH_MENU_TOOLS_SYNTAX_TREE Generuj drzewa składniowe +SłownikIDH_MENU_TOOLS_DICTIONARY Słownik +WypowiedzIDH_MENU_TOOLS_SPEAK Wypowiedz tekst +SłuchajIDH_MENU_TOOLS_DICTATE Słuchaj +Kompilator danych korporacyjnychIDH_DATA_COMPILER Kompilator danych korporacyjnych +Słownik PWN-OxfordIDH_PWN_DICTIONARY Słownik PWN-Oxford +Język programuIDH_MENU_TOOLS_APPLICATION_LANGUAGE Język programu + + +#$K +Polecenie Narzędzia|Analizuj tekst źródłowy + +Wybierz z menu polecenie Narzędzia|Analizuj tekst źródłowy w celu włączenia lub wyłączenia automatycznej analizy tekstu źródłowego. + +Podczas analizy rozpoznawane są pojedyncze wyrazy, wyrazy złożone oraz zdania. Ponadto przy włączonej opcji Sprawdzaj pisownięIDH_MENU_TOOLS_SPELLCHECKING sprawdzana jest poprawność wyrazów. + +Podczas analizy dłuższych fragmentów tekstu pojawia się okno Analiza tekstu zawierające następujące pola: + +Zdania Podaje liczbę przeanalizowanych zdań. + +Wyrazy Podaje liczbę rozpoznanych wyrazów. + +Błędy Podaje liczbę wyrazów błędnych. + +Nieznane Podaje liczbę wyrazów nieznanych. + +Zamknij po +zakończeniu Jeśli pole jest zaznaczone, okno analizy zostanie zamknięte po zakończeniu analizy. W przeciwnym przypadku okno należy zamknąć wciskając przycisk Zamknij. + +Anuluj Przycisk pozwala na przerwanie analizy tekstu źródłowego. + + +#$K +Polecenie Narzędzia|Sprawdzaj pisownię + +Wybierz z menu polecenie Narzędzia|Sprawdzaj pisownię w celu włączenia lub wyłączenia sprawdzania poprawności ortograficznej wyrazów w tekście źródłowym. Wyrazy błędne są podkreślone czerwoną linią falistą. Jeżeli wyraz zostanie uznany przez system za błędny, wówczas możliwy jest wybór wyrazu spośród podpowiedzi wygenerowanych przez system. Podpowiedzi pojawiają się po kliknięciu na wyrazie prawym przyciskiem myszy. + + +#$K +Polecenie Narzędzia|Generuj warianty + +Wybierz z menu polecenie Narzędzia|Generuj warianty w celu tłumaczenia z możliwością wyboru wariantów (alternatywnych tłumaczeń). Wyrazy, dla których istnieje możliwość wyboru wariantów, są w oknie docelowym podkreślone szarą przerywaną linią. + + +#$K +Polecenie Narzędzia|Generuj drzewa składniowe + +Wybierz z menu polecenie Narzędzia|Generuj drzewa składniowe w celu przetłumaczenia zaznaczonego fragmentu tekstu lub całego tekstu z włączoną opcją pokazywania drzew składniowych. +Po zakończeniu tłumaczenia zostaje wyświetlone okno struktury składniowej pozwalające na obejrzenie struktury zdań w języku źródłowym i docelowym. +Podczas tłumaczenia dłuższego tekstu wyświetlane jest okno postępu tłumaczenia. + + +#$K +Polecenie Narzędzia|Słownik + +Wybierz z menu polecenie Narzędzia|Słownik w celu uruchomienia przeglądarki słownika. + + +#$K +Polecenie Narzędzia|Wypowiedz +Wybierz z menu polecenie Narzędzia|Wypowiedz w celu odczytania tekstu w języku angielskim. + + +#$K +Polecenie Narzędzia|Słuchaj +Wybierz z menu polecenie Narzędzia|Słuchaj w celu podyktowania tekstu w języku angielskim. + + +#$K +Polecenie Narzędzia|Kompilator danych korporacyjnych + +Wybierz z menu polecenie Narzędzia|Kompilator danych korporacyjnych aby uruchomić kompilator Bazy tłumaczeń firmyIDH_CORP_DATA. W wyniku jego działania powstaje plik msi, uruchomienie którego powoduje zainstalowanie Bazy tłumaczeń firmyIDH_CORP_DATA. + +Okno kompilatora danych korporacyjnych ma następujące pola: +Plik wejściowy Wpisz nazwę pliku Bazy tłumaczeń firmy. + +Ścieżka wyjściowa Wpisz lokalizację istniejącego katalogu, w którym tworzone będą plik wynikowy msi oraz wszystkie inne pliki potrzebne do jego utworzenia. + +Wersja Wpisz wersję pliku instalacyjnego msi. + +Przycisk Kompilacja Wciśnij przycisk, aby uruchomić proces kompilacji podanego pliku Bazy tłumaczeń firmy. + +Przycisk Tworzenie MSI Wciśnij przycisk, aby uruchomić proces tworzenia pliku instalacyjnego z plików powstałych podczas kompilacji. + +Komunikaty Okno wyświetlające komunikaty kompilacji i tworzenia pliku msi + +Uwaga: Do utworzenia MSI niezbędne jest zainstalowanie .Net Framework (w wersji 1.1. lub nowszej). W razie potrzeby plik instalacyjny można znaleźć na stronie microsoft.com*!EF(‘www.microsoft.com’). + + +#$K +Polecenie Narzędzia|Słownik PWN-Oxford + +Wybierz z menu polecenie Narzędzia|Słownik PWN-Oxford aby uruchomić słownik PWN-Oxford, jeżeli jest zainstalowany na komputerze. + + +#$K +Polecenie Narzędzia|Język programu + +Wybierz z menu polecenie Narzędzia|Język programu w celu zmiany języka interfejsu użytkownika. + + +#$K +Menu Pomoc + +Wybierz menu Pomoc w celu wyświetlenia pomocy programu lub wyświetlenia informacji o programie Translatica. + +Pomoc programu TranslaticaIDH_MENU_HELP_TRANSLATICA_HELP Pomoc programu Translatica +O programieIDH_MENU_HELP_ABOUT O programie + + +#$K +Polecenie Pomoc|Pomoc programu Translatica + +Wybierz z menu polecenie Pomoc|Pomoc programu Translatica w celu uruchomienia systemu pomocy programu. + + +#$K +Polecenie Pomoc|O programie + +Wybierz z menu polecenie Pomoc|O programie w celu wyświetlenia informacji o programie TRANSLATICA. + + +#$ +Pamięć tłumaczeń i słownik firmy + +Tłumaczenie zdań w sposób zadany przez użytkowników systemu jest realizowane przy pomocy Pamięci tłumaczeń. Pamięć tłumaczeń może zawierać praktycznie nieograniczoną liczbę zdań, które w obrębie danej instytucji powinny być zawsze tłumaczone w jeden określony sposób (przykładem zastosowania mogą być teksty na wszelkiego rodzaju formularzach). Gdy w zadanym do tłumaczenia tekście system napotka na zdanie, które znajduje się w Pamięci tłumaczeń, to proces automatycznego tłumaczenia zostanie zaniechany, a pobrany zostanie tekst tłumaczenia z Pamięci tłumaczeń. Należy zauważyć, że system nie szuka w Pamięci tłumaczeń zdań podobnych do danego lecz identycznych. +Słownik firmy może zawierać wyrazy oraz frazy kilkuwyrazowe, które mają być w obrębie firmy tłumaczone w pewien określony sposób, niezależnie od formy w jakiej występują. Jeśli na przykład pewien bank zażyczy sobie, aby w swoich dokumentach tłumaczeniem frazy pożyczka długoterminowa było long-period loan (a nie jak w słowniku systemu TRANSLATICA long-term loan), to w taki sposób tłumaczone będą wszelkie wystąpienia tej frazy we wszystkich odmianach (np. pożyczki długoterminowej) – również wewnątrz + +Dla ułatwienia, zdania z Pamięci tłumaczeń i frazy ze Słownika firmy są przechowywane w jednym pliku, zwanym dalej Bazą tłumaczeń firmy. +Baza tłumaczeń firmy powinna zawierać wyrazy, frazy lub zdania w języku źródłowym i docelowym z określeniem sposobu i kierunku tłumaczenia. Plik ten może być stosowany w dwóch formatach: tzw. prostym oraz w formacie XML. + +Format prosty zakłada, że kolejne wiersze składają się z następujących elementów rozdzielonych znakami tabulacji: +Czy fraza wartość logiczna określająca, czy podane hasło jest frazą, która ma być odmieniana i odszukiwana wewnątrz zdań (czyli elementem Słownika firmy), czy też zdaniem (elementem Pamięci tłumaczeń). Dopuszczalne wartości: + yes (lub tak lub1) dla frazy + no (lub nie lub 0) dla zdania. + +Kierunek określa kierunek tłumaczenia, który ma być stosowany dla podanej pary fraz. Możliwe wartości to: + “>” – tłumaczenie tylko w kierunku polsko-angielskim + “<” – tłumaczenie tylko w kierunku angielsko-polskim + “<>” (lub napis pusty) – tłumaczenie w obu kierunkach + +Fraza 1 tekst w języku polskim + +Fraza 2 tekst w języku angielskim. + +Plik pamięci tłumaczeń w formacie prostym można łatwo uzyskać z pliku formatu .xls . Jeśli kolejne elementy opisu hasła podane są w kolejnych kolumnach, to format prosty uzyskuje się poprzez Zapisz jako Tekst (rozdzielany znakami tabulacji). + +Przykład pliku w formacie prostym: + +no < Być, albo nie być – oto jest pytanie. To be, or not to be: that is the question. +no <> Drogi Kliencie. Dear customer. +yes > Biały Dom White House + +Plik pamięci tłumaczeń w formacie XML powinien być zgodny ze schematem zawartym w pliku bin/win/enterprise_data.xsd. + +Przykład pliku formacie XML: + + + + To be, or not to be: that is the question. + Być, albo nie być – oto jest pytanie. + + + Drogi Kliencie. + Dear customer. + + Biały Dom + White House + + + + +#$K +Batcher + +System TRANSLATICA daje możliwość przetwarzania wsadowego dokumentów aplikacji MS Word, MS Excel oraz MS PowerPoint, czyli tłumaczenia wielu plików bez konieczności uprzedniego otwierania ich przez użytkownika. Do przetwarzania wsadowego służy program Batcher uruchamiany z menu Start: Start -> Translatica Enterprise/Office+ -> Batcher. + + + +Kolejne przyciski mają następujące funkcje: +Dodaj Wyświetla okno dialogowe służące do wybrania jednego lub wielu plików, które mają być przetłumaczone. + +Usuń Usuwa zaznaczony plik z listy plików do tłumaczenia. + +Resetuj Usuwa wszystkie pliki z listy plików do tłumaczenia. + +Opcje Wyświetla okno ustawień tłumaczenia dla danego pliku (patrz UstawieniaIDH_MENU_TRANSLATION_SETTINGS). + + lub Zmienia kierunek tłumaczenia; symbol flagi określa język docelowy tłumaczenia. + +Tłumacz Rozpoczyna proces tłumaczenia. + +Anuluj Kończy pracę programu. + +W oknie głównym programu Batcher wyświetlane jest drzewo z listą plików przeznaczonych do tłumaczenia, przy czym każdy z nich wyświetlany jest pod nazwą aplikacji, z którą jest skojarzony. Jeżeli któryś ze składników pakietu MS Office nie jest zainstalowany lub nie został zintegrowany, wówczas przy jego nazwie pojawia się symbol . + +Po dodaniu nowych plików, przy każdym z nich wyświetlony zostaje symbol lub określający język źródłowy pliku. + +Bezpośrednio po uruchomieniu procesu tłumaczenia wyświetlone zostaje okno dialogowe służące do określenia katalogu docelowego, w którym mają być umiejscowione przetłumaczone dokumenty. + +Po ukończeniu tłumaczenia przy nazwie każdego z tłumaczonych plików powinien pojawić się symbol flagi języka określonego jako docelowy. Wyświetlenie symbolu lub oznacza, że tłumaczenie danego pliku zakończyło się niepowodzeniem. + +Po skończonym procesie tłumaczenia, po zaznaczeniu nazwy tłumaczonego dokumentu, na pasku stanu wypisywana jest ścieżka dostępu do odpowiadającego mu dokumentu już przetłumaczonego. + + +#$K +Updater + +System TRANSLATICA wyposażony jest w program Updater umożliwiający automatyczną aktualizację przez Internet. Program ten można uruchomić wybierając polecenie z menu Start: Start -> Translatica X -> Updater. Jeżeli jest dostępna aktualizacja dla używanej wersji systemu, wówczas pojawi się okienko powiadamiające. Jednocześnie użytkownik proszony jest o potwierdzenie przeprowadzenia aktualizacji: + + + +Kolejne przyciski mają następujące funkcje: +Tak Rozpocznij pobieranie i instalację aktualizacji. + +Nie Pomiń tę wersję aktualizacji. + +Opcje Pokaż/ukryj opcje aktualizacji. + +Aktualizuj automatycznie Uruchamiaj aktualizację przy starcie systemu TRANSLATICA. + +Informuj o aktualizacjach Wyświetlaj informację o nowej aktualizacji i pytaj o jej zainstalowanie. + +Wyłącz automatyczną aktualizację Pozwól na uruchamianie aktualizacji tylko przez użytkownika. + +Zastosuj Zastosuj zmiany dokonane w opcjach. + +# IDH_ABOUT_MT +$ Kilka słów o tłumaczeniu automatycznym +# IDH_CHARACTERIZATION +$ Charakterystyka systemu TRANSLATICA +# IDH_LOCAL_INSTALLATION +$ Instalacja lokalna +# IDH_NET_INSTALLATION +$ Instalacja przez sieć +# IDH_VERSIONS +$ Wersje programu +# IDH_INTEGRATOR +$ Integrator +# IDH_LANGUAGE_VERSIONS +$ Wersje językowe +# IDH_MS_INTERNET_EXPLORER +$ Tłumaczenie w programie Microsoft Internet Explorer +# IDH_MOZILLA +$ Tłumaczenie w programie Mozilla +# IDH_OUTLOOK_EXPRESS +$ Tłumaczenie w programie Outlook Express +# IDH_MS_WORD_AND_EXCEL +$ Tłumaczenie w programach Microsoft Word i Microsoft Excel +# IDH_MS_POWERPOINT +$ Tłumaczenie w programie Microsoft PowerPoint +# IDH_MS_OUTLOOK +$ Tłumaczenie w programie Microsoft Outlook +# IDH_OO_WRITER +$ Tłumaczenie w programie Writer +# IDH_EDITOR +$ Tłumaczenie w edytorze translacji +# IDH_MENU +$ Menu programu TRANSLATICA +K menu programu +# IDH_MENU_FILE +$ Menu Plik +K Plik, menu +# IDH_MENU_FILE_NEW +$ Polecenie Plik|Nowy +K Nowy, polecenie +# IDH_MENU_FILE_OPEN +$ Polecenie Plik|Otwórz +K Otwórz, polecenie +# IDH_MENU_FILE_REOPEN +$ Polecenie Plik|Otwórz ponownie +K Otwórz ponownie, polecenie +# IDH_MENU_FILE_SAVE_SOURCE +$ Polecenie Plik|Zapisz źródłowy +K Zapisz źródłowy, polecenie +# IDH_MENU_FILE_SAVE_SOURCE_AS +$ Polecenie Plik|Zapisz źródłowy jako +K Zapisz źródłowy jako, polecenie +# IDH_MENU_FILE_SAVE_DESTINATION +$ Polecenie Plik|Zapisz docelowy +K Zapisz docelowy, polecenie +# IDH_MENU_FILE_SAVE_DESTINATION_AS +$ Polecenie Plik|Zapisz docelowy jako +K Zapisz docelowy jako, polecenie +# IDH_MENU_FILE_SAVE_BOTH +$ Polecenie Plik|Zapisz oba +K Zapisz oba, polecenie +# IDH_MENU_FILE_SAVE_ALL +$ Polecenie Plik|Zapisz wszystko +K Zapisz wszystko, polecenie +# IDH_MENU_FILE_CLOSE +$ Polecenie Plik|Zamknij +K Zamknij, polecenie +# IDH_MENU_FILE_CLOSE_ALL +$ Polecenie Plik|Zamknij wszystko +K Zamknij wszystko, polecenie +# IDH_MENU_FILE_EXIT +$ Polecenie Plik|Zakończ +K Zakończ, polecenie +# IDH_MENU_EDIT +$ Menu Edycja +K Edycja, menu +# IDH_MENU_EDIT_UNDO +$ Polecenie Edycja|Cofnij +K Cofnij, polecenie +# IDH_MENU_EDIT_REDO +$ Polecenie Edycja|Ponów +K Ponów, polecenie +# IDH_MENU_EDIT_CUT +$ Polecenie Edycja|Wytnij +K Wytnij, polecenie +# IDH_MENU_EDIT_COPY +$ Polecenie Edycja|Kopiuj +K Kopiuj, polecenie +# IDH_MENU_EDIT_PASTE +$ Polecenie Edycja|Wklej +K Wklej, polecenie +# IDH_MENU_EDIT_DELETE +$ Polecenie Edycja|Usuń +K Usuń, polecenie +# IDH_MENU_EDIT_SELECT_ALL +$ Polecenie Edycja|Zaznacz wszystko +K Zaznacz wszystko, polecenie +# IDH_MENU_EDIT_FIND +$ Polecenie Edycja|Znajdź +K Znajdź, polecenie +# IDH_MENU_EDIT_REPLACE +$ Polecenie Edycja|Zamień +K Zamień, polecenie +# IDH_MENU_EDIT_FIND_NEXT +$ Polecenie Edycja|Znajdź następny +K Znajdź następny, polecenie +# IDH_MENU_VIEW +$ Menu Widok +K Widok, menu +# IDH_MENU_VIEW_SOURCE_TOKENS +$ Polecenie Widok|Granice wyrazów tekstu źródłowego +K Granice wyrazów tekstu źródłowego, polecenie +# IDH_MENU_VIEW_TARGET_TOKENS +$ Polecenie Widok|Granice wyrazów tekstu docelowego +K Granice wyrazów tekstu docelowego, polecenie +# IDH_MENU_VIEW_SOURCE_UNKNOWN +$ Polecenie Widok|Wyrazy nieznane tekstu źródłowego +K Wyrazy nieznane tekstu źródłowego, polecenie +# IDH_MENU_VIEW_TARGET_UNKNOWN +$ Polecenie Widok|Wyrazy nieznane tekstu docelowego +K Wyrazy nieznane tekstu docelowego, polecenie +# IDH_MENU_VIEW_HORIZONTAL +$ Polecenie Widok|Ustawienie poziome +K Ustawienie poziome, polecenie +# IDH_MENU_VIEW_VERTICAL +$ Polecenie Widok|Ustawienie pionowe +K Ustawienie pionowe, polecenie +# IDH_MENU_VIEW_SOURCE +$ Polecenie Widok|Okno źródłowe +K Okno źródłowe, polecenie +# IDH_MENU_VIEW_DESTINATION +$ Polecenie Widok|Okno docelowe +K Okno docelowe, polecenie +# IDH_MENU_VIEW_TOOLBAR +$ Polecenie Widok|Pasek narzędzi +K Pasek narzędzi, polecenie +# IDH_MENU_VIEW_STATUSBAR +$ Polecenie Widok|Pasek stanu +K Pasek stanu, polecenie +# IDH_MENU_VIEW_FONT +$ Polecenie Widok|Czcionka +K Czcionka, polecenie +# IDH_MENU_TRANSLATION +$ Menu Tłumacz +K Tłumacz, menu +# IDH_MENU_TRANSLATION_TRANSLATE +$ Polecenie Tłumacz|Tłumacz +K Tłumacz, polecenie +# IDH_MENU_TRANSLATION_PLEN +$ Polecenie Tłumacz|Polsko-Angielskie +K Polsko-Angielskie, polecenie +# IDH_MENU_TRANSLATION_ENPL +$ Polecenie Tłumacz|Angielsko-Polskie +K Angielsko-Polskie, polecenie +# IDH_MENU_TRANSLATION_SETTINGS +$ Polecenie Tłumacz|Ustawienia +K Ustawienia +# IDH_MENU_TOOLS +$ Menu Narzędzia +K Narzędzia, menu +# IDH_MENU_TOOLS_ANALYSE +$ Polecenie Narzędzia|Analizuj tekst +K Analizuj tekst, polecenie +# IDH_MENU_TOOLS_SPELLCHECKING +$ Polecenie Opcje|Sprawdzaj pisownię +K Sprawdzaj pisownię, polecenie +# IDH_MENU_TOOLS_VARIANTS +$ Polecenie Narzędzia|Generuj warianty +K Warianty, Polecenie +# IDH_MENU_TOOLS_SYNTAX_TREE +$ Polecenie Narzędzia|Pokazuj drzewa składniowe +K Pokazuj drzewa składniowe, polecenie +# IDH_MENU_TOOLS_DICTIONARY +$ Polecenie Narzędzia|Słownik +K Słownik, polecenie +# IDH_MENU_TOOLS_SPEAK +$ Polecenie Narzędzia|Wypowiedz +K Wypowiedz, polecenie +# IDH_MENU_TOOLS_DICTATE +$ Polecenie Narzędzia|Słuchaj +K Słuchaj, polecenie +# IDH_DATA_COMPILER +$ Polecenie Narzędzia|Kompilator danych korporacyjnych +K Kompilator danych korporacyjnych, polecenie +# IDH_PWN_DICTIONARY +$ Polecenie Narzędzia|Słownik PWN-Oxford +K Słownik PWN-Oxford, polecenie +# IDH_MENU_TOOLS_APPLICATION_LANGUAGE +$ Polecenie Narzędzia|Język programu +K Język programu, polecenie +# IDH_MENU_HELP +$ Menu Pomoc +K Pomoc, menu +# IDH_MENU_HELP_TRANSLATICA_HELP +$ Polecenie Pomoc|Pomoc programu Translatica +K Pomoc programu Translatica, polecenie +# IDH_MENU_HELP_ABOUT +$ Polecenie Pomoc|O programie +K O programie, polecenie +# IDH_CORP_DATA +$ Pamięć tłumaczeń i słownik firmy +# IDH_BATCHER +$ Batcher +K Przetwarzanie wsadowe +# IDH_UPDATER +$ Updater +K Automatyczna aktualizacja +?? + +?? + +?? + +?? + diff --git a/examples/txt/poznan-de.txt b/examples/txt/poznan-de.txt new file mode 100755 index 0000000..a19df81 --- /dev/null +++ b/examples/txt/poznan-de.txt @@ -0,0 +1,12 @@ +Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. +Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. Seine Fläche beträgt 285 ha. Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. +Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. Angeln kann man sowohl vom Ufer, als auch vom Boot aus. Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. +Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. +Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. +Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). +Der Rusałka - See ist ein künstliches Wasserreservoir. Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. Der See hat eine Fläche von 36,7 ha. Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. Die Länge der Uferlinie beträgt 3300 m. +Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. +Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. +Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. Die Fläche des Sees beträgt 34,9 ha. Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. +Der See wird vom Polnischen Angelverein in Poznań genutzt. In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. In dem See überwiegt die Kleine Maräne. Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. +Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. diff --git a/examples/txt/poznan-pl.txt b/examples/txt/poznan-pl.txt new file mode 100755 index 0000000..7f478dd --- /dev/null +++ b/examples/txt/poznan-pl.txt @@ -0,0 +1,11 @@ +Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. +Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. Jego powierzchnia wynosi 285 ha. Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. +Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. Wędkować można zarówno z brzegu, jak i łodzi. Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. +Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. +Jezioro Malta jest zbiornikiem sztucznym. Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. +Jezioro Rusałka jest sztucznym zbiornikiem wodnym. Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. Akwen zajmuje powierzchnię 36,7 ha. Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. Długość linii brzegowej wynosi 3300 m. +Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. +Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. Ośrodek może przyjąć ok. 10 tys.osób. +Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. Powierzchnia akwenu wynosi 34,9 ha. Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. +Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. Jezioro zaliczane jest do typu sielawowego. Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. +W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. diff --git a/examples/txt/poznan-small-de.txt b/examples/txt/poznan-small-de.txt new file mode 100755 index 0000000..025df80 --- /dev/null +++ b/examples/txt/poznan-small-de.txt @@ -0,0 +1,3 @@ +Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. Angeln kann man sowohl vom Ufer, als auch vom Boot aus. Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. +Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. +Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. Das Stauwehr befindet sich am westlichen Ende des Sees, unweit des Kreisverkehrs Śródka. Der Malta - See ist eine bekannte Regattastrecke; zu Beginn der 90er Jahre entstand an seinen Ufern ein ganzer Komplex von Sport - und Erholungsobjekten. Am westlichen Teil des Nordufers ist das Wohnviertel Komandoria gelegen. \ No newline at end of file diff --git a/examples/txt/poznan-small-pl.txt b/examples/txt/poznan-small-pl.txt new file mode 100755 index 0000000..11b560d --- /dev/null +++ b/examples/txt/poznan-small-pl.txt @@ -0,0 +1,3 @@ +Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. Wędkować można zarówno z brzegu, jak i łodzi. Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. +Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. +Jezioro Malta jest zbiornikiem sztucznym. Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. W latach 1980-1990 niecka zbiornika i jego otoczenie zostało gruntownie zmodernizowane. Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. \ No newline at end of file diff --git a/examples/txt/stallman-ch1-en.txt b/examples/txt/stallman-ch1-en.txt new file mode 100755 index 0000000..e70ea7e --- /dev/null +++ b/examples/txt/stallman-ch1-en.txt @@ -0,0 +1,99 @@ +Chapter 1 +For Want of a Printer + +I fear the Greeks. Even when they bring gifts. +---Virgil +The Aeneid + +The new printer was jammed, again. + +Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. Upon arrival, he found only four pages in the printer's tray. To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + +Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. Still, the difference between waiting for a machine and waiting on a machine is a sizable one. It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + +Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + +How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? Stallman wondered. The machine had been a donation from the Xerox Corporation. A cutting edge prototype, it was a modified version of the popular Xerox photocopier. Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + +Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. The results had been immediately pleasing. Unlike the lab's old laser printer, the new Xerox machine was fast. Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. The new machine was also more precise. Circles came out looking like circles, not ovals. Straight lines came out looking like straight lines, not low-amplitude sine waves. + +It was, for all intents and purposes, a gift too good to refuse. + +It wasn't until a few weeks after its arrival that the machine's flaws began to surface. Chief among the drawbacks was the machine's inherent susceptibility to paper jams. Engineering-minded programmers quickly understood the reason behind the flaw. As a photocopier, the machine generally required the direct oversight of a human operator. Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. In engineering terms, user diligence was built into the system. + +In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + +Stallman himself had been of the first to identify the problem and the first to suggest a remedy. Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + +As fixes go, Stallman's was oblique but elegant. It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + +"If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. Of those two or three people, one of them, at least, would usually know how to fix the problem." + +Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. Improving a program was the true test of a hacker's skills.1 + +Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + +It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. He simply looked for a way to update the old fix or " hack" for the new system. In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. Xerox, in this instance, had provided software files in precompiled, or binary, form. Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + +Although Stallman knew plenty about computers, he was not an expert in translating binary files. As a hacker, however, he had other resources at his disposal. The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + +After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + +Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. He then rewrote the source code to make it more suitable for the AI Lab's operating system. With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + +From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + +"A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. New things would get added on. But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + +Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. Why not share it out of a simple desire for good karma? + +The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + +When the desired files failed to surface, however, Stallman began to grow suspicious. The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + +For Reid, the deal was a win-win. Scribe didn't fall into the public domain, and Unilogic recouped on its investment. For Stallman, it was a betrayal of the programmer ethos, pure and simple. Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + +As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + +Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + +He didn't have to wait long. Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. During that visit, he made sure to stop by the computer-science department. Department employees directed him to the office of the faculty member leading the Xerox project. When Stallman reached the office, he found the professor working there. + +In true engineer-to-engineer fashion, the conversation was cordial but blunt. After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. To his surprise, the professor refused to grant his request. + +"He told me that he had promised not to give me a copy," Stallman says. + +Memory is a funny thing. Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + +"The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + +When asked directly about the request, however, Sproull draws a blank. "I can't make a factual comment," writes Sproull via email. "I have absolutely no recollection of the incident." + +With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. "They would have been insane to give away the source code." + +For Stallman, however, the NDA was something else entirely. It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + +For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. At first, all he could focus on was the personal nature of the refusal. As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. So I just turned away and walked out without another word," Stallman recalls. "I might have slammed the door. Who knows? All I remember is wanting to get out of there." + +Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + +"It encouraged me to think about something that I'd already been thinking about," says Stallman. "I already had an idea that software should be shared, but I wasn't sure how to think about that. My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + +Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + +Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. From the viewpoint of the entire software industry, the printer was a wake-up call. Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. From Stallman's viewpoint, the printer was a Trojan Horse. After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. It had come disguised as a gift. + +That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + +"It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. "In this case I was the victim. [My lab and I] were victims." + +It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. Sooner or later, they reasoned, the software would become public knowledge. In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. For Stallman, however, it was the first step down a slippery slope. + +"When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + +As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + +Hence the importance of the laser printer and the encounter that resulted from it. Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. There would have been no sense of clarity, no urgency to address a problem others weren't addressing. Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + +"From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. "I decided never to make other people victims just like I had been a victim." + diff --git a/examples/txt/stallman-ch1-pl.txt b/examples/txt/stallman-ch1-pl.txt new file mode 100755 index 0000000..8b314fe --- /dev/null +++ b/examples/txt/stallman-ch1-pl.txt @@ -0,0 +1,97 @@ +Rozdział 1. +Gdy potrzebna drukarka + +Obawiam się Greków, nawet gdy przynoszą dary +- Wergiliusz +Eneida + +Nowa drukarka znowu się zacięła. + +Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + +Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + +Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + +Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. Urządzenie było darem Xerox Corporation. Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + +Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. Natychmiast osiągnięto zadawalające rezultaty. Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + +Był to ze pod każdym względem dar, który należało docenić. + +Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. W ich założeniach czujna obecność użytkownika było częścią systemu. + +Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + +Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + +Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + +"Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + +Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + +Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + +Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + +Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. Jednakże jako haker miał do dyspozycji inne źródła informacji. Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + +Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + +Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + +W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + +"Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + +Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + +Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + +Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. Był to zwiastun HTML-a, lingua franca Word Wide Web. W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + +Dla Reida była to procedura doskonała. Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. Natomiast dla Stallmana była to oczywista zdrada etosu programisty. Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + +Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + +Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + +Nie musiał długo czekać. W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + +Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + +"Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + +Pamięć jest ciekawą rzeczą. Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + +"Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. - "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + +Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + +Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + +Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + +Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. Na początku uznał odmowę za skierowaną przeciwko sobie. Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. Być może nawet trzasnąłem drzwiami. Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + +Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + +"Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + +Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + +Teraz nowa drukarka stała się oznaką zmian, które nastały. Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. Z punktu widzenia Stallmana drukarka była koniem trojańskim. W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. Pojawiło się w postaci daru. + +Stallman musiał przełknąć dwie gorzkie pigułki. Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + +"Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + +Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. Dla Stallmana był to początek staczania się po równi pochyłej. + +"Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + +Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + +"Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + diff --git a/examples/txt/stallman-en.txt b/examples/txt/stallman-en.txt new file mode 100755 index 0000000..9f8019c --- /dev/null +++ b/examples/txt/stallman-en.txt @@ -0,0 +1,1838 @@ +Acknowledgments +Special thanks to Henning Gutmann for sticking by this book. Special thanks to Aaron Oas for suggesting the idea to Tracy in the first place. Thanks to Laurie Petrycki, Jeffrey Holcomb, and all the others at O'Reilly & Associates. Thanks to Tim O'Reilly for backing this book. Thanks to all the first-draft reviewers: Bruce Perens, Eric Raymond, Eric Allman, Jon Orwant, Julie and Gerald Jay Sussman, Hal Abelson, and Guy Steele. I hope you enjoy this typo-free version. Thanks to Alice Lippman for the interviews, cookies, and photographs. Thanks to my family, Steve, Jane, Tish, and Dave. And finally, last but not least: thanks to Richard Stallman for having the guts and endurance to "show us the code." + +Sam Williams + + +Preface +The work of Richard M. Stallman literally speaks for itself. From the documented source code to the published papers to the recorded speeches, few people have expressed as much willingness to lay their thoughts and their work on the line. + +Such openness-if one can pardon a momentary un-Stallman adjective-is refreshing. After all, we live in a society that treats information, especially personal information, as a valuable commodity. The question quickly arises. Why would anybody want to part with so much information and yet appear to demand nothing in return? + +As we shall see in later chapters, Stallman does not part with his words or his work altruistically. Every program, speech, and on-the-record bon mot comes with a price, albeit not the kind of price most people are used to paying. + +I bring this up not as a warning, but as an admission. As a person who has spent the last year digging up facts on Stallman's personal history, it's more than a little intimidating going up against the Stallman oeuvre. "Never pick a fight with a man who buys his ink by the barrel," goes the old Mark Twain adage. In the case of Stallman, never attempt the definitive biography of a man who trusts his every thought to the public record. + +For the readers who have decided to trust a few hours of their time to exploring this book, I can confidently state that there are facts and quotes in here that one won't find in any Slashdot story or Google search. Gaining access to these facts involves paying a price, however. In the case of the book version, you can pay for these facts the traditional manner, i.e., by purchasing the book. In the case of the electronic versions, you can pay for these facts in the free software manner. Thanks to the folks at O'Reilly & Associates, this book is being distributed under the GNU Free Documentation License, meaning you can help to improve the work or create a personalized version and release that version under the same license. + +If you are reading an electronic version and prefer to accept the latter payment option, that is, if you want to improve or expand this book for future readers, I welcome your input. Starting in June, 2002, I will be publishing a bare bones HTML version of the book on the web site, http://www.faifzilla.org. My aim is to update it regularly and expand the Free as in Freedom story as events warrant. If you choose to take the latter course, please review Appendix C of this book. It provides a copy of your rights under the GNU Free Documentation License. + +For those who just plan to sit back and read, online or elsewhere, I consider your attention an equally valuable form of payment. Don't be surprised, though, if you, too, find yourself looking for other ways to reward the good will that made this work possible. + +One final note: this is a work of journalism, but it is also a work of technical documentation. In the process of writing and editing this book, the editors and I have weighed the comments and factual input of various participants in the story, including Richard Stallman himself. We realize there are many technical details in this story that may benefit from additional or refined information. As this book is released under the GFDL, we are accepting patches just like we would with any free software program. Accepted changes will be posted electronically and will eventually be incorporated into future printed versions of this work. If you would like to contribute to the further improvement of this book, you can reach me at sam@inow.com. +Comments and Questions +Please address comments and questions concerning this book to the publisher: + + O'Reilly & Associates, Inc. + 1005 Gravenstein Highway North + Sebastopol, CA 95472 + (800) 998-9938 (in the United States or Canada) + (707) 829-0515 (international/local) + (707) 829-0104 (fax) + +There is a web page for this book, which lists errata, examples, or any additional information. The site also includes a link to a forum where you can discuss the book with the author and other readers. You can access this site at: + + http://www.oreilly.com/catalog/freedom/ + +To comment or ask technical questions about this book, send email to: + + bookquestions@oreilly.com + +For more information about books, conferences, Resource Centers, and the O'Reilly Network, see the O'Reilly web site at: + + http://www.oreilly.com + + +Chapter 1 +For Want of a Printer + +I fear the Greeks. Even when they bring gifts. +---Virgil +The Aeneid + +The new printer was jammed, again. + +Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. Upon arrival, he found only four pages in the printer's tray. To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + +Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. Still, the difference between waiting for a machine and waiting on a machine is a sizable one. It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + +Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + +How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? Stallman wondered. The machine had been a donation from the Xerox Corporation. A cutting edge prototype, it was a modified version of the popular Xerox photocopier. Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + +Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. The results had been immediately pleasing. Unlike the lab's old laser printer, the new Xerox machine was fast. Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. The new machine was also more precise. Circles came out looking like circles, not ovals. Straight lines came out looking like straight lines, not low-amplitude sine waves. + +It was, for all intents and purposes, a gift too good to refuse. + +It wasn't until a few weeks after its arrival that the machine's flaws began to surface. Chief among the drawbacks was the machine's inherent susceptibility to paper jams. Engineering-minded programmers quickly understood the reason behind the flaw. As a photocopier, the machine generally required the direct oversight of a human operator. Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. In engineering terms, user diligence was built into the system. + +In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + +Stallman himself had been of the first to identify the problem and the first to suggest a remedy. Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + +As fixes go, Stallman's was oblique but elegant. It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + +"If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. Of those two or three people, one of them, at least, would usually know how to fix the problem." + +Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. Improving a program was the true test of a hacker's skills.1 + +Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + +It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. He simply looked for a way to update the old fix or " hack" for the new system. In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. Xerox, in this instance, had provided software files in precompiled, or binary, form. Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + +Although Stallman knew plenty about computers, he was not an expert in translating binary files. As a hacker, however, he had other resources at his disposal. The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + +After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + +Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. He then rewrote the source code to make it more suitable for the AI Lab's operating system. With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + +From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + +"A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. New things would get added on. But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + +Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. Why not share it out of a simple desire for good karma? + +The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + +When the desired files failed to surface, however, Stallman began to grow suspicious. The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + +For Reid, the deal was a win-win. Scribe didn't fall into the public domain, and Unilogic recouped on its investment. For Stallman, it was a betrayal of the programmer ethos, pure and simple. Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + +As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + +Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + +He didn't have to wait long. Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. During that visit, he made sure to stop by the computer-science department. Department employees directed him to the office of the faculty member leading the Xerox project. When Stallman reached the office, he found the professor working there. + +In true engineer-to-engineer fashion, the conversation was cordial but blunt. After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. To his surprise, the professor refused to grant his request. + +"He told me that he had promised not to give me a copy," Stallman says. + +Memory is a funny thing. Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + +"The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + +When asked directly about the request, however, Sproull draws a blank. "I can't make a factual comment," writes Sproull via email. "I have absolutely no recollection of the incident." + +With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. "They would have been insane to give away the source code." + +For Stallman, however, the NDA was something else entirely. It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + +For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. At first, all he could focus on was the personal nature of the refusal. As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. So I just turned away and walked out without another word," Stallman recalls. "I might have slammed the door. Who knows? All I remember is wanting to get out of there." + +Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + +"It encouraged me to think about something that I'd already been thinking about," says Stallman. "I already had an idea that software should be shared, but I wasn't sure how to think about that. My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + +Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + +Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. From the viewpoint of the entire software industry, the printer was a wake-up call. Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. From Stallman's viewpoint, the printer was a Trojan Horse. After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. It had come disguised as a gift. + +That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + +"It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. "In this case I was the victim. [My lab and I] were victims." + +It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. Sooner or later, they reasoned, the software would become public knowledge. In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. For Stallman, however, it was the first step down a slippery slope. + +"When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + +As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + +Hence the importance of the laser printer and the encounter that resulted from it. Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. There would have been no sense of clarity, no urgency to address a problem others weren't addressing. Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + +"From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. "I decided never to make other people victims just like I had been a victim." + + +Chapter 2 +2001: A Hacker's Odyssey +The New York University computer-science department sits inside Warren Weaver Hall, a fortress-like building located two blocks east of Washington Square Park. Industrial-strength air-conditioning vents create a surrounding moat of hot air, discouraging loiterers and solicitors alike. Visitors who breach the moat encounter another formidable barrier, a security check-in counter immediately inside the building's single entryway. + +Beyond the security checkpoint, the atmosphere relaxes somewhat. Still, numerous signs scattered throughout the first floor preach the dangers of unsecured doors and propped-open fire exits. Taken as a whole, the signs offer a reminder: even in the relatively tranquil confines of pre-September 11, 2001, New York, one can never be too careful or too suspicious. + +The signs offer an interesting thematic counterpoint to the growing number of visitors gathering in the hall's interior atrium. A few look like NYU students. Most look like shaggy-aired concert-goers milling outside a music hall in anticipation of the main act. For one brief morning, the masses have taken over Warren Weaver Hall, leaving the nearby security attendant with nothing better to do but watch Ricki Lake on TV and shrug her shoulders toward the nearby auditorium whenever visitors ask about "the speech." + +Once inside the auditorium, a visitor finds the person who has forced this temporary shutdown of building security procedures. The person is Richard M. Stallman, founder of the GNU Project, original president of the Free Software Foundation, winner of the 1990 MacArthur Fellowship, winner of the Association of Computing Machinery's Grace Murray Hopper Award (also in 1990), corecipient of the Takeda Foundation's 2001 Takeda Award, and former AI Lab hacker. As announced over a host of hacker-related web sites, including the GNU Project's own http://www.gnu.org site, Stallman is in Manhattan, his former hometown, to deliver a much anticipated speech in rebuttal to the Microsoft Corporation's recent campaign against the GNU General Public License. + +The subject of Stallman's speech is the history and future of the free software movement. The location is significant. Less than a month before, Microsoft senior vice president Craig Mundie appeared at the nearby NYU Stern School of Business, delivering a speech blasting the General Public License, or GPL, a legal device originally conceived by Stallman 16 years before. Built to counteract the growing wave of software secrecy overtaking the computer industry-a wave first noticed by Stallman during his 1980 troubles with the Xerox laser printer-the GPL has evolved into a central tool of the free software community. In simplest terms, the GPL locks software programs into a form of communal ownership-what today's legal scholars now call the "digital commons"-through the legal weight of copyright. Once locked, programs remain unremovable. Derivative versions must carry the same copyright protection-even derivative versions that bear only a small snippet of the original source code. For this reason, some within the software industry have taken to calling the GPL a "viral" license, because it spreads itself to every software program it touches.1 + +In an information economy increasingly dependent on software and increasingly beholden to software standards, the GPL has become the proverbial "big stick." Even companies that once laughed it off as software socialism have come around to recognize the benefits. Linux, the Unix-like kernel developed by Finnish college student Linus Torvalds in 1991, is licensed under the GPL, as are many of the world's most popular programming tools: GNU Emacs, the GNU Debugger, the GNU C Compiler, etc. Together, these tools form the components of a free software operating system developed, nurtured, and owned by the worldwide hacker community. Instead of viewing this community as a threat, high-tech companies like IBM, Hewlett Packard, and Sun Microsystems have come to rely upon it, selling software applications and services built to ride atop the ever-growing free software infrastructure. + +They've also come to rely upon it as a strategic weapon in the hacker community's perennial war against Microsoft, the Redmond, Washington-based company that, for better or worse, has dominated the PC-software marketplace since the late 1980s. As owner of the popular Windows operating system, Microsoft stands to lose the most in an industry-wide shift to the GPL license. Almost every line of source code in the Windows colossus is protected by copyrights reaffirming the private nature of the underlying source code or, at the very least, reaffirming Microsoft's legal ability to treat it as such. From the Microsoft viewpoint, incorporating programs protected by the "viral" GPL into the Windows colossus would be the software equivalent of Superman downing a bottle of Kryptonite pills. Rival companies could suddenly copy, modify, and sell improved versions of Windows, rendering the company's indomitable position as the No. 1 provider of consumer-oriented software instantly vulnerable. Hence the company's growing concern over the GPL's rate of adoption. Hence the recent Mundie speech blasting the GPL and the " open source" approach to software development and sales. And hence Stallman's decision to deliver a public rebuttal to that speech on the same campus here today. + +20 years is a long time in the software industry. Consider this: in 1980, when Richard Stallman was cursing the AI Lab's Xerox laser printer, Microsoft, the company modern hackers view as the most powerful force in the worldwide software industry, was still a privately held startup. IBM, the company hackers used to regard as the most powerful force in the worldwide software industry, had yet to to introduce its first personal computer, thereby igniting the current low-cost PC market. Many of the technologies we now take for granted-the World Wide Web, satellite television, 32-bit video-game consoles-didn't even exist. The same goes for many of the companies that now fill the upper echelons of the corporate establishment, companies like AOL, Sun Microsystems, Amazon.com, Compaq, and Dell. The list goes on and on. + +The fact that the high-technology marketplace has come so far in such little time is fuel for both sides of the GPL debate. GPL-proponents point to the short lifespan of most computer hardware platforms. Facing the risk of buying an obsolete product, consumers tend to flock to companies with the best long-term survival. As a result, the software marketplace has become a winner-take-all arena.2 The current, privately owned software environment, GPL-proponents say, leads to monopoly abuse and stagnation. Strong companies suck all the oxygen out of the marketplace for rival competitors and innovative startups. + +GPL-opponents argue just the opposite. Selling software is just as risky, if not more risky, than buying software, they say. Without the legal guarantees provided by private software licenses, not to mention the economic prospects of a privately owned "killer app" (i.e., a breakthrough technology that launches an entirely new market),3 companies lose the incentive to participate. Once again, the market stagnates and innovation declines. As Mundie himself noted in his May 3 address on the same campus, the GPL's "viral" nature "poses a threat" to any company that relies on the uniqueness of its software as a competitive asset. Added Mundie: + + It also fundamentally undermines the independent commercial software sector because it effectively makes it impossible to distribute software on a basis where recipients pay for the product rather than just the cost of distribution.4 + +The mutual success of GNU/ Linux, the amalgamated operating system built around the GPL-protected Linux kernel, and Windows over the last 10 years reveals the wisdom of both perspectives. Nevertheless, the battle for momentum is an important one in the software industry. Even powerful vendors such as Microsoft rely on the support of third-party software developers whose tools, programs, and computer games make an underlying software platform such as Windows more attractive to the mainstream consumer. Citing the rapid evolution of the technology marketplace over the last 20 years, not to mention his own company's admirable track record during that period, Mundie advised listeners to not get too carried away by the free software movement's recent momentum: + + Two decades of experience have shown that an economic model that protects intellectual property and a business model that recoups research and development costs can create impressive economic benefits and distribute them very broadly.4 + +Such admonitions serve as the backdrop for Stallman's speech today. Less than a month after their utterance, Stallman stands with his back to one of the chalk boards at the front of the room, edgy to begin. + +If the last two decades have brought dramatic changes to the software marketplace, they have brought even more dramatic changes to Stallman himself. Gone is the skinny, clean-shaven hacker who once spent his entire days communing with his beloved PDP-10. In his place stands a heavy-set middle-aged man with long hair and rabbinical beard, a man who now spends the bulk of his time writing and answering email, haranguing fellow programmers, and giving speeches like the one today. Dressed in an aqua-colored T-shirt and brown polyester pants, Stallman looks like a desert hermit who just stepped out of a Salvation Army dressing room. + +The crowd is filled with visitors who share Stallman's fashion and grooming tastes. Many come bearing laptop computers and cellular modems, all the better to record and transmit Stallman's words to a waiting Internet audience. The gender ratio is roughly 15 males to 1 female, and 1 of the 7 or 8 females in the room comes in bearing a stuffed penguin, the official Linux mascot, while another carries a stuffed teddy bear. + + +Richard Stallman, circa 2000. "I decided I would develop a free software operating system or die trying . . . of old age of course." Photo courtesy of http://www.stallman.org. + +Agitated, Stallman leaves his post at the front of the room and takes a seat in a front-row chair, tapping a few commands into an already-opened laptop. For the next 10 minutes Stallman is oblivious to the growing number of students, professors, and fans circulating in front of him at the foot of the auditorium stage. + +Before the speech can begin, the baroque rituals of academic formality must be observed. Stallman's appearance merits not one but two introductions. Mike Uretsky, codirector of the Stern School's Center for Advanced Technology, provides the first. + +"The role of a university is to foster debate and to have interesting discussions," Uretsky says. "This particular presentation, this seminar falls right into that mold. I find the discussion of open source particularly interesting." + +Before Uretsky can get another sentence out, Stallman is on his feet waving him down like a stranded motorist. + +"I do free software," Stallman says to rising laughter. "Open source is a different movement." + +The laughter gives way to applause. The room is stocked with Stallman partisans, people who know of his reputation for verbal exactitude, not to mention his much publicized 1998 falling out with the open source software proponents. Most have come to anticipate such outbursts the same way radio fans once waited for Jack Benny's trademark, "Now cut that out!" phrase during each radio program. + +Uretsky hastily finishes his introduction and cedes the stage to Edmond Schonberg, a professor in the NYU computer-science department. As a computer programmer and GNU Project contributor, Schonberg knows which linguistic land mines to avoid. He deftly summarizes Stallman's career from the perspective of a modern-day programmer. + +"Richard is the perfect example of somebody who, by acting locally, started thinking globally [about] problems concerning the unavailability of source code," says Schonberg. "He has developed a coherent philosophy that has forced all of us to reexamine our ideas of how software is produced, of what intellectual property means, and of what the software community actually represents." + +Schonberg welcomes Stallman to more applause. Stallman takes a moment to shut off his laptop, rises out of his chair, and takes the stage. + +At first, Stallman's address seems more Catskills comedy routine than political speech. "I'd like to thank Microsoft for providing me the opportunity to be on this platform," Stallman wisecracks. "For the past few weeks, I have felt like an author whose book was fortuitously banned somewhere." + +For the uninitiated, Stallman dives into a quick free software warm-up analogy. He likens a software program to a cooking recipe. Both provide useful step-by-step instructions on how to complete a desired task and can be easily modified if a user has special desires or circumstances. "You don't have to follow a recipe exactly," Stallman notes. "You can leave out some ingredients. Add some mushrooms, 'cause you like mushrooms. Put in less salt because your doctor said you should cut down on salt-whatever." + +Most importantly, Stallman says, software programs and recipes are both easy to share. In giving a recipe to a dinner guest, a cook loses little more than time and the cost of the paper the recipe was written on. Software programs require even less, usually a few mouse-clicks and a modicum of electricity. In both instances, however, the person giving the information gains two things: increased friendship and the ability to borrow interesting recipes in return. + +"Imagine what it would be like if recipes were packaged inside black boxes," Stallman says, shifting gears. "You couldn't see what ingredients they're using, let alone change them, and imagine if you made a copy for a friend. They would call you a pirate and try to put you in prison for years. That world would create tremendous outrage from all the people who are used to sharing recipes. But that is exactly what the world of proprietary software is like. A world in which common decency towards other people is prohibited or prevented." + +With this introductory analogy out of the way, Stallman launches into a retelling of the Xerox laser-printer episode. Like the recipe analogy, the laser-printer story is a useful rhetorical device. With its parable-like structure, it dramatizes just how quickly things can change in the software world. Drawing listeners back to an era before Amazon.com one-click shopping, Microsoft Windows, and Oracle databases, it asks the listener to examine the notion of software ownership free of its current corporate logos. + +Stallman delivers the story with all the polish and practice of a local district attorney conducting a closing argument. When he gets to the part about the Carnegie Mellon professor refusing to lend him a copy of the printer source code, Stallman pauses. + +"He had betrayed us," Stallman says. "But he didn't just do it to us. Chances are he did it to you." + +On the word "you," Stallman points his index finger accusingly at an unsuspecting member of the audience. The targeted audience member's eyebrows flinch slightly, but Stallman's own eyes have moved on. Slowly and deliberately, Stallman picks out a second listener to nervous titters from the crowd. "And I think, mostly likely, he did it to you, too," he says, pointing at an audience member three rows behind the first. + +By the time Stallman has a third audience member picked out, the titters have given away to general laughter. The gesture seems a bit staged, because it is. Still, when it comes time to wrap up the Xerox laser-printer story, Stallman does so with a showman's flourish. "He probably did it to most of the people here in this room-except a few, maybe, who weren't born yet in 1980," Stallman says, drawing more laughs. "[That's] because he had promised to refuse to cooperate with just about the entire population of the planet Earth." + +Stallman lets the comment sink in for a half-beat. "He had signed a nondisclosure agreement," Stallman adds. + +Richard Matthew Stallman's rise from frustrated academic to political leader over the last 20 years speaks to many things. It speaks to Stallman's stubborn nature and prodigious will. It speaks to the clearly articulated vision and values of the free software movement Stallman helped build. It speaks to the high-quality software programs Stallman has built, programs that have cemented Stallman's reputation as a programming legend. It speaks to the growing momentum of the GPL, a legal innovation that many Stallman observers see as his most momentous accomplishment. + +Most importantly, it speaks to the changing nature of political power in a world increasingly beholden to computer technology and the software programs that power that technology. + +Maybe that's why, even at a time when most high-technology stars are on the wane, Stallman's star has grown. Since launching the GNU Project in 1984,5 Stallman has been at turns ignored, satirized, vilified, and attacked-both from within and without the free software movement. Through it all, the GNU Project has managed to meet its milestones, albeit with a few notorious delays, and stay relevant in a software marketplace several orders of magnitude more complex than the one it entered 18 years ago. So too has the free software ideology, an ideology meticulously groomed by Stallman himself. + +To understand the reasons behind this currency, it helps to examine Richard Stallman both in his own words and in the words of the people who have collaborated and battled with him along the way. The Richard Stallman character sketch is not a complicated one. If any person exemplifies the old adage "what you see is what you get," it's Stallman. + +"I think if you want to understand Richard Stallman the human being, you really need to see all of the parts as a consistent whole," advises Eben Moglen, legal counsel to the Free Software Foundation and professor of law at Columbia University Law School. "All those personal eccentricities that lots of people see as obstacles to getting to know Stallman really are Stallman: Richard's strong sense of personal frustration, his enormous sense of principled ethical commitment, his inability to compromise, especially on issues he considers fundamental. These are all the very reasons Richard did what he did when he did." + +Explaining how a journey that started with a laser printer would eventually lead to a sparring match with the world's richest corporation is no easy task. It requires a thoughtful examination of the forces that have made software ownership so important in today's society. It also requires a thoughtful examination of a man who, like many political leaders before him, understands the malleability of human memory. It requires an ability to interpret the myths and politically laden code words that have built up around Stallman over time. Finally, it requires an understanding of Stallman's genius as a programmer and his failures and successes in translating that genius to other pursuits. + +When it comes to offering his own summary of the journey, Stallman acknowledges the fusion of personality and principle observed by Moglen. "Stubbornness is my strong suit," he says. "Most people who attempt to do anything of any great difficulty eventually get discouraged and give up. I never gave up." + +He also credits blind chance. Had it not been for that run-in over the Xerox laser printer, had it not been for the personal and political conflicts that closed out his career as an MIT employee, had it not been for a half dozen other timely factors, Stallman finds it very easy to picture his life following a different career path. That being said, Stallman gives thanks to the forces and circumstances that put him in the position to make a difference. + +"I had just the right skills," says Stallman, summing up his decision for launching the GNU Project to the audience. "Nobody was there but me, so I felt like, `I'm elected. I have to work on this. If not me , who?'" + + +Chapter 3 +A Portrait of the Hacker as a Young Man +Richard Stallman's mother, Alice Lippman, still remembers the moment she realized her son had a special gift. + +"I think it was when he was eight," Lippman recalls. + +The year was 1961, and Lippman, a recently divorced single mother, was wiling away a weekend afternoon within the family's tiny one-bedroom apartment on Manhattan's Upper West Side. Leafing through a copy of Scientific American, Lippman came upon her favorite section, the Martin Gardner-authored column titled "Mathematical Games." A substitute art teacher, Lippman always enjoyed Gardner's column for the brain-teasers it provided. With her son already ensconced in a book on the nearby sofa, Lippman decided to take a crack at solving the week's feature puzzle. + +"I wasn't the best person when it came to solving the puzzles," she admits. "But as an artist, I found they really helped me work through conceptual barriers." + +Lippman says her attempt to solve the puzzle met an immediate brick wall. About to throw the magazine down in disgust, Lippman was surprised by a gentle tug on her shirt sleeve. + +"It was Richard," she recalls, "He wanted to know if I needed any help." + +Looking back and forth, between the puzzle and her son, Lippman says she initially regarded the offer with skepticism. "I asked Richard if he'd read the magazine," she says. "He told me that, yes, he had and what's more he'd already solved the puzzle. The next thing I know, he starts explaining to me how to solve it." + +Hearing the logic of her son's approach, Lippman's skepticism quickly gave way to incredulity. "I mean, I always knew he was a bright boy," she says, "but this was the first time I'd seen anything that suggested how advanced he really was." + +Thirty years after the fact, Lippman punctuates the memory with a laugh. "To tell you the truth, I don't think I ever figured out how to solve that puzzle," she says. "All I remember is being amazed he knew the answer." + +Seated at the dining-room table of her second Manhattan apartment-the same spacious three-bedroom complex she and her son moved to following her 1967 marriage to Maurice Lippman, now deceased-Alice Lippman exudes a Jewish mother's mixture of pride and bemusement when recalling her son's early years. The nearby dining-room credenza offers an eight-by-ten photo of Stallman glowering in full beard and doctoral robes. The image dwarfs accompanying photos of Lippman's nieces and nephews, but before a visitor can make too much of it, Lippman makes sure to balance its prominent placement with an ironic wisecrack. + +"Richard insisted I have it after he received his honorary doctorate at the University of Glasgow," says Lippman. "He said to me, `Guess what, mom? It's the first graduation I ever attended.'"1 + +Such comments reflect the sense of humor that comes with raising a child prodigy. Make no mistake, for every story Lippman hears and reads about her son's stubbornness and unusual behavior, she can deliver at least a dozen in return. + +"He used to be so conservative," she says, throwing up her hands in mock exasperation. "We used to have the worst arguments right here at this table. I was part of the first group of public city school teachers that struck to form a union, and Richard was very angry with me. He saw unions as corrupt. He was also very opposed to social security. He thought people could make much more money investing it on their own. Who knew that within 10 years he would become so idealistic? All I remember is his stepsister coming to me and saying, `What is he going to be when he grows up? A fascist?'" + +As a single parent for nearly a decade-she and Richard's father, Daniel Stallman, were married in 1948, divorced in 1958, and split custody of their son afterwards-Lippman can attest to her son's aversion to authority. She can also attest to her son's lust for knowledge. It was during the times when the two forces intertwined, Lippman says, that she and her son experienced their biggest battles. + +"It was like he never wanted to eat," says Lippman, recalling the behavior pattern that set in around age eight and didn't let up until her son's high-school graduation in 1970. "I'd call him for dinner, and he'd never hear me. I'd have to call him 9 or 10 times just to get his attention. He was totally immersed." + +Stallman, for his part, remembers things in a similar fashion, albeit with a political twist. + +"I enjoyed reading," he says. "If I wanted to read, and my mother told me to go to the kitchen and eat or go to sleep, I wasn't going to listen. I saw no reason why I couldn't read. No reason why she should be able to tell me what to do, period. Essentially, what I had read about, ideas such as democracy and individual freedom, I applied to myself. I didn't see any reason to exclude children from these principles." + +The belief in individual freedom over arbitrary authority extended to school as well. Two years ahead of his classmates by age 11, Stallman endured all the usual frustrations of a gifted public-school student. It wasn't long after the puzzle incident that his mother attended the first in what would become a long string of parent-teacher conferences. + +"He absolutely refused to write papers," says Lippman, recalling an early controversy. "I think the last paper he wrote before his senior year in high school was an essay on the history of the number system in the west for a fourth-grade teacher." + +Gifted in anything that required analytical thinking, Stallman gravitated toward math and science at the expense of his other studies. What some teachers saw as single-mindedness, however, Lippman saw as impatience. Math and science offered simply too much opportunity to learn, especially in comparison to subjects and pursuits for which her son seemed less naturally inclined. Around age 10 or 11, when the boys in Stallman's class began playing a regular game of touch football, she remembers her son coming home in a rage. "He wanted to play so badly, but he just didn't have the coordination skills," Lippman recalls. "It made him so angry." + +The anger eventually drove her son to focus on math and science all the more. Even in the realm of science, however, her son's impatience could be problematic. Poring through calculus textbooks by age seven, Stallman saw little need to dumb down his discourse for adults. Sometime, during his middle-school years, Lippman hired a student from nearby Columbia University to play big brother to her son. The student left the family's apartment after the first session and never came back. "I think what Richard was talking about went over his head," Lippman speculates. + +Another favorite maternal anecdote dates back to the early 1960s, shortly after the puzzle incident. Around age seven, two years after the divorce and relocation from Queens, Richard took up the hobby of launching model rockets in nearby Riverside Drive Park. What started as aimless fun soon took on an earnest edge as her son began recording the data from each launch. Like the interest in mathematical games, the pursuit drew little attention until one day, just before a major NASA launch, Lippman checked in on her son to see if he wanted to watch. + +"He was fuming," Lippman says. "All he could say to me was, `But I'm not published yet.' Apparently he had something that he really wanted to show NASA." + +Such anecdotes offer early evidence of the intensity that would become Stallman's chief trademark throughout life. When other kids came to the table, Stallman stayed in his room and read. When other kids played Johnny Unitas, Stallman played Werner von Braun. "I was weird," Stallman says, summing up his early years succinctly in a 1999 interview. "After a certain age, the only friends I had were teachers."1 + +Although it meant courting more run-ins at school, Lippman decided to indulge her son's passion. By age 12, Richard was attending science camps during the summer and private school during the school year. When a teacher recommended her son enroll in the Columbia Science Honors Program, a post-Sputnik program designed for gifted middle- and high-school students in New York City, Stallman added to his extracurriculars and was soon commuting uptown to the Columbia University campus on Saturdays. + +Dan Chess, a fellow classmate in the Columbia Science Honors Program, recalls Richard Stallman seeming a bit weird even among the students who shared a similar lust for math and science. "We were all geeks and nerds, but he was unusually poorly adjusted," recalls Chess, now a mathematics professor at Hunter College. "He was also smart as shit. I've known a lot of smart people, but I think he was the smartest person I've ever known." + +Seth Breidbart, a fellow Columbia Science Honors Program alumnus, offers bolstering testimony. A computer programmer who has kept in touch with Stallman thanks to a shared passion for science fiction and science-fiction conventions, he recalls the 15-year-old, buzz-cut-wearing Stallman as "scary," especially to a fellow 15-year-old. + +"It's hard to describe," Breidbart says. "It wasn't like he was unapproachable. He was just very intense. [He was] very knowledgeable but also very hardheaded in some ways." + +Such descriptions give rise to speculation: are judgment-laden adjectives like "intense" and "hardheaded" simply a way to describe traits that today might be categorized under juvenile behavioral disorder? A December, 2001, Wired magazine article titled "The Geek Syndrome" paints the portrait of several scientifically gifted children diagnosed with high-functioning autism or Asperger Syndrome. In many ways, the parental recollections recorded in the Wired article are eerily similar to the ones offered by Lippman. Even Stallman has indulged in psychiatric revisionism from time to time. During a 2000 profile for the Toronto Star, Stallman described himself to an interviewer as "borderline autistic,"2 a description that goes a long way toward explaining a lifelong tendency toward social and emotional isolation and the equally lifelong effort to overcome it. + +Such speculation benefits from the fast and loose nature of most so-called " behavioral disorders" nowadays, of course. As Steve Silberman, author of " The Geek Syndrome," notes, American psychiatrists have only recently come to accept Asperger Syndrome as a valid umbrella term covering a wide set of behavioral traits. The traits range from poor motor skills and poor socialization to high intelligence and an almost obsessive affinity for numbers, computers, and ordered systems.3 Reflecting on the broad nature of this umbrella, Stallman says its possible that, if born 40 years later, he might have merited just such a diagnosis. Then again, so would many of his computer-world colleagues. + +"It's possible I could have had something like that," he says. "On the other hand, one of the aspects of that syndrome is difficulty following rhythms. I can dance. In fact, I love following the most complicated rhythms. It's not clear cut enough to know." + +Chess, for one, rejects such attempts at back-diagnosis. "I never thought of him [as] having that sort of thing," he says. "He was just very unsocialized, but then, we all were." + +Lippman, on the other hand, entertains the possibility. She recalls a few stories from her son's infancy, however, that provide fodder for speculation. A prominent symptom of autism is an oversensitivity to noises and colors, and Lippman recalls two anecdotes that stand out in this regard. "When Richard was an infant, we'd take him to the beach," she says. "He would start screaming two or three blocks before we reached the surf. It wasn't until the third time that we figured out what was going on: the sound of the surf was hurting his ears." She also recalls a similar screaming reaction in relation to color: "My mother had bright red hair, and every time she'd stoop down to pick him up, he'd let out a wail." + +In recent years, Lippman says she has taken to reading books about autism and believes that such episodes were more than coincidental. "I do feel that Richard had some of the qualities of an autistic child," she says. "I regret that so little was known about autism back then." + +Over time, however, Lippman says her son learned to adjust. By age seven, she says, her son had become fond of standing at the front window of subway trains, mapping out and memorizing the labyrinthian system of railroad tracks underneath the city. It was a hobby that relied on an ability to accommodate the loud noises that accompanied each train ride. "Only the initial noise seemed to bother him," says Lippman. "It was as if he got shocked by the sound but his nerves learned how to make the adjustment." + +For the most part, Lippman recalls her son exhibiting the excitement, energy, and social skills of any normal boy. It wasn't until after a series of traumatic events battered the Stallman household, she says, that her son became introverted and emotionally distant. + +The first traumatic event was the divorce of Alice and Daniel Stallman, Richard's father. Although Lippman says both she and her ex-husband tried to prepare their son for the blow, she says the blow was devastating nonetheless. "He sort of didn't pay attention when we first told him what was happening," Lippman recalls. "But the reality smacked him in the face when he and I moved into a new apartment. The first thing he said was, `Where's Dad's furniture?'" + +For the next decade, Stallman would spend his weekdays at his mother's apartment in Manhattan and his weekends at his father's home in Queens. The shuttling back and forth gave him a chance to study a pair of contrasting parenting styles that, to this day, leaves Stallman firmly opposed to the idea of raising children himself. Speaking about his father, a World War II vet who passed away in early 2001, Stallman balances respect with anger. On one hand, there is the man whose moral commitment led him to learn French just so he could be more helpful to Allies when they'd finally come. On the other hand, there was the parent who always knew how to craft a put-down for cruel effect.4 + +"My father had a horrible temper," Stallman says. "He never screamed, but he always found a way to criticize you in a cold, designed-to-crush way." + +As for life in his mother's apartment, Stallman is less equivocal. "That was war," he says. "I used to say in my misery, `I want to go home,' meaning to the nonexistent place that I'll never have." + +For the first few years after the divorce, Stallman found the tranquility that eluded him in the home of his paternal grandparents. Then, around age 10 his grandparents passed away in short succession. For Stallman, the loss was devastating. "I used to go and visit and feel I was in a loving, gentle environment," Stallman recalls. "It was the only place I ever found one, until I went away to college." + +Lippman lists the death of Richard's paternal grandparents as the second traumatic event. "It really upset him," she says. He was very close to both his grandparents. Before they died, he was very outgoing, almost a leader-of-the-pack type with the other kids. After they died, he became much more emotionally withdrawn." + +From Stallman's perspective, the emotional withdrawal was merely an attempt to deal with the agony of adolescence. Labeling his teenage years a "pure horror," Stallman says he often felt like a deaf person amid a crowd of chattering music listeners. + +"I often had the feeling that I couldn't understand what other people were saying," says Stallman, recalling the emotional bubble that insulated him from the rest of the adolescent and adult world. "I could understand the words, but something was going on underneath the conversations that I didn't understand. I couldn't understand why people were interested in the things other people said." + +For all the agony it produced, adolescence would have a encouraging effect on Stallman's sense of individuality. At a time when most of his classmates were growing their hair out, Stallman preferred to keep his short. At a time when the whole teenage world was listening to rock and roll, Stallman preferred classical music. A devoted fan of science fiction, Mad magazine, and late-night TV, Stallman cultivated a distinctly off-the-wall personality that fed off the incomprehension of parents and peers alike. + +"Oh, the puns," says Lippman, still exasperated by the memory of her son's teenage personality. "There wasn't a thing you could say at the dinner table that he couldn't throw back at you as a pun." + +Outside the home, Stallman saved the jokes for the adults who tended to indulge his gifted nature. One of the first was a summer-camp counselor who handed Stallman a print-out manual for the IBM 7094 computer during his 12th year. To a preteenager fascinated with numbers and science, the gift was a godsend. 5 By the end of summer, Stallman was writing out paper programs according to the 7094's internal specifications, anxiously anticipating getting a chance to try them out on a real machine. + +With the first personal computer still a decade away, Stallman would be forced to wait a few years before getting access to his first computer. His first chance finally came during his junior year of high school. Hired on at the IBM New York Scientific Center, a now-defunct research facility in downtown Manhattan, Stallman spent the summer after high-school graduation writing his first program, a pre-processor for the 7094 written in the programming language PL/I. "I first wrote it in PL/I, then started over in assembler language when the PL/I program was too big to fit in the computer," he recalls. + +After that job at the IBM Scientific Center, Stallman had held a laboratory-assistant position in the biology department at Rockefeller University. Although he was already moving toward a career in math or physics, Stallman's analytical mind impressed the lab director enough that a few years after Stallman departed for college, Lippman received an unexpected phone call. "It was the professor at Rockefeller," Lippman says. "He wanted to know how Richard was doing. He was surprised to learn that he was working in computers. He'd always thought Richard had a great future ahead of him as a biologist." + +Stallman's analytical skills impressed faculty members at Columbia as well, even when Stallman himself became a target of their ire. "Typically once or twice an hour [Stallman] would catch some mistake in the lecture," says Breidbart. "And he was not shy about letting the professors know it immediately. It got him a lot of respect but not much popularity." + +Hearing Breidbart's anecdote retold elicits a wry smile from Stallman. "I may have been a bit of a jerk sometimes," he admits. "But I found kindred spirits among the teachers, because they, too, liked to learn. Kids, for the most part, didn't. At least not in the same way." + +Hanging out with the advanced kids on Saturday nevertheless encouraged Stallman to think more about the merits of increased socialization. With college fast approaching, Stallman, like many in his Columbia Science Honors Program, had narrowed his list of desired schools down to two choices: Harvard and MIT. Hearing of her son's desire to move on to the Ivy League, Lippman became concerned. As a 15-year-old high-school junior, Stallman was still having run-ins with teachers and administrators. Only the year before, he had pulled straight A's in American History, Chemistry, French, and Algebra, but a glaring F in English reflected the ongoing boycott of writing assignments. Such miscues might draw a knowing chuckle at MIT, but at Harvard, they were a red flag. + +During her son's junior year, Lippman says she scheduled an appointment with a therapist. The therapist expressed instant concern over Stallman's unwillingness to write papers and his run-ins with teachers. Her son certainly had the intellectual wherewithal to succeed at Harvard, but did he have the patience to sit through college classes that required a term paper? The therapist suggested a trial run. If Stallman could make it through a full year in New York City public schools, including an English class that required term papers, he could probably make it at Harvard. Following the completion of his junior year, Stallman promptly enrolled in summer school at Louis D. Brandeis High School, a public school located on 84th Street, and began making up the mandatory art classes he had shunned earlier in his high-school career. + +By fall, Stallman was back within the mainstream population of New York City high-school students. It wasn't easy sitting through classes that seemed remedial in comparison with his Saturday studies at Columbia, but Lippman recalls proudly her son's ability to toe the line. + +"He was forced to kowtow to a certain degree, but he did it," Lippman says. "I only got called in once, which was a bit of a miracle. It was the calculus teacher complaining that Richard was interrupting his lesson. I asked how he was interrupting. He said Richard was always accusing the teacher of using a false proof. I said, `Well, is he right?' The teacher said, `Yeah, but I can't tell that to the class. They wouldn't understand.'" + +By the end of his first semester at Brandeis, things were falling into place. A 96 in English wiped away much of the stigma of the 60 earned 2 years before. For good measure, Stallman backed it up with top marks in American History, Advanced Placement Calculus, and Microbiology. The crowning touch was a perfect 100 in Physics. Though still a social outcast, Stallman finished his 11 months at Brandeis as the fourth-ranked student in a class of 789. + + +Stallman's senior-year transcript at Louis D. Brandeis H.S., November, 1969. Note turnaround in English class performance. "He was forced to kowtow to a certain degree," says his mother, "but he did it." + +Outside the classroom, Stallman pursued his studies with even more diligence, rushing off to fulfill his laboratory-assistant duties at Rockefeller University during the week and dodging the Vietnam protesters on his way to Saturday school at Columbia. It was there, while the rest of the Science Honors Program students sat around discussing their college choices, that Stallman finally took a moment to participate in the preclass bull session. + +Recalls Breidbart, "Most of the students were going to Harvard and MIT, of course, but you had a few going to other Ivy League schools. As the conversation circled the room, it became apparent that Richard hadn't said anything yet. I don't know who it was, but somebody got up the courage to ask him what he planned to do." + +Thirty years later, Breidbart remembers the moment clearly. As soon as Stallman broke the news that he, too, would be attending Harvard University in the fall, an awkward silence filled the room. Almost as if on cue, the corners of Stallman's mouth slowly turned upward into a self-satisfied smile. + +Says Breidbart, "It was his silent way of saying, `That's right. You haven't got rid of me yet.'" + + +Chapter 4 +Impeach God +Although their relationship was fraught with tension, Richard Stallman would inherit one noteworthy trait from his mother: a passion for progressive politics. + +It was an inherited trait that would take several decades to emerge, however. For the first few years of his life, Stallman lived in what he now admits was a "political vacuum."1 Like most Americans during the Eisenhower age, the Stallman family spent the 50s trying to recapture the normalcy lost during the wartime years of the 1940s. + +"Richard's father and I were Democrats but happy enough to leave it at that," says Lippman, recalling the family's years in Queens. "We didn't get involved much in local or national politics." + +That all began to change, however, in the late 1950s when Alice divorced Daniel Stallman. The move back to Manhattan represented more than a change of address; it represented a new, independent identity and a jarring loss of tranquility. + +"I think my first taste of political activism came when I went to the Queens public library and discovered there was only a single book on divorce in the whole library," recalls Lippman. "It was very controlled by the Catholic church, at least in Elmhurst, where we lived. I think that was the first inkling I had of the forces that quietly control our lives." + +Returning to her childhood neighborhood, Manhattan's Upper West Side, Lippman was shocked by the changes that had taken place since her departure to Hunter College a decade and a half before. The skyrocketing demand for postwar housing had turned the neighborhood into a political battleground. On one side stood the pro-development city-hall politicians and businessmen hoping to rebuild many of the neighborhood's blocks to accommodate the growing number of white-collar workers moving into the city. On the other side stood the poor Irish and Puerto Rican tenants who had found an affordable haven in the neighborhood. + +At first, Lippman didn't know which side to choose. As a new resident, she felt the need for new housing. As a single mother with minimal income, however, she shared the poorer tenants' concern over the growing number of development projects catering mainly to wealthy residents. Indignant, Lippman began looking for ways to combat the political machine that was attempting to turn her neighborhood into a clone of the Upper East Side. + +Lippman says her first visit to the local Democratic party headquarters came in 1958. Looking for a day-care center to take care of her son while she worked, she had been appalled by the conditions encountered at one of the city-owned centers that catered to low-income residents. "All I remember is the stench of rotten milk, the dark hallways, the paucity of supplies. I had been a teacher in private nursery schools. The contrast was so great. We took one look at that room and left. That stirred me up." + +The visit to the party headquarters proved disappointing, however. Describing it as "the proverbial smoke-filled room," Lippman says she became aware for the first time that corruption within the party might actually be the reason behind the city's thinly disguised hostility toward poor residents. Instead of going back to the headquarters, Lippman decided to join up with one of the many clubs aimed at reforming the Democratic party and ousting the last vestiges of the Tammany Hall machine. Dubbed the Woodrow Wilson/FDR Reform Democratic Club, Lippman and her club began showing up at planning and city-council meetings, demanding a greater say. + +"Our primary goal was to fight Tammany Hall, Carmine DeSapio and his henchman,"2 says Lippman. "I was the representative to the city council and was very much involved in creating a viable urban-renewal plan that went beyond simply adding more luxury housing to the neighborhood." + +Such involvement would blossom into greater political activity during the 1960s. By 1965, Lippman had become an "outspoken" supporter for political candidates like William Fitts Ryan, a Democratic elected to Congress with the help of reform clubs and one of the first U.S. representatives to speak out against the Vietnam War. + +It wasn't long before Lippman, too, was an outspoken opponent of U.S. involvement in Indochina. "I was against the Vietnam war from the time Kennedy sent troops," she says. "I had read the stories by reporters and journalists sent to cover the early stages of the conflict. I really believed their forecast that it would become a quagmire." + +Such opposition permeated the Stallman-Lippman household. In 1967, Lippman remarried. Her new husband, Maurice Lippman, a major in the Air National Guard, resigned his commission to demonstrate his opposition to the war. Lippman's stepson, Andrew Lippman, was at MIT and temporarily eligible for a student deferment. Still, the threat of induction should that deferment disappear, as it eventually did, made the risk of U.S. escalation all the more immediate. Finally, there was Richard who, though younger, faced the prospect of choosing between Vietnam or Canada when the war lasted into the 1970s. + +"Vietnam was a major issue in our household," says Lippman. "We talked about it constantly: what would we do if the war continued, what steps Richard or his stepbrother would take if they got drafted. We were all opposed to the war and the draft. We really thought it was immoral." + +For Stallman, the Vietnam War elicited a complex mixture of emotions: confusion, horror, and, ultimately, a profound sense of political impotence. As a kid who could barely cope in the mild authoritarian universe of private school, Stallman experienced a shiver whenever the thought of Army boot camp presented itself. + +"I was devastated by the fear, but I couldn't imagine what to do and didn't have the guts to go demonstrate," recalls Stallman, whose March 18th birthday earned him a dreaded low number in the draft lottery when the federal government finally eliminated college deferments in 1971. "I couldn't envision moving to Canada or Sweden. The idea of getting up by myself and moving somewhere. How could I do that? I didn't know how to live by myself. I wasn't the kind of person who felt confident in approaching things like that." + +Stallman says he was both impressed and shamed by the family members who did speak out. Recalling a bumper sticker on his father's car likening the My Lai massacre to similar Nazi atrocities in World War II, he says he was "excited" by his father's gesture of outrage. "I admired him for doing it," Stallman says. "But I didn't imagine that I could do anything. I was afraid that the juggernaut of the draft was going to destroy me." + +Although descriptions of his own unwillingness to speak out carry a tinge of nostalgic regret, Stallman says he was ultimately turned off by the tone and direction of the anti-war movement. Like other members of the Science Honors Program, he saw the weekend demonstrations at Columbia as little more than a distracting spectacle.3 Ultimately, Stallman says, the irrational forces driving the anti-war movement became indistinguishable from the irrational forces driving the rest of youth culture. Instead of worshiping the Beatles, girls in Stallman's age group were suddenly worshiping firebrands like Abbie Hoffman and Jerry Rubin. To a kid already struggling to comprehend his teenage peers, escapist slogans like "make love not war" had a taunting quality. Not only was it a reminder that Stallman, the short-haired outsider who hated rock 'n' roll, detested drugs, and didn't participate in campus demonstrations, wasn't getting it politically; he wasn't "getting it" sexually either. + +"I didn't like the counter culture much," Stallman admits. "I didn't like the music. I didn't like the drugs. I was scared of the drugs. I especially didn't like the anti-intellectualism, and I didn't like the prejudice against technology. After all, I loved a computer. And I didn't like the mindless anti-Americanism that I often encountered. There were people whose thinking was so simplistic that if they disapproved of the conduct of the U.S. in the Vietnam War, they had to support the North Vietnamese. They couldn't imagine a more complicated position, I guess." + +Such comments alleviate feelings of timidity. They also underline a trait that would become the key to Stallman's own political maturation. For Stallman, political confidence was directly proportionate to personal confidence. By 1970, Stallman had become confident in few things outside the realm of math and science. Nevertheless, confidence in math gave him enough of a foundation to examine the anti-war movement in purely logical terms. In the process of doing so, Stallman had found the logic wanting. Although opposed to the war in Vietnam, Stallman saw no reason to disavow war as a means for defending liberty or correcting injustice. Rather than widen the breach between himself and his peers, however, Stallman elected to keep the analysis to himself. + +In 1970, Stallman left behind the nightly dinnertime conversations about politics and the Vietnam War as he departed for Harvard. Looking back, Stallman describes the transition from his mother's Manhattan apartment to life in a Cambridge dorm as an "escape." Peers who watched Stallman make the transition, however, saw little to suggest a liberating experience. + +"He seemed pretty miserable for the first while at Harvard," recalls Dan Chess, a classmate in the Science Honors Program who also matriculated at Harvard. "You could tell that human interaction was really difficult for him, and there was no way of avoiding it at Harvard. Harvard was an intensely social kind of place." + +To ease the transition, Stallman fell back on his strengths: math and science. Like most members of the Science Honors Program, Stallman breezed through the qualifying exam for Math 55, the legendary "boot camp" class for freshman mathematics "concentrators" at Harvard. Within the class, members of the Science Honors Program formed a durable unit. "We were the math mafia," says Chess with a laugh. "Harvard was nothing, at least compared with the SHP." + +To earn the right to boast, however, Stallman, Chess, and the other SHP alumni had to get through Math 55. Promising four years worth of math in two semesters, the course favored only the truly devout. "It was an amazing class," says David Harbater, a former "math mafia" member and now a professor of mathematics at the University of Pennsylvania. "It's probably safe to say there has never been a class for beginning college students that was that intense and that advanced. The phrase I say to people just to get it across is that, among other things, by the second semester we were discussing the differential geometry of Banach manifolds. That's usually when their eyes bug out, because most people don't start talking about Banach manifolds until their second year of graduate school." + +Starting with 75 students, the class quickly melted down to 20 by the end of the second semester. Of that 20, says Harbater, "only 10 really knew what they were doing." Of that 10, 8 would go on to become future mathematics professors, 1 would go on to teach physics. + +"The other one," emphasizes Harbater, "was Richard Stallman." + +Seth Breidbart, a fellow Math 55 classmate, remembers Stallman distinguishing himself from his peers even then. + +"He was a stickler in some very strange ways," says Breidbart. There is a standard technique in math which everybody does wrong. It's an abuse of notation where you have to define a function for something and what you do is you define a function and then you prove that it's well defined. Except the first time he did and presented it, he defined a relation and proved that it's a function. It's the exact same proof, but he used the correct terminology, which no one else did. That's just the way he was." + +It was in Math 55 that Richard Stallman began to cultivate a reputation for brilliance. Breidbart agrees, but Chess, whose competitive streak refused to yield, says the realization that Stallman might be the best mathematician in the class didn't set in until the next year. "It was during a class on Real Analysis, which I took with Richard the next year," says Chess, now a math professor at Hunter College. "I actually remember in a proof about complex valued measures that Richard came up with an idea that was basically a metaphor from the calculus of variations. It was the first time I ever saw somebody solve a problem in a brilliantly original way." + +Chess makes no bones about it: watching Stallman's solution unfold on the chalkboard was a devastating blow. As a kid who'd always taken pride in being the smartest mathematician the room, it was like catching a glimpse of his own mortality. Years later, as Chess slowly came to accept the professional rank of a good-but-not-great mathematician, he had Stallman's sophomore-year proof to look back on as a taunting early indicator. + +"That's the thing about mathematics," says Chess. "You don't have to be a first-rank mathematician to recognize first-rate mathematical talent. I could tell I was up there, but I could also tell I wasn't at the first rank. If Richard had chosen to be a mathematician, he would have been a first-rank mathematician." + +For Stallman, success in the classroom was balanced by the same lack of success in the social arena. Even as other members of the math mafia gathered to take on the Math 55 problem sets, Stallman preferred to work alone. The same went for living arrangements. On the housing application for Harvard, Stallman clearly spelled out his preferences. "I said I preferred an invisible, inaudible, intangible roommate," he says. In a rare stroke of bureaucratic foresight, Harvard's housing office accepted the request, giving Stallman a one-room single for his freshman year. + +Breidbart, the only math-mafia member to share a dorm with Stallman that freshman year, says Stallman slowly but surely learned how to interact with other students. He recalls how other dorm mates, impressed by Stallman's logical acumen, began welcoming his input whenever an intellectual debate broke out in the dining club or dorm commons. + +"We had the usual bull sessions about solving the world's problems or what would be the result of something," recalls Breidbart. "Say somebody discovers an immortality serum. What do you do? What are the political results? If you give it to everybody, the world gets overcrowded and everybody dies. If you limit it, if you say everyone who's alive now can have it but their children can't, then you end up with an underclass of people without it. Richard was just better able than most to see the unforeseen circumstances of any decision." + +Stallman remembers the discussions vividly. "I was always in favor of immortality," he says. "I was shocked that most people regarded immortality as a bad thing. How else would we be able to see what the world is like 200 years from now?" + +Although a first-rank mathematician and first-rate debater, Stallman shied away from clear-cut competitive events that might have sealed his brilliant reputation. Near the end of freshman year at Harvard, Breidbart recalls how Stallman conspicuously ducked the Putnam exam, a prestigious test open to math students throughout the U.S. and Canada. In addition to giving students a chance to measure their knowledge in relation to their peers, the Putnam served as a chief recruiting tool for academic math departments. According to campus legend, the top scorer automatically qualified for a graduate fellowship at any school of his choice, including Harvard. + +Like Math 55, the Putnam was a brutal test of merit. A six-hour exam in two parts, it seemed explicitly designed to separate the wheat from the chaff. Breidbart, a veteran of both the Science Honors Program and Math 55, describes it as easily the most difficult test he ever took. "Just to give you an idea of how difficult it was," says Breidbart, "the top score was a 120, and my score the first year was in the 30s. That score was still good enough to place me 101st in the country." + +Surprised that Stallman, the best student in the class, had passed on the test, Breidbart says he and a fellow classmate cornered him in the dining common and demanded an explanation. "He said he was afraid of not doing well," Breidbart recalls. + +Breidbart and the friend quickly wrote down a few problems from memory and gave them to Stallman. "He solved all of them," Breidbart says, "leading me to conclude that by not doing well, he either meant coming in second or getting something wrong." + +Stallman remembers the episode a bit differently. "I remember that they did bring me the questions and it's possible that I solved one of them, but I'm pretty sure I didn't solve them all," he says. Nevertheless, Stallman agrees with Breidbart's recollection that fear was the primary reason for not taking the test. Despite a demonstrated willingness to point out the intellectual weaknesses of his peers and professors in the classroom, Stallman hated the notion of head-to-head competition. + +"It's the same reason I never liked chess," says Stallman. "Whenever I'd play, I would become so consumed by the fear of making a single mistake that I would start making stupid mistakes very early in the game. The fear became a self-fulfilling prophecy." + +Whether such fears ultimately prompted Stallman to shy away from a mathematical career is a moot issue. By the end of his freshman year at Harvard, Stallman had other interests pulling him away from the field. Computer programming, a latent fascination throughout Stallman's high-school years, was becoming a full-fledged passion. Where other math students sought occasional refuge in art and history classes, Stallman sought it in the computer-science laboratory. + +For Stallman, the first taste of real computer programming at the IBM New York Scientific Center had triggered a desire to learn more. "Toward the end of my first year at Harvard school, I started to have enough courage to go visit computer labs and see what they had. I'd ask them if they had extra copies of any manuals that I could read." + +Taking the manuals home, Stallman would examine machine specifications, compare them with other machines he already knew, and concoct a trial program, which he would then bring back to the lab along with the borrowed manual. Although some labs balked at the notion of a strange kid coming off the street and working on the lab machinery, most recognized competence when they saw it and let Stallman run the programs he had created. + +One day, near the end of freshman year, Stallman heard about a special laboratory near MIT. The laboratory was located on the ninth floor an off-campus building in Tech Square, the newly built facility dedicated to advanced research. According to the rumors, the lab itself was dedicated to the cutting-edge science of artificial intelligence and boasted the cutting-edge machines and software programs to match. + +Intrigued, Stallman decided to pay a visit. + +The trip was short, about 2 miles on foot, 10 minutes by train, but as Stallman would soon find out, MIT and Harvard can feel like opposite poles of the same planet. With its maze-like tangle of interconnected office buildings, the Institute's campus offered an aesthetic yin to Harvard's spacious colonial-village yang. The same could be said for the student body, a geeky collection of ex-high school misfits known more for its predilection for pranks than its politically powerful alumni. + +The yin-yang relationship extended to the AI Lab as well. Unlike Harvard computer labs, there was no grad-student gatekeeper, no clipboard waiting list for terminal access, no explicit atmosphere of "look but don't touch." Instead, Stallman found only a collection of open terminals and robotic arms, presumably the artifacts of some A.I. experiment. + +Although the rumors said anybody could sit down at the terminals, Stallman decided to stick with the original plan. When he encountered a lab employee, he asked if the lab had any spare manuals it could loan to an inquisitive student. "They had some, but a lot of things weren't documented," Stallman recalls. "They were hackers after all." + +Stallman left with something even better than a manual: a job. Although he doesn't remember what the first project was, he does remember coming back to the AI Lab the next week, grabbing an open terminal and writing software code. + +Looking back, Stallman sees nothing unusual in the AI Lab's willingness to accept an unproven outsider at first glance. "That's the way it was back then," he says. "That's the way it still is now. I'll hire somebody when I meet him if I see he's good. Why wait? Stuffy people who insist on putting bureaucracy into everything really miss the point. If a person is good, he shouldn't have to go through a long, detailed hiring process; he should be sitting at a computer writing code." + +To get a taste of "bureaucratic and stuffy," Stallman need only visit the computer labs at Harvard. There, access to the terminals was doled out according to academic rank. As an undergrad, Stallman usually had to sign up or wait until midnight, about the time most professors and grad students finished their daily work assignments. The waiting wasn't difficult, but it was frustrating. Waiting for a public terminal, knowing all the while that a half dozen equally usable machines were sitting idle inside professors' locked offices, seemed the height of illogic. Although Stallman paid the occasional visit to the Harvard computer labs, he preferred the more egalitarian policies of the AI Lab. "It was a breath of fresh air," he says. "At the AI Lab, people seemed more concerned about work than status." + +Stallman quickly learned that the AI Lab's first-come, first-served policy owed much to the efforts of a vigilant few. Many were holdovers from the days of Project MAC, the Department of Defense-funded research program that had given birth to the first time-share operating systems. A few were already legends in the computing world. There was Richard Greenblatt, the lab's in-house Lisp expert and author of MacHack, the computer chess program that had once humbled A.I. critic Hubert Dreyfus. There was Gerald Sussman, original author of the robotic block-stacking program HACKER. And there was Bill Gosper, the in-house math whiz already in the midst of an 18-month hacking bender triggered by the philosophical implications of the computer game LIFE. 4 + +Members of the tight-knit group called themselves " hackers." Over time, they extended the "hacker" description to Stallman as well. In the process of doing so, they inculcated Stallman in the ethical traditions of the "hacker ethic ." To be a hacker meant more than just writing programs, Stallman learned. It meant writing the best possible programs. It meant sitting at a terminal for 36 hours straight if that's what it took to write the best possible programs. Most importantly, it meant having access to the best possible machines and the most useful information at all times. Hackers spoke openly about changing the world through software, and Stallman learned the instinctual hacker disdain for any obstacle that prevented a hacker from fulfilling this noble cause. Chief among these obstacles were poor software, academic bureaucracy, and selfish behavior. + +Stallman also learned the lore, stories of how hackers, when presented with an obstacle, had circumvented it in creative ways. Stallman learned about " lock hacking," the art of breaking into professors' offices to "liberate" sequestered terminals. Unlike their pampered Harvard counterparts, MIT faculty members knew better than to treat the AI Lab's terminal as private property. If a faculty member made the mistake of locking away a terminal for the night, hackers were quick to correct the error. Hackers were equally quick to send a message if the mistake repeated itself. "I was actually shown a cart with a heavy cylinder of metal on it that had been used to break down the door of one professor's office,"5 Stallman says. + +Such methods, while lacking in subtlety, served a purpose. Although professors and administrators outnumbered hackers two-to-one inside the AI Lab, the hacker ethic prevailed. Indeed, by the time of Stallman's arrival at the AI Lab, hackers and the AI Lab administration had coevolved into something of a symbiotic relationship. In exchange for fixing the machines and keeping the software up and running, hackers earned the right to work on favorite pet projects. Often, the pet projects revolved around improving the machines and software programs even further. Like teenage hot-rodders, most hackers viewed tinkering with machines as its own form of entertainment. + +Nowhere was this tinkering impulse better reflected than in the operating system that powered the lab's central PDP-6 mini-computer. Dubbed ITS, short for the Incompatible Time Sharing system, the operating system incorporated the hacking ethic into its very design. Hackers had built it as a protest to Project MAC's original operating system, the Compatible Time Sharing System, CTSS, and named it accordingly. At the time, hackers felt the CTSS design too restrictive, limiting programmers' power to modify and improve the program's own internal architecture if needed. According to one legend passed down by hackers, the decision to build ITS had political overtones as well. Unlike CTSS, which had been designed for the IBM 7094, ITS was built specifically for the PDP-6. In letting hackers write the systems themselves, AI Lab administrators guaranteed that only hackers would feel comfortable using the PDP-6. In the feudal world of academic research, the gambit worked. Although the PDP-6 was co-owned in conjunction with other departments, A.I. researchers soon had it to themselves.6 + +ITS boasted features most commercial operating systems wouldn't offer for years, features such as multitasking, debugging, and full-screen editing capability. Using it and the PDP-6 as a foundation, the Lab had been able to declare independence from Project MAC shortly before Stallman's arrival.6 + +As an apprentice hacker, Stallman quickly became enamored with ITS. Although forbidding to most newcomers, the program contained many built-in features that provided a lesson in software development to hacker apprentices such as himself. + +"ITS had a very elegant internal mechanism for one program to examine another," says Stallman, recalling the program. "You could examine all sorts of status about another program in a very clean, well-specified way." + +Using this feature, Stallman was able to watch how programs written by hackers processed instructions as they ran. Another favorite feature would allow the monitoring program to freeze the monitored program's job between instructions. In other operating systems, such a command would have resulted in half-computed gibberish or an automatic systems crash. In ITS, it provided yet another way to monitor the step-by-step performance. + +"If you said, `Stop the job,' it would always be stopped in user mode. It would be stopped between two user-mode instructions, and everything about the job would be consistent for that point," Stallman says. "If you said, `Resume the job,' it would continue properly. Not only that, but if you were to change the status of the job and then change it back, everything would be consistent. There was no hidden status anywhere." + +By the end of 1970, hacking at the AI Lab had become a regular part of Stallman's weekly schedule. From Monday to Thursday, Stallman devoted his waking hours to his Harvard classes. As soon as Friday afternoon arrived, however, he was on the T, heading down to MIT for the weekend. Stallman usually timed his arrival to coincide with the ritual food run. Joining five or six other hackers in their nightly quest for Chinese food, he would jump inside a beat-up car and head across the Harvard Bridge into nearby Boston. For the next two hours, he and his hacker colleagues would discuss everything from ITS to the internal logic of the Chinese language and pictograph system. Following dinner, the group would return to MIT and hack code until dawn. + +For the geeky outcast who rarely associated with his high-school peers, it was a heady experience, suddenly hanging out with people who shared the same predilection for computers, science fiction, and Chinese food. "I remember many sunrises seen from a car coming back from Chinatown," Stallman would recall nostalgically, 15 years after the fact in a speech at the Swedish Royal Technical Institute. "It was actually a very beautiful thing to see a sunrise, 'cause that's such a calm time of day. It's a wonderful time of day to get ready to go to bed. It's so nice to walk home with the light just brightening and the birds starting to chirp; you can get a real feeling of gentle satisfaction, of tranquility about the work that you have done that night."7 + +The more Stallman hung out with the hackers, the more he adopted the hacker worldview. Already committed to the notion of personal liberty, Stallman began to infuse his actions with a sense of communal responsibility. When others violated the communal code, Stallman was quick to speak out. Within a year of his first visit, Stallman was the one breaking into locked offices, trying to recover the sequestered terminals that belonged to the lab community as a whole. In true hacker fashion, Stallman also sought to make his own personal contribution to the art of lock hacking. One of the most artful door-opening tricks, commonly attributed to Greenblatt, involved bending a stiff wire into a cane and attaching a loop of tape to the long end. Sliding the wire under the door, a hacker could twist and rotate the wire so that the long end touched the door knob. Provided the adhesive on the tape held, a hacker could open the doorknob with a few sharp twists. + +When Stallman tried the trick, he found it good but wanting in a few places. Getting the tape to stick wasn't always easy, and twisting the wire in a way that turned the doorknob was similarly difficult. Stallman remembered that the hallway ceiling possessed tiles that could be slid away. Some hackers, in fact, had used the false ceiling as a way to get around locked doors, an approach that generally covered the perpetrator in fiberglass but got the job done. + +Stallman considered an alternative approach. What if, instead of slipping a wire under the door, a hacker slid away one of the panels and stood over the door jamb? + +Stallman took it upon himself to try it out. Instead of using a wire, Stallman draped out a long U-shaped loop of magnetic tape, fastening a loop of adhesive tape at the base of the U. Standing over the door jamb, he dangled the tape until it looped under the doorknob. Lifting the tape until the adhesive fastened, he then pulled on the left end of the tape, twisting the doorknob counter-clockwise. Sure enough, the door opened. Stallman had added a new twist to the art of lock hacking. + +"Sometimes you had to kick the door after you turned the door knob," says Stallman, recalling the lingering bugginess of the new method. "It took a little bit of balance to pull it off." + +Such activities reflected a growing willingness on Stallman's part to speak and act out in defense of political beliefs. The AI Lab's spirit of direct action had proved inspirational enough for Stallman to break out of the timid impotence of his teenage years. Breaking into an office to free a terminal wasn't the same as taking part in a protest march, but it was effective in ways that most protests weren't. It solved the problem at hand. + +By the time of his last years at Harvard, Stallman was beginning to apply the whimsical and irreverent lessons of the AI Lab back at school. + +"Did he tell you about the snake?" his mother asks at one point during an interview. "He and his dorm mates put a snake up for student election. Apparently it got a considerable number of votes." + +Stallman verifies the snake candidacy with a few caveats. The snake was a candidate for election within Currier House, Stallman's dorm, not the campus-wide student council. Stallman does remember the snake attracting a fairly significant number of votes, thanks in large part to the fact that both the snake and its owner both shared the same last name. "People may have voted for it, because they thought they were voting for the owner," Stallman says. "Campaign posters said that the snake was `slithering for' the office. We also said it was an `at large' candidate, since it had climbed into the wall through the ventilating unit a few weeks before and nobody knew where it was." + +Running a snake for dorm council was just one of several election-related pranks. In a later election, Stallman and his dorm mates nominated the house master's son. "His platform was mandatory retirement at age seven," Stallman recalls. Such pranks paled in comparison to the fake-candidate pranks on the MIT campus, however. One of the most successful fake-candidate pranks was a cat named Woodstock, which actually managed to outdraw most of the human candidates in a campus-wide election. "They never announced how many votes Woodstock got, and they treated those votes as spoiled ballots," Stallman recalls. "But the large number of spoiled ballots in that election suggested that Woodstock had actually won. A couple of years later, Woodstock was suspiciously run over by a car. Nobody knows if the driver was working for the MIT administration." Stallman says he had nothing to do with Woodstock's candidacy, "but I admired it."8 + +At the AI Lab, Stallman's political activities had a sharper-edged tone. During the 1970s, hackers faced the constant challenge of faculty members and administrators pulling an end-run around ITS and its hacker-friendly design. One of the first attempts came in the mid-1970s, as more and more faculty members began calling for a file security system to protect research data. Most other computer labs had installed such systems during late 1960s, but the AI Lab, through the insistence of Stallman and other hackers, remained a security-free zone. + +For Stallman, the opposition to security was both ethical and practical. On the ethical side, Stallman pointed out that the entire art of hacking relied on intellectual openness and trust. On the practical side, he pointed to the internal structure of ITS being built to foster this spirit of openness, and any attempt to reverse that design required a major overhaul. + +"The hackers who wrote the Incompatible Timesharing System decided that file protection was usually used by a self-styled system manager to get power over everyone else," Stallman would later explain. "They didn't want anyone to be able to get power over them that way, so they didn't implement that kind of a feature. The result was, that whenever something in the system was broken, you could always fix it."9 + +Through such vigilance, hackers managed to keep the AI Lab's machines security-free. Over at the nearby MIT Laboratory for Computer Sciences, however, security-minded faculty members won the day. The LCS installed its first password-based system in 1977. Once again, Stallman took it upon himself to correct what he saw as ethical laxity. Gaining access to the software code that controlled the password system, Stallman implanted a software command that sent out a message to any LCS user who attempted to choose a unique password. If a user entered "starfish," for example, the message came back something like: + + I see you chose the password "starfish." I suggest that you switch to the password "carriage return." It's much easier to type, and also it stands up to the principle that there should be no passwords.10 + +Users who did enter "carriage return"-that is, users who simply pressed the Enter or Return button, entering a blank string instead of a unique password-left their accounts accessible to the world at large. As scary as that might have been for some users, it reinforced the hacker notion that Institute computers, and even Institute computer files, belonged to the public, not private individuals. Stallman, speaking in an interview for the 1984 book Hackers, proudly noted that one-fifth of the LCS staff accepted this argument and employed the blank-string password.11 + +Stallman's null-string crusade would prove ultimately futile. By the early 1980s, even the AI Lab's machines were sporting password-based security systems. Even so, it represents a major milestone in terms of Stallman's personal and political maturation. To the objective observer familiar with Stallman's later career, it offers a convenient inflection point between the timid teenager afraid to speak out even on issues of life-threatening importance and the adult activist who would soon turn needling and cajoling into a full-time occupation. + +In voicing his opposition to computer security, Stallman drew on many of the forces that had shaped his early life: hunger for knowledge, distaste for authority, and frustration over hidden procedures and rules that rendered some people clueless outcasts. He would also draw on the ethical concepts that would shape his adult life: communal responsibility, trust, and the hacker spirit of direct action. Expressed in software-computing terms, the null string represents the 1.0 version of the Richard Stallman political worldview-incomplete in a few places but, for the most part, fully mature. + +Looking back, Stallman hesitates to impart too much significance to an event so early in his hacking career. "In that early stage there were a lot of people who shared my feelings," he says. "The large number of people who adopted the null string as their password was a sign that many people agreed that it was the proper thing to do. I was simply inclined to be an activist about it." + +Stallman does credit the AI Lab for awakening that activist spirit, however. As a teenager, Stallman had observed political events with little idea as to how a single individual could do or say anything of importance. As a young adult, Stallman was speaking out on matters in which he felt supremely confident, matters such as software design, communal responsibility, and individual freedom. "I joined this community which had a way of life which involved respecting each other's freedom," he says. "It didn't take me long to figure out that that was a good thing. It took me longer to come to the conclusion that this was a moral issue." + +Hacking at the AI Lab wasn't the only activity helping to boost Stallman's esteem. During the middle of his sophomore year at Harvard, Stallman had joined up with a dance troupe that specialized in folk dances . What began as a simple attempt to meet women and expand his social horizons soon expanded into yet another passion alongside hacking. Dancing in front of audiences dressed in the native garb of a Balkan peasant, Stallman no longer felt like the awkward, uncoordinated 10-year-old whose attempts to play football had ended in frustration. He felt confident, agile, and alive. For a brief moment, he even felt a hint of emotional connection. He soon found being in front of an audience fun, and it wasn't long thereafter that he began craving the performance side of dancing almost as much as the social side. + +Although the dancing and hacking did little to improve Stallman's social standing, they helped him overcome the feelings of weirdness that had clouded his pre-Harvard life. Instead of lamenting his weird nature, Stallman found ways to celebrate it. In 1977, while attending a science-fiction convention, he came across a woman selling custom-made buttons. Excited, Stallman ordered a button with the words "Impeach God" emblazoned on it. + +For Stallman, the "Impeach God" message worked on many levels. An atheist since early childhood, Stallman first saw it as an attempt to set a "second front" in the ongoing debate on religion. "Back then everybody was arguing about God being dead or alive," Stallman recalls. "`Impeach God' approached the subject of God from a completely different viewpoint. If God was so powerful as to create the world and yet do nothing to correct the problems in it, why would we ever want to worship such a God? Wouldn't it be better to put him on trial?" + +At the same time, "Impeach God" was a satirical take on America and the American political system. The Watergate scandal of the 1970s affected Stallman deeply. As a child, Stallman had grown up mistrusting authority. Now, as an adult, his mistrust had been solidified by the culture of the AI Lab hacker community. To the hackers, Watergate was merely a Shakespearean rendition of the daily power struggles that made life such a hassle for those without privilege. It was an outsized parable for what happened when people traded liberty and openness for security and convenience. + +Buoyed by growing confidence, Stallman wore the button proudly. People curious enough to ask him about it received the same well-prepared spiel. "My name is Jehovah," Stallman would say. "I have a special plan to save the universe, but because of heavenly security reasons I can't tell you what that plan is. You're just going to have to put your faith in me, because I see the picture and you don't. You know I'm good because I told you so. If you don't believe me, I'll throw you on my enemies list and throw you in a pit where Infernal Revenue Service will audit your taxes for eternity." + +Those who interpreted the spiel as a word-for-word parody of the Watergate hearings only got half the message. For Stallman, the other half of the message was something only his fellow hackers seemed to be hearing. One hundred years after Lord Acton warned about absolute power corrupting absolutely, Americans seemed to have forgotten the first part of Acton's truism: power, itself, corrupts. Rather than point out the numerous examples of petty corruption, Stallman felt content voicing his outrage toward an entire system that trusted power in the first place. + +"I figured why stop with the small fry," says Stallman, recalling the button and its message. "If we went after Nixon, why not going after Mr. Big. The way I see it, any being that has power and abuses it deserves to have that power taken away." + + +Chapter 5 +Small Puddle of Freedom +Ask anyone who's spent more than a minute in Richard Stallman's presence, and you'll get the same recollection: forget the long hair. Forget the quirky demeanor. The first thing you notice is the gaze. One look into Stallman's green eyes, and you know you're in the presence of a true believer. + +To call the Stallman gaze intense is an understatement. Stallman's eyes don't just look at you; they look through you. Even when your own eyes momentarily shift away out of simple primate politeness, Stallman's eyes remain locked-in, sizzling away at the side of your head like twin photon beams. + +Maybe that's why most writers, when describing Stallman, tend to go for the religious angle. In a 1998 Salon.com article titled "The Saint of Free Software," Andrew Leonard describes Stallman's green eyes as "radiating the power of an Old Testament prophet."1 A 1999 Wired magazine article describes the Stallman beard as "Rasputin-like,"2 while a London Guardian profile describes the Stallman smile as the smile of "a disciple seeing Jesus."3 + +Such analogies serve a purpose, but they ultimately fall short. That's because they fail to take into account the vulnerable side of the Stallman persona. Watch the Stallman gaze for an extended period of time, and you will begin to notice a subtle change. What appears at first to be an attempt to intimidate or hypnotize reveals itself upon second and third viewing as a frustrated attempt to build and maintain contact. If, as Stallman himself has suspected from time to time, his personality is the product of autism or Asperger Syndrome, his eyes certainly confirm the diagnosis. Even at their most high-beam level of intensity, they have a tendency to grow cloudy and distant, like the eyes of a wounded animal preparing to give up the ghost. + +My own first encounter with the legendary Stallman gaze dates back to the March, 1999, LinuxWorld Convention and Expo in San Jose, California. Billed as a "coming out party" for the Linux software community, the convention also stands out as the event that reintroduced Stallman to the technology media. Determined to push for his proper share of credit, Stallman used the event to instruct spectators and reporters alike on the history of the GNU Project and the project's overt political objectives. + +As a reporter sent to cover the event, I received my own Stallman tutorial during a press conference announcing the release of GNOME 1.0, a free software graphic user interface. Unwittingly, I push an entire bank of hot buttons when I throw out my very first question to Stallman himself: do you think GNOME's maturity will affect the commercial popularity of the Linux operating system? + +"I ask that you please stop calling the operating system Linux," Stallman responds, eyes immediately zeroing in on mine. "The Linux kernel is just a small part of the operating system. Many of the software programs that make up the operating system you call Linux were not developed by Linus Torvalds at all. They were created by GNU Project volunteers, putting in their own personal time so that users might have a free operating system like the one we have today. To not acknowledge the contribution of those programmers is both impolite and a misrepresentation of history. That's why I ask that when you refer to the operating system, please call it by its proper name, GNU/Linux." + +Taking the words down in my reporter's notebook, I notice an eerie silence in the crowded room. When I finally look up, I find Stallman's unblinking eyes waiting for me. Timidly, a second reporter throws out a question, making sure to use the term " GNU/Linux" instead of Linux. Miguel de Icaza, leader of the GNOME project, fields the question. It isn't until halfway through de Icaza's answer, however, that Stallman's eyes finally unlock from mine. As soon as they do, a mild shiver rolls down my back. When Stallman starts lecturing another reporter over a perceived error in diction, I feel a guilty tinge of relief. At least he isn't looking at me, I tell myself. + +For Stallman, such face-to-face moments would serve their purpose. By the end of the first LinuxWorld show, most reporters know better than to use the term "Linux" in his presence, and wired.com is running a story comparing Stallman to a pre-Stalinist revolutionary erased from the history books by hackers and entrepreneurs eager to downplay the GNU Project's overly political objectives.2 Other articles follow, and while few reporters call the operating system GNU/Linux in print, most are quick to credit Stallman for launching the drive to build a free software operating system 15 years before. + +I won't meet Stallman again for another 17 months. During the interim, Stallman will revisit Silicon Valley once more for the August, 1999 LinuxWorld show. Although not invited to speak, Stallman does managed to deliver the event's best line. Accepting the show's Linus Torvalds Award for Community Service-an award named after Linux creator Linus Torvalds-on behalf of the Free Software Foundation, Stallman wisecracks, "Giving the Linus Torvalds Award to the Free Software Foundation is a bit like giving the Han Solo Award to the Rebel Alliance." + +This time around, however, the comments fail to make much of a media dent. Midway through the week, Red Hat, Inc., a prominent GNU/Linux vendor, goes public. The news merely confirms what many reporters such as myself already suspect: "Linux" has become a Wall Street buzzword, much like "e-commerce" and "dot-com" before it. With the stock market approaching the Y2K rollover like a hyperbola approaching its vertical asymptote, all talk of free software or open source as a political phenomenon falls by the wayside. + +Maybe that's why, when LinuxWorld follows up its first two shows with a third LinuxWorld show in August, 2000, Stallman is conspicuously absent. + +My second encounter with Stallman and his trademark gaze comes shortly after that third LinuxWorld show. Hearing that Stallman is going to be in Silicon Valley, I set up a lunch interview in Palo Alto, California. The meeting place seems ironic, not only because of the recent no-show but also because of the overall backdrop. Outside of Redmond, Washington, few cities offer a more direct testament to the economic value of proprietary software. Curious to see how Stallman, a man who has spent the better part of his life railing against our culture's predilection toward greed and selfishness, is coping in a city where even garage-sized bungalows run in the half-million-dollar price range, I make the drive down from Oakland. + +I follow the directions Stallman has given me, until I reach the headquarters of Art.net, a nonprofit "virtual artists collective." Located in a hedge-shrouded house in the northern corner of the city, the Art.net headquarters are refreshingly run-down. Suddenly, the idea of Stallman lurking in the heart of Silicon Valley doesn't seem so strange after all. + +I find Stallman sitting in a darkened room, tapping away on his gray laptop computer. He looks up as soon as I enter the room, giving me a full blast of his 200-watt gaze. When he offers a soothing "Hello," I offer a return greeting. Before the words come out, however, his eyes have already shifted back to the laptop screen. + +"I'm just finishing an article on the spirit of hacking," Stallman says, fingers still tapping. "Take a look." + +I take a look. The room is dimly lit, and the text appears as greenish-white letters on a black background, a reversal of the color scheme used by most desktop word-processing programs, so it takes my eyes a moment to adjust. When they do, I find myself reading Stallman's account of a recent meal at a Korean restaurant. Before the meal, Stallman makes an interesting discovery: the person setting the table has left six chopsticks instead of the usual two in front of Stallman's place setting. Where most restaurant goers would have ignored the redundant pairs, Stallman takes it as challenge: find a way to use all six chopsticks at once. Like many software hacks, the successful solution is both clever and silly at the same time. Hence Stallman's decision to use it as an illustration. + +As I read the story, I feel Stallman watching me intently. I look over to notice a proud but child-like half smile on his face. When I praise the essay, my comment barely merits a raised eyebrow. + +"I'll be ready to go in a moment," he says. + +Stallman goes back to tapping away at his laptop. The laptop is gray and boxy, not like the sleek, modern laptops that seemed to be a programmer favorite at the recent LinuxWorld show. Above the keyboard rides a smaller, lighter keyboard, a testament to Stallman's aging hands. During the late 1980s, when Stallman was putting in 70- and 80-hour work weeks writing the first free software tools and programs for the GNU Project, the pain in Stallman's hands became so unbearable that he had to hire a typist. Today, Stallman relies on a keyboard whose keys require less pressure than a typical computer keyboard. + +Stallman has a tendency to block out all external stimuli while working. Watching his eyes lock onto the screen and his fingers dance, one quickly gets the sense of two old friends locked in deep conversation. + +The session ends with a few loud keystrokes and the slow disassembly of the laptop. + +"Ready for lunch?" Stallman asks. + +We walk to my car. Pleading a sore ankle, Stallman limps along slowly. Stallman blames the injury on a tendon in his left foot. The injury is three years old and has gotten so bad that Stallman, a huge fan of folk dancing, has been forced to give up all dancing activities. "I love folk dancing inherently," Stallman laments. "Not being able to dance has been a tragedy for me." + +Stallman's body bears witness to the tragedy. Lack of exercise has left Stallman with swollen cheeks and a pot belly that was much less visible the year before. You can tell the weight gain has been dramatic, because when Stallman walks, he arches his back like a pregnant woman trying to accommodate an unfamiliar load. + +The walk is further slowed by Stallman's willingness to stop and smell the roses, literally. Spotting a particularly beautiful blossom, he tickles the innermost petals with his prodigious nose, takes a deep sniff and steps back with a contented sigh. + +"Mmm, rhinophytophilia,"4 he says, rubbing his back. + +The drive to the restaurant takes less than three minutes. Upon recommendation from Tim Ney, former executive director of the Free Software Foundation, I have let Stallman choose the restaurant. While some reporters zero in on Stallman's monk-like lifestyle, the truth is, Stallman is a committed epicure when it comes to food. One of the fringe benefits of being a traveling missionary for the free software cause is the ability to sample delicious food from around the world. "Visit almost any major city in the world, and chances are Richard knows the best restaurant in town," says Ney. "Richard also takes great pride in knowing what's on the menu and ordering for the entire table." + +For today's meal, Stallman has chosen a Cantonese-style dim sum restaurant two blocks off University Avenue, Palo Alto's main drag. The choice is partially inspired by Stallman's recent visit to China, including a lecture stop in Guangdong province, in addition to Stallman's personal aversion to spicier Hunanese and Szechuan cuisine. "I'm not a big fan of spicy," Stallman admits. + +We arrive a few minutes after 11 a.m. and find ourselves already subject to a 20-minute wait. Given the hacker aversion to lost time, I hold my breath momentarily, fearing an outburst. Stallman, contrary to expectations, takes the news in stride. + +"It's too bad we couldn't have found somebody else to join us," he tells me. "It's always more fun to eat with a group of people." + +During the wait, Stallman practices a few dance steps. His moves are tentative but skilled. We discuss current events. Stallman says his only regret about not attending LinuxWorld was missing out on a press conference announcing the launch of the GNOME Foundation. Backed by Sun Microsystems and IBM, the foundation is in many ways a vindication for Stallman, who has long championed that free software and free-market economics need not be mutually exclusive. Nevertheless, Stallman remains dissatisfied by the message that came out. + +"The way it was presented, the companies were talking about Linux with no mention of the GNU Project at all," Stallman says. + +Such disappointments merely contrast the warm response coming from overseas, especially Asia, Stallman notes. A quick glance at the Stallman 2000 travel itinerary bespeaks the growing popularity of the free software message. Between recent visits to India, China, and Brazil, Stallman has spent 12 of the last 115 days on United States soil. His travels have given him an opportunity to see how the free software concept translates into different languages of cultures. + +"In India many people are interested in free software, because they see it as a way to build their computing infrastructure without spending a lot of money," Stallman says. "In China, the concept has been much slower to catch on. Comparing free software to free speech is harder to do when you don't have any free speech. Still, the level of interest in free software during my last visit was profound." + +The conversation shifts to Napster, the San Mateo, California software company, which has become something of a media cause cČlËbre in recent months. The company markets a controversial software tool that lets music fans browse and copy the music files of other music fans. Thanks to the magnifying powers of the Internet, this so-called "peer-to-peer" program has evolved into a de facto online juke box, giving ordinary music fans a way to listen to MP3 music files over the computer without paying a royalty or fee, much to record companies' chagrin. + +Although based on proprietary software, the Napster system draws inspiration from the long-held Stallman contention that once a work enters the digital realm-in other words, once making a copy is less a matter of duplicating sounds or duplicating atoms and more a matter of duplicating information-the natural human impulse to share a work becomes harder to restrict. Rather than impose additional restrictions, Napster execs have decided to take advantage of the impulse. Giving music listeners a central place to trade music files, the company has gambled on its ability to steer the resulting user traffic toward other commercial opportunities. + +The sudden success of the Napster model has put the fear in traditional record companies, with good reason. Just days before my Palo Alto meeting with Stallman, U.S. District Court Judge Marilyn Patel granted a request filed by the Recording Industry Association of America for an injunction against the file-sharing service. The injunction was subsequently suspended by the U.S. Ninth District Court of Appeals, but by early 2001, the Court of Appeals, too, would find the San Mateo-based company in breach of copyright law,5 a decision RIAA spokesperson Hillary Rosen would later proclaim proclaim a "clear victory for the creative content community and the legitimate online marketplace."6 + +For hackers such as Stallman, the Napster business model is scary in different ways. The company's eagerness to appropriate time-worn hacker principles such as file sharing and communal information ownership, while at the same time selling a service based on proprietary software, sends a distressing mixed message. As a person who already has a hard enough time getting his own carefully articulated message into the media stream, Stallman is understandably reticent when it comes to speaking out about the company. Still, Stallman does admit to learning a thing or two from the social side of the Napster phenomenon. + +"Before Napster, I thought it might be OK for people to privately redistribute works of entertainment," Stallman says. "The number of people who find Napster useful, however, tells me that the right to redistribute copies not only on a neighbor-to-neighbor basis, but to the public at large, is essential and therefore may not be taken away." + +No sooner does Stallman say this than the door to the restaurant swings open and we are invited back inside by the host. Within a few seconds, we are seated in a side corner of the restaurant next to a large mirrored wall. + +The restaurant's menu doubles as an order form, and Stallman is quickly checking off boxes before the host has even brought water to the table. "Deep-fried shrimp roll wrapped in bean-curd skin," Stallman reads. "Bean-curd skin. It offers such an interesting texture. I think we should get it." + +This comment leads to an impromptu discussion of Chinese food and Stallman's recent visit to China. "The food in China is utterly exquisite," Stallman says, his voice gaining an edge of emotion for the first time this morning. "So many different things that I've never seen in the U.S., local things made from local mushrooms and local vegetables. It got to the point where I started keeping a journal just to keep track of every wonderful meal." + +The conversation segues into a discussion of Korean cuisine. During the same June, 2000, Asian tour, Stallman paid a visit to South Korea. His arrival ignited a mini-firestorm in the local media thanks to a Korean software conference attended by Microsoft founder and chairman Bill Gates that same week. Next to getting his photo above Gates's photo on the front page of the top Seoul newspaper, Stallman says the best thing about the trip was the food. "I had a bowl of naeng myun, which is cold noodles," says Stallman. "These were a very interesting feeling noodle. Most places don't use quite the same kind of noodles for your naeng myun, so I can say with complete certainty that this was the most exquisite naeng myun I ever had." + +The term "exquisite" is high praise coming from Stallman. I know this, because a few moments after listening to Stallman rhapsodize about naeng myun, I feel his laser-beam eyes singeing the top of my right shoulder. + +"There is the most exquisite woman sitting just behind you," Stallman says. + +I turn to look, catching a glimpse of a woman's back. The woman is young, somewhere in her mid-20s, and is wearing a white sequinned dress. She and her male lunch companion are in the final stages of paying the check. When both get up from the table to leave the restaurant, I can tell without looking, because Stallman's eyes suddenly dim in intensity. + +"Oh, no," he says. "They're gone. And to think, I'll probably never even get to see her again." + +After a brief sigh, Stallman recovers. The moment gives me a chance to discuss Stallman's reputation vis-ý-vis the fairer sex. The reputation is a bit contradictory at times. A number of hackers report Stallman's predilection for greeting females with a kiss on the back of the hand.7 A May 26, 2000 Salon.com article, meanwhile, portrays Stallman as a bit of a hacker lothario. Documenting the free software-free love connection, reporter Annalee Newitz presents Stallman as rejecting traditional family values, telling her, "I believe in love, but not monogamy." 8 + +Stallman lets his menu drop a little when I bring this up. "Well, most men seem to want sex and seem to have a rather contemptuous attitude towards women," he says. "Even women they're involved with. I can't understand it at all." + +I mention a passage from the 1999 book Open Sources in which Stallman confesses to wanting to name the ill-fated GNU kernel after a girlfriend at the time. The girlfriend's name was Alix, a name that fit perfectly with the Unix developer convention of putting an "x" at the end of any new kernel name-e.g., "Linux." Because the woman was a Unix system administrator, Stallman says it would have been an even more touching tribute. Unfortunately, Stallman notes, the kernel project's eventual main developer renamed the kernel HURD. 9 Although Stallman and the girlfriend later broke up, the story triggers an automatic question: for all the media imagery depicting him as a wild-eyed fanatic, is Richard Stallman really just a hopeless romantic, a wandering Quixote tilting at corporate windmills in an effort to impress some as-yet-unidentified Dulcinea? + +"I wasn't really trying to be romantic," Stallman says, recalling the Alix story. "It was more of a teasing thing. I mean, it was romantic, but it was also teasing, you know? It would have been a delightful surprise." + +For the first time all morning, Stallman smiles. I bring up the hand kissing. "Yes, I do do that," Stallman says. "I've found it's a way of offering some affection that a lot of women will enjoy. It's a chance to give some affection and to be appreciated for it." + +Affection is a thread that runs clear through Richard Stallman's life, and he is painfully candid about it when questions arise. "There really hasn't been much affection in my life, except in my mind," he says. Still, the discussion quickly grows awkward. After a few one-word replies, Stallman finally lifts up his menu, cutting off the inquiry. + +"Would you like some shimai?" he asks. + +When the food comes out, the conversation slaloms between the arriving courses. We discuss the oft-noted hacker affection for Chinese food, the weekly dinner runs into Boston's Chinatown district during Stallman's days as a staff programmer at the AI Lab, and the underlying logic of the Chinese language and its associated writing system. Each thrust on my part elicits a well-informed parry on Stallman's part. + +"I heard some people speaking Shanghainese the last time I was in China," Stallman says. "It was interesting to hear. It sounded quite different [from Mandarin]. I had them tell me some cognate words in Mandarin and Shanghainese. In some cases you can see the resemblance, but one question I was wondering about was whether tones would be similar. They're not. That's interesting to me, because there's a theory that the tones evolved from additional syllables that got lost and replaced. Their effect survives in the tone. If that's true, and I've seen claims that that happened within historic times, the dialects must have diverged before the loss of these final syllables." + +The first dish, a plate of pan-fried turnip cakes, has arrived. Both Stallman and I take a moment to carve up the large rectangular cakes, which smell like boiled cabbage but taste like potato latkes fried in bacon. + +I decide to bring up the outcast issue again, wondering if Stallman's teenage years conditioned him to take unpopular stands, most notably his uphill battle since 1994 to get computer users and the media to replace the popular term "Linux" with "GNU/Linux." + +"I believe it did help me," Stallman says, chewing on a dumpling. "I have never understood what peer pressure does to other people. I think the reason is that I was so hopelessly rejected that for me, there wasn't anything to gain by trying to follow any of the fads. It wouldn't have made any difference. I'd still be just as rejected, so I didn't try." + +Stallman points to his taste in music as a key example of his contrarian tendencies. As a teenager, when most of his high school classmates were listening to Motown and acid rock, Stallman preferred classical music. The memory leads to a rare humorous episode from Stallman's middle-school years. Following the Beatles' 1964 appearance on the Ed Sullivan Show, most of Stallman's classmates rushed out to purchase the latest Beatles albums and singles. Right then and there, Stallman says, he made a decision to boycott the Fab Four. + +"I liked some of the pre-Beatles popular music," Stallman says. "But I didn't like the Beatles. I especially disliked the wild way people reacted to them. It was like: who was going to have a Beatles assembly to adulate the Beatles the most?" + +When his Beatles boycott failed to take hold, Stallman looked for other ways to point out the herd-mentality of his peers. Stallman says he briefly considered putting together a rock band himself dedicated to satirizing the Liverpool group. + +"I wanted to call it Tokyo Rose and the Japanese Beetles." + +Given his current love for international folk music, I ask Stallman if he had a similar affinity for Bob Dylan and the other folk musicians of the early 1960s. Stallman shakes his head. "I did like Peter, Paul and Mary," he says. "That reminds me of a great filk." + +When I ask for a definition of "filk," Stallman explains the concept. A filk, he says, is a popular song whose lyrics have been replaced with parody lyrics. The process of writing a filk is called filking, and it is a popular activity among hackers and science-fiction aficionados. Classic filks include "On Top of Spaghetti," a rewrite of "On Top of Old Smokey," and "Yoda," filk-master "Weird" Al Yankovic's Star Wars-oriented rendition of the Kinks tune, "Lola." + +Stallman asks me if I would be interested in hearing the folk filk. As soon as I say yes, Stallman's voice begins singing in an unexpectedly clear tone: + + How much wood could a woodchuck chuck,If a woodchuck could chuck wood?How many poles could a polak lock,If a polak could lock poles?How many knees could a negro grow,If a negro could grow knees?The answer, my dear, is stick it in your ear.The answer is to stick it in your ear. + +The singing ends, and Stallman's lips curl into another child-like half smile. I glance around at the nearby tables. The Asian families enjoying their Sunday lunch pay little attention to the bearded alto in their midst.10 After a few moments of hesitation, I finally smile too. + +"Do you want that last cornball?" Stallman asks, eyes twinkling. Before I can screw up the punch line, Stallman grabs the corn-encrusted dumpling with his two chopsticks and lifts it proudly. "Maybe I'm the one who should get the cornball," he says. + +The food gone, our conversation assumes the dynamics of a normal interview. Stallman reclines in his chair and cradles a cup of tea in his hands. We resume talking about Napster and its relation to the free software movement. Should the principles of free software be extended to similar arenas such as music publishing? I ask. + +"It's a mistake to transfer answers from one thing to another," says Stallman, contrasting songs with software programs. "The right approach is to look at each type of work and see what conclusion you get." + +When it comes to copyrighted works, Stallman says he divides the world into three categories. The first category involves "functional" works-e.g., software programs, dictionaries, and textbooks. The second category involves works that might best be described as "testimonial"-e.g., scientific papers and historical documents. Such works serve a purpose that would be undermined if subsequent readers or authors were free to modify the work at will. The final category involves works of personal expression-e.g., diaries, journals, and autobiographies. To modify such documents would be to alter a person's recollections or point of view-action Stallman considers ethically unjustifiable. + +Of the three categories, the first should give users the unlimited right to make modified versions, while the second and third should regulate that right according to the will of the original author. Regardless of category, however, the freedom to copy and redistribute noncommercially should remain unabridged at all times, Stallman insists. If that means giving Internet users the right to generate a hundred copies of an article, image, song, or book and then email the copies to a hundred strangers, so be it. "It's clear that private occasional redistribution must be permitted, because only a police state can stop that," Stallman says. "It's antisocial to come between people and their friends. Napster has convinced me that we also need to permit, must permit, even noncommercial redistribution to the public for the fun of it. Because so many people want to do that and find it so useful." + +When I ask whether the courts would accept such a permissive outlook, Stallman cuts me off. + +"That's the wrong question," he says. "I mean now you've changed the subject entirely from one of ethics to one of interpreting laws. And those are two totally different questions in the same field. It's useless to jump from one to the other. How the courts would interpret the existing laws is mainly in a harsh way, because that's the way these laws have been bought by publishers." + +The comment provides an insight into Stallman's political philosophy: just because the legal system currently backs up businesses' ability to treat copyright as the software equivalent of land title doesn't mean computer users have to play the game according to those rules. Freedom is an ethical issue, not a legal issue. "I'm looking beyond what the existing laws are to what they should be," Stallman says. "I'm not trying to draft legislation. I'm thinking about what should the law do? I consider the law prohibiting the sharing of copies with your friend the moral equivalent of Jim Crow. It does not deserve respect." + +The invocation of Jim Crow prompts another question. How much influence or inspiration does Stallman draw from past political leaders? Like the civil-rights movement of the 1950s and 1960s, his attempt to drive social change is based on an appeal to timeless values: freedom, justice, and fair play. + +Stallman divides his attention between my analogy and a particularly tangled strand of hair. When I stretch the analogy to the point where I'm comparing Stallman with Dr. Martin Luther King, Jr., Stallman, after breaking off a split end and popping it into his mouth, cuts me off. + +"I'm not in his league, but I do play the same game," he says, chewing. + +I suggest Malcolm X as another point of comparison. Like the former Nation of Islam spokesperson, Stallman has built up a reputation for courting controversy, alienating potential allies, and preaching a message favoring self-sufficiency over cultural integration. + +Chewing on another split end, Stallman rejects the comparison. "My message is closer to King's message," he says. "It's a universal message. It's a message of firm condemnation of certain practices that mistreat others. It's not a message of hatred for anyone. And it's not aimed at a narrow group of people. I invite anyone to value freedom and to have freedom." + +Even so, a suspicious attitude toward political alliances remains a fundamental Stallman character trait. In the case of his well-publicized distaste for the term "open source," the unwillingness to participate in recent coalition-building projects seems understandable. As a man who has spent the last two decades stumping on the behalf of free software, Stallman's political capital is deeply invested in the term. Still, comments such as the "Han Solo" wisecrack at the 1999 LinuxWorld have only reinforced the Stallman's reputation in the software industry as a disgrunted mossback unwilling to roll with political or marketing trends. + +"I admire and respect Richard for all the work he's done," says Red Hat president Robert Young, summing up Stallman's paradoxical political nature. "My only critique is that sometimes Richard treats his friends worse than his enemies." + +Stallman's unwillingness to seek alliances seems equally perplexing when you consider his political interests outside of the free software movement. Visit Stallman's offices at MIT, and you instantly find a clearinghouse of left-leaning news articles covering civil-rights abuses around the globe. Visit his web site, and you'll find diatribes on the Digital Millennium Copyright Act, the War on Drugs, and the World Trade Organization. + +Given his activist tendencies, I ask, why hasn't Stallman sought a larger voice? Why hasn't he used his visibility in the hacker world as a platform to boost rather than reduce his political voice. + +Stallman lets his tangled hair drop and contemplates the question for a moment. + +"I hesitate to exaggerate the importance of this little puddle of freedom," he says. "Because the more well-known and conventional areas of working for freedom and a better society are tremendously important. I wouldn't say that free software is as important as they are. It's the responsibility I undertook, because it dropped in my lap and I saw a way I could do something about it. But, for example, to end police brutality, to end the war on drugs, to end the kinds of racism we still have, to help everyone have a comfortable life, to protect the rights of people who do abortions, to protect us from theocracy, these are tremendously important issues, far more important than what I do. I just wish I knew how to do something about them." + +Once again, Stallman presents his political activity as a function of personal confidence. Given the amount of time it has taken him to develop and hone the free software movement's core tenets, Stallman is hesitant to jump aboard any issues or trends that might transport him into uncharted territory. + +"I wish I knew I how to make a major difference on those bigger issues, because I would be tremendously proud if I could, but they're very hard and lots of people who are probably better than I am have been working on them and have gotten only so far," he says. "But as I see it, while other people were defending against these big visible threats, I saw another threat that was unguarded. And so I went to defend against that threat. It may not be as big a threat, but I was the only one there." + +Chewing a final split end, Stallman suggests paying the check. Before the waiter can take it away, however, Stallman pulls out a white-colored dollar bill and throws it on the pile. The bill looks so clearly counterfeit, I can't help but pick it up and read it. Sure enough, it is counterfeit. Instead of bearing the image of a George Washington or Abe Lincoln, the bill's front side bears the image of a cartoon pig. Instead of the United States of America, the banner above the pig reads "United Swines of Avarice." The bill is for zero dollars, and when the waiter picks up the money, Stallman makes sure to tug on his sleeve. + +"I added an extra zero to your tip," Stallman says, yet another half smile creeping across his lips. + +The waiter, uncomprehending or fooled by the look of the bill, smiles and scurries away. + +"I think that means we're free to go," Stallman says. + + +Chapter 6 +The Emacs Commune +The AI Lab of the 1970s was by all accounts a special place. Cutting-edge projects and top-flight researchers gave it an esteemed position in the world of computer science. The internal hacker culture and its anarchic policies lent a rebellious mystique as well. Only later, when many of the lab's scientists and software superstars had departed, would hackers fully realize the unique and ephemeral world they had once inhabited. + +"It was a bit like the Garden of Eden," says Stallman, summing up the lab and its software-sharing ethos in a 1998 Forbes article. "It hadn't occurred to us not to cooperate."1 + +Such mythological descriptions, while extreme, underline an important fact. The ninth floor of 545 Tech Square was more than a workplace for many. For hackers such as Stallman, it was home. + +The word "home" is a weighted term in the Stallman lexicon. In a pointed swipe at his parents, Stallman, to this day, refuses to acknowledge any home before Currier House, the dorm he lived in during his days at Harvard. He has also been known to describe leaving that home in tragicomic terms. Once, while describing his years at Harvard, Stallman said his only regret was getting kicked out. It wasn't until I asked Stallman what precipitated his ouster, that I realized I had walked into a classic Stallman setup line. + +"At Harvard they have this policy where if you pass too many classes they ask you to leave," Stallman says. + +With no dorm and no desire to return to New York, Stallman followed a path blazed by Greenblatt, Gosper, Sussman, and the many other hackers before him. Enrolling at MIT as a grad student, Stallman rented an apartment in nearby Cambridge but soon viewed the AI Lab itself as his de facto home. In a 1986 speech, Stallman recalled his memories of the AI Lab during this period: + + I may have done a little bit more living at the lab than most people, because every year or two for some reason or other I'd have no apartment and I would spend a few months living at the lab. And I've always found it very comfortable, as well as nice and cool in the summer. But it was not at all uncommon to find people falling asleep at the lab, again because of their enthusiasm; you stay up as long as you possibly can hacking, because you just don't want to stop. And then when you're completely exhausted, you climb over to the nearest soft horizontal surface. A very informal atmosphere.2 + +The lab's home-like atmosphere could be a problem at times. What some saw as a dorm, others viewed as an electronic opium den. In the 1976 book Computer Power and Human Reason, MIT researcher Joseph Weizenbaum offered a withering critique of the " computer bum," Weizenbaum's term for the hackers who populated computer rooms such as the AI Lab. "Their rumpled clothes, their unwashed hair and unshaved faces, and their uncombed hair all testify that they are oblivious to their bodies and to the world in which they move," Weizenbaum wrote. "[Computer bums] exist, at least when so engaged, only through and for the computers."3 + +Almost a quarter century after its publication, Stallman still bristles when hearing Weizenbaum's "computer bum" description, discussing it in the present tense as if Weizenbaum himself was still in the room. "He wants people to be just professionals, doing it for the money and wanting to get away from it and forget about it as soon as possible," Stallman says. "What he sees as a normal state of affairs, I see as a tragedy." + +Hacker life, however, was not without tragedy. Stallman characterizes his transition from weekend hacker to full-time AI Lab denizen as a series of painful misfortunes that could only be eased through the euphoria of hacking. As Stallman himself has said, the first misfortune was his graduation from Harvard. Eager to continue his studies in physics, Stallman enrolled as a graduate student at MIT. The choice of schools was a natural one. Not only did it give Stallman the chance to follow the footsteps of great MIT alumni: William Shockley ('36), Richard P. Feynman ('39), and Murray Gell-Mann ('51), it also put him two miles closer to the AI Lab and its new PDP-10 computer. "My attention was going toward programming, but I still thought, well, maybe I can do both," Stallman says. + +Toiling in the fields of graduate-level science by day and programming in the monastic confines of the AI Lab by night, Stallman tried to achieve a perfect balance. The fulcrum of this geek teeter-totter was his weekly outing with the folk-dance troupe, his one social outlet that guaranteed at least a modicum of interaction with the opposite sex. Near the end of that first year at MIT, however, disaster struck. A knee injury forced Stallman to drop out of the troupe. At first, Stallman viewed the injury as a temporary problem, devoting the spare time he would have spent dancing to working at the AI Lab even more. By the end of the summer, when the knee still ached and classes reconvened, Stallman began to worry. "My knee wasn't getting any better," Stallman recalls, "which meant I had to stop dancing completely. I was heartbroken." + +With no dorm and no dancing, Stallman's social universe imploded. Like an astronaut experiencing the aftereffects of zero-gravity, Stallman found that his ability to interact with nonhackers, especially female nonhackers, had atrophied significantly. After 16 weeks in the AI Lab, the self confidence he'd been quietly accumulating during his 4 years at Harvard was virtually gone. + +"I felt basically that I'd lost all my energy," Stallman recalls. "I'd lost my energy to do anything but what was most immediately tempting. The energy to do something else was gone. I was in total despair." + +Stallman retreated from the world even further, focusing entirely on his work at the AI Lab. By October, 1975, he dropped out of MIT, never to go back. Software hacking, once a hobby, had become his calling. + +Looking back on that period, Stallman sees the transition from full-time student to full-time hacker as inevitable. Sooner or later, he believes, the siren's call of computer hacking would have overpowered his interest in other professional pursuits. "With physics and math, I could never figure out a way to contribute," says Stallman, recalling his struggles prior to the knee injury. "I would have been proud to advance either one of those fields, but I could never see a way to do that. I didn't know where to start. With software, I saw right away how to write things that would run and be useful. The pleasure of that knowledge led me to want to do it more." + +Stallman wasn't the first to equate hacking with pleasure. Many of the hackers who staffed the AI Lab boasted similar, incomplete academic rČsumČs. Most had come in pursuing degrees in math or electrical engineering only to surrender their academic careers and professional ambitions to the sheer exhilaration that came with solving problems never before addressed. Like St. Thomas Aquinas, the scholastic known for working so long on his theological summae that he sometimes achieved spiritual visions, hackers reached transcendent internal states through sheer mental focus and physical exhaustion. Although Stallman shunned drugs, like most hackers, he enjoyed the "high" that came near the end of a 20-hour coding bender. + +Perhaps the most enjoyable emotion, however, was the sense of personal fulfillment. When it came to hacking, Stallman was a natural. A childhood's worth of late-night study sessions gave him the ability to work long hours with little sleep. As a social outcast since age 10, he had little difficulty working alone. And as a mathematician with built-in gift for logic and foresight, Stallman possessed the ability to circumvent design barriers that left most hackers spinning their wheels. + +"He was special," recalls Gerald Sussman, an MIT faculty member and former AI Lab researcher. Describing Stallman as a "clear thinker and a clear designer," Sussman employed Stallman as a research-project assistant beginning in 1975. The project was complex, involving the creation of an AI program that could analyze circuit diagrams. Not only did it involve an expert's command of Lisp, a programming language built specifically for AI applications, but it also required an understanding of how a human might approach the same task. + +When he wasn't working on official projects such as Sussman's automated circuit-analysis program, Stallman devoted his time to pet projects. It was in a hacker's best interest to improve the lab's software infrastructure, and one of Stallman's biggest pet projects during this period was the lab's editor program TECO. + +The story of Stallman's work on TECO during the 1970s is inextricably linked with Stallman's later leadership of the free software movement. It is also a significant stage in the history of computer evolution, so much so that a brief recapitulation of that evolution is necessary. During the 1950s and 1960s, when computers were first appearing at universities, computer programming was an incredibly abstract pursuit. To communicate with the machine, programmers created a series of punch cards, with each card representing an individual software command. Programmers would then hand the cards over to a central system administrator who would then insert them, one by one, into the machine, waiting for the machine to spit out a new set of punch cards, which the programmer would then decipher as output. This process, known as " batch processing," was cumbersome and time consuming. It was also prone to abuses of authority. One of the motivating factors behind hackers' inbred aversion to centralization was the power held by early system operators in dictating which jobs held top priority. + +In 1962, computer scientists and hackers involved in MIT's Project MAC, an early forerunner of the AI Lab, took steps to alleviate this frustration. Time-sharing, originally known as "time stealing," made it possible for multiple programs to take advantage of a machine's operational capabilities. Teletype interfaces also made it possible to communicate with a machine not through a series of punched holes but through actual text. A programmer typed in commands and read the line-by-line output generated by the machine. + +During the late 1960s, interface design made additional leaps. In a famous 1968 lecture, Doug Engelbart, a scientist then working at the Stanford Research Institute, unveiled a prototype of the modern graphical interface. Rigging up a television set to the computer and adding a pointer device which Engelbart dubbed a " mouse," the scientist created a system even more interactive than the time-sharing system developed a MIT. Treating the video display like a high-speed printer, Engelbart's system gave a user the ability to move the cursor around the screen and see the cursor position updated by the computer in real time. The user suddenly had the ability to position text anywhere on the screen. + +Such innovations would take another two decades to make their way into the commercial marketplace. Still, by the 1970s, video screens had started to replace teletypes as display terminals, creating the potential for full-screen-as opposed to line-by-line-editing capabilities. + +One of the first programs to take advantage of this full-screen capability was the MIT AI Lab's TECO. Short for Text Editor and COrrector, the program had been upgraded by hackers from an old teletype line editor for the lab's PDP-6 machine.4 + +TECO was a substantial improvement over old editors, but it still had its drawbacks. To create and edit a document, a programmer had to enter a series of software commands specifying each edit. It was an abstract process. Unlike modern word processors, which update text with each keystroke, TECO demanded that the user enter an extended series of editing instructions followed by an "end of command" sequence just to change the text.Over time, a hacker grew proficient enough to write entire documents in edit mode, but as Stallman himself would later point out, the process required "a mental skill like that of blindfold chess."5 + +To facilitate the process, AI Lab hackers had built a system that displayed both the "source" and "display" modes on a split screen. Despite this innovative hack, switching from mode to mode was still a nuisance. + +TECO wasn't the only full-screen editor floating around the computer world at this time. During a visit to the Stanford Artificial Intelligence Lab in 1976, Stallman encountered an edit program named E. The program contained an internal feature, which allowed a user to update display text after each command keystroke. In the language of 1970s programming, E was one of the first rudimentary WYSIWYG editors. Short for "what you see is what you get," WYSIWYG meant that a user could manipulate the file by moving through the displayed text, as opposed to working through a back-end editor program."6 + +Impressed by the hack, Stallman looked for ways to expand TECO's functionality in similar fashion upon his return to MIT. He found a TECO feature called Control-R, written by Carl Mikkelson and named after the two-key combination that triggered it. Mikkelson's hack switched TECO from its usual abstract command-execution mode to a more intuitive keystroke-by-keystroke mode. Stallman revised the feature in a subtle but significant way. He made it possible to trigger other TECO command strings, or " macros," using other, two-key combinations. Where users had once entered command strings and discarded them after entering then, Stallman's hack made it possible to save macro tricks on file and call them up at will. Mikkelson's hack had raised TECO to the level of a WYSIWYG editor. Stallman's hack had raised it to the level of a user-programmable WYSIWYG editor. "That was the real breakthrough," says Guy Steele, a fellow AI Lab hacker at the time.6 + +By Stallman's own recollection, the macro hack touched off an explosion of further innovation. "Everybody and his brother was writing his own collection of redefined screen-editor commands, a command for everything he typically liked to do," Stallman would later recall. "People would pass them around and improve them, making them more powerful and more general. The collections of redefinitions gradually became system programs in their own right."6 + +So many people found the macro innovations useful and had incorporated it into their own TECO programs that the TECO editor had become secondary to the macro mania it inspired. "We started to categorize it mentally as a programming language rather than as an editor," Stallman says. Users were experiencing their own pleasure tweaking the software and trading new ideas.6 + +Two years after the explosion, the rate of innovation began to exhibit dangerous side effects. The explosive growth had provided an exciting validation of the collaborative hacker approach, but it had also led to over-complexity. "We had a Tower of Babel effect," says Guy Steele. + +The effect threatened to kill the spirit that had created it, Steele says. Hackers had designed ITS to facilitate programmers' ability to share knowledge and improve each other's work. That meant being able to sit down at another programmer's desk, open up a programmer's work and make comments and modifications directly within the software. "Sometimes the easiest way to show somebody how to program or debug something was simply to sit down at the terminal and do it for them," explains Steele. + +The macro feature, after its second year, began to foil this capability. In their eagerness to embrace the new full-screen capabilities, hackers had customized their versions of TECO to the point where a hacker sitting down at another hacker's terminal usually had to spend the first hour just figuring out what macro commands did what. + +Frustrated, Steele took it upon himself to the solve the problem. He gathered together the four different macro packages and began assembling a chart documenting the most useful macro commands. In the course of implementing the design specified by the chart, Steele says he attracted Stallman's attention. + +"He started looking over my shoulder, asking me what I was doing," recalls Steele. + +For Steele, a soft-spoken hacker who interacted with Stallman infrequently, the memory still sticks out. Looking over another hacker's shoulder while he worked was a common activity at the AI Lab. Stallman, the TECO maintainer at the lab, deemed Steele's work "interesting" and quickly set off to complete it. + +"As I like to say, I did the first 0.001 percent of the implementation, and Stallman did the rest," says Steele with a laugh. + +The project's new name, Emacs, came courtesy of Stallman. Short for "editing macros," it signified the evolutionary transcendence that had taken place during the macros explosion two years before. It also took advantage of a gap in the software programming lexicon. Noting a lack of programs on ITS starting with the letter "E," Stallman chose Emacs, making it possible to reference the program with a single letter. Once again, the hacker lust for efficiency had left its mark.6 + +In the course of developing a standard system of macro commands, Stallman and Steele had to traverse a political tightrope. In creating a standard program, Stallman was in clear violation of the fundamental hacker tenet-"promote decentralization." He was also threatening to hobble the very flexibility that had fueled TECO's explosive innovation in the first place. + +"On the one hand, we were trying to make a uniform command set again; on the other hand, we wanted to keep it open ended, because the programmability was important," recalls Steele. + +To solve the problem, Stallman, Steele, and fellow hackers David Moon and Dan Weinreib limited their standardization effort to the WYSIWYG commands that controlled how text appeared on-screen. The rest of the Emacs effort would be devoted to retaining the program's Tinker Toy-style extensibility. + +Stallman now faced another conundrum: if users made changes but didn't communicate those changes back to the rest of the community, the Tower of Babel effect would simply emerge in other places. Falling back on the hacker doctrine of sharing innovation, Stallman embedded a statement within the source code that set the terms of use. Users were free to modify and redistribute the code on the condition that they gave back all the extensions they made. Stallman dubbed it the " Emacs Commune." Just as TECO had become more than a simple editor, Emacs had become more than a simple software program. To Stallman, it was a social contract. In an early memo documenting the project, Stallman spelled out the contract terms. "EMACS," he wrote, "was distributed on a basis of communal sharing, which means that all improvements must be given back to me to be incorporated and distributed."7 + +Not everybody accepted the contract. The explosive innovation continued throughout the decade, resulting in a host of Emacs-like programs with varying degrees of cross-compatibility. A few cited their relation to Stallman's original Emacs with humorously recursive names: Sine (Sine is not Emacs), Eine (Eine is not Emacs), and Zwei (Zwei was Eine initially). As a devoted exponent of the hacker ethic, Stallman saw no reason to halt this innovation through legal harassment. Still, the fact that some people would so eagerly take software from the community chest, alter it, and slap a new name on the resulting software displayed a stunning lack of courtesy. + +Such rude behavior was reflected against other, unsettling developments in the hacker community. Brian Reid's 1979 decision to embed "time bombs" in Scribe, making it possible for Unilogic to limit unpaid user access to the software, was a dark omen to Stallman. "He considered it the most Nazi thing he ever saw in his life," recalls Reid. Despite going on to later Internet fame as the cocreator of the Usenet alt heirarchy, Reid says he still has yet to live down that 1979 decision, at least in Stallman's eyes. "He said that all software should be free and the prospect of charging money for software was a crime against humanity."8 + +Although Stallman had been powerless to head off Reid's sale, he did possess the ability to curtail other forms of behavior deemed contrary to the hacker ethos. As central source-code maintainer for the Emacs "commune," Stallman began to wield his power for political effect. During his final stages of conflict with the administrators at the Laboratory for Computer Science over password systems, Stallman initiated a software " strike," 9 refusing to send lab members the latest version of Emacs until they rejected the security system on the lab's computers. The move did little to improve Stallman's growing reputation as an extremist, but it got the point across: commune members were expected to speak up for basic hacker values. + +"A lot of people were angry with me, saying I was trying to hold them hostage or blackmail them, which in a sense I was," Stallman would later tell author Steven Levy. "I was engaging in violence against them because I thought they were engaging in violence to everyone at large."9 + +Over time, Emacs became a sales tool for the hacker ethic. The flexibility Stallman and built into the software not only encouraged collaboration, it demanded it. Users who didn't keep abreast of the latest developments in Emacs evolution or didn't contribute their contributions back to Stallman ran the risk of missing out on the latest breakthroughs. And the breakthroughs were many. Twenty years later, users had modified Emacs for so many different uses-using it as a spreadsheet, calculator, database, and web browser-that later Emacs developers adopted an overflowing sink to represent its versatile functionality. "That's the idea that we wanted to convey," says Stallman. "The amount of stuff it has contained within it is both wonderful and awful at the same time." + +Stallman's AI Lab contemporaries are more charitable. Hal Abelson, an MIT grad student who worked with Stallman during the 1970s and would later assist Stallman as a charter boardmember of the Free Software Foundation, describes Emacs as "an absolutely brilliant creation." In giving programmers a way to add new software libraries and features without messing up the system, Abelson says, Stallman paved the way for future large-scale collaborative software projects. "Its structure was robust enough that you'd have people all over the world who were loosely collaborating [and] contributing to it," Abelson says. "I don't know if that had been done before."10 + +Guy Steele expresses similar admiration. Currently a research scientist for Sun Microsystems, he remembers Stallman primarily as a "brilliant programmer with the ability to generate large quantities of relatively bug-free code." Although their personalities didn't exactly mesh, Steele and Stallman collaborated long enough for Steele to get a glimpse of Stallman's intense coding style. He recalls a notable episode in the late 1970s when the two programmers banded together to write the editor's "pretty print" feature. Originally conceived by Steele, pretty print was another keystroke-triggerd feature that reformatted Emacs' source code so that it was both more readable and took up less space, further bolstering the program's WYSIWIG qualities. The feature was strategic enough to attract Stallman's active interest, and it wasn't long before Steele wrote that he and Stallman were planning an improved version. + +"We sat down one morning," recalls Steele. "I was at the keyboard, and he was at my elbow," says Steele. "He was perfectly willing to let me type, but he was also telling me what to type. + +The programming session lasted 10 hours. Throughout that entire time, Steele says, neither he nor Stallman took a break or made any small talk. By the end of the session, they had managed to hack the pretty print source code to just under 100 lines. "My fingers were on the keyboard the whole time," Steele recalls, "but it felt like both of our ideas were flowing onto the screen. He told me what to type, and I typed it." + +The length of the session revealed itself when Steele finally left the AI Lab. Standing outside the building at 545 Tech Square, he was surprised to find himself surrounded by nighttime darkness. As a programmer, Steele was used to marathon coding sessions. Still, something about this session was different. Working with Stallman had forced Steele to block out all external stimuli and focus his entire mental energies on the task at hand. Looking back, Steele says he found the Stallman mind-meld both exhilarating and scary at the same time. "My first thought afterward was: it was a great experience, very intense, and that I never wanted to do it again in my life." + + +Chapter 7 +A Stark Moral Choice +On September 27, 1983, computer programmers logging on to the Usenet newsgroup net.unix-wizards encountered an unusual message. Posted in the small hours of the morning, 12:30 a.m. to be exact, and signed by rms@mit-oz, the message's subject line was terse but attention-grabbing. "New UNIX implementation," it read. Instead of introducing a newly released version of Unix, however, the message's opening paragraph issued a call to arms: + + Starting this Thanksgiving I am going to write a complete Unix-compatible software system called GNU (for Gnu's Not Unix), and give it away free to everyone who can use it. Contributions of time, money, programs and equipment are greatly needed.1 + +To an experienced Unix developer, the message was a mixture of idealism and hubris. Not only did the author pledge to rebuild the already mature Unix operating system from the ground up, he also proposed to improve it in places. The new GNU system, the author predicted, would carry all the usual components-a text editor, a shell program to run Unix-compatible applications, a compiler, "and a few other things."1 It would also contain many enticing features that other Unix systems didn't yet offer: a graphic user interface based on the Lisp programming language, a crash-proof file system, and networking protocols built according to MIT's internal networking system. + +"GNU will be able to run Unix programs, but will not be identical to Unix," the author wrote. "We will make all improvements that are convenient, based on our experience with other operating systems." + +Anticipating a skeptical response on some readers' part, the author made sure to follow up his operating-system outline with a brief biographical sketch titled, "Who am I?": + + I am Richard Stallman, inventor of the original much-imitated EMACS editor, now at the Artificial Intelligence Lab at MIT. I have worked extensively on compilers, editors, debuggers, command interpreters, the Incompatible Timesharing System and the Lisp Machine operating system. I pioneered terminal-independent display support in ITS. In addition I have implemented one crashproof file system and two window systems for Lisp machines.1 + +As fate would have it, Stallman's fanciful GNU Project missed its Thanksgiving launch date. By January, 1984, however, Stallman made good on his promise and fully immersed himself in the world of Unix software development. For a software architect raised on ITS, it was like designing suburban shopping malls instead of Moorish palaces. Even so, building a Unix-like operating system had its hidden advantages. ITS had been powerful, but it also possessed an Achilles' heel: MIT hackers had designed it to take specific advantage of the DEC-built PDP line. When AI Lab administrators elected to phase out the lab's powerful PDP-10 machine in the early 1980s, the operating system that hackers once likened to a vibrant city became an instant ghost town. Unix, on the other hand, was designed for mobility and long-term survival. Originally developed by junior scientists at AT&T, the program had slipped out under corporate-management radar, finding a happy home in the cash-strapped world of academic computer systems. With fewer resources than their MIT brethren, Unix developers had customized the software to ride atop a motley assortment of hardware systems: everything from the 16-bit PDP-11-a machine considered fit for only small tasks by most AI Lab hackers-to 32-bit mainframes such as the VAX 11/780. By 1983, a few companies, most notably Sun Microsystems, were even going so far as to develop a new generation of microcomputers, dubbed "workstations," to take advantage of the increasingly ubiquitous operating system. + +To facilitate this process, the developers in charge of designing the dominant Unix strains made sure to keep an extra layer of abstraction between the software and the machine. Instead of tailoring the operating system to take advantage of a specific machine's resources-as the AI Lab hackers had done with ITS and the PDP-10-Unix developers favored a more generic, off-the-rack approach. Focusing more on the interlocking standards and specifications that held the operating system's many subcomponents together, rather than the actual components themselves, they created a system that could be quickly modified to suit the tastes of any machine. If a user quibbled with a certain portion, the standards made it possible to pull out an individual subcomponent and either fix it or replace it with something better. Simply put, what the Unix approach lacked in terms of style or aesthetics, it more than made up for in terms of flexibility and economy, hence its rapid adoption. 2 + +Stallman's decision to start developing the GNU system was triggered by the end of the ITS system that the AI Lab hackers had nurtured for so long. The demise of ITS had been a traumatic blow to Stallman. Coming on the heels of the Xerox laser printer episode, it offered further evidence that the AI Lab hacker culture was losing its immunity to business practices in the outside world. + +Like the software code that composed it, the roots of ITS' demise stretched way back. Defense spending, long a major font for computer-science research, had dried up during the post-Vietnam years. In a desperate quest for new funds, laboratories and universities turned to the private sector. In the case of the AI Lab, winning over private investors was an easy sell. Home to some of the most ambitious computer-science projects of the post-war era, the lab became a quick incubator of technology. Indeed, by 1980, most of the lab's staff, including many hackers, were dividing its time between Institute and commercial projects. + +What at first seemed like a win-win deal-hackers got to work on the best projects, giving the lab first look at many of the newest computer technologies coming down the pike-soon revealed itself as a Faustian bargain. The more time hackers devoted to cutting-edge commercial projects, the less time they had to devote to general maintenance on the lab's baroque software infrastructure. Soon, companies began hiring away hackers outright in an attempt to monopolize their time and attention. With fewer hackers to mind the shop, programs and machines took longer to fix. Even worse, Stallman says, the lab began to undergo a "demographic change." The hackers who had once formed a vocal minority within the AI Lab were losing membership while "the professors and the students who didn't really love the [PDP-10] were just as numerous as before."3 + +The breaking point came in 1982. That was the year the lab's administration decided to upgrade its main computer, the PDP-10. Digital, the corporation that manufactured the PDP-10, had discontinued the line. Although the company still offered a high-powered mainframe, dubbed the KL-10, the new machine required a drastic rewrite or "port" of ITS if hackers wanted to continue running the same operating system. Fearful that the lab had lost its critical mass of in-house programming talent, AI Lab faculty members pressed for Twenex, a commercial operating system developed by Digital. Outnumbered, the hackers had no choice but to comply. + +"Without hackers to maintain the system, [faculty members] said, `We're going to have a disaster; we must have commercial software,'" Stallman would recall a few years later. "They said, `We can expect the company to maintain it.' It proved that they were utterly wrong, but that's what they did."3 + +At first, hackers viewed the Twenex system as yet another authoritarian symbol begging to be subverted. The system's name itself was a protest. Officially dubbed TOPS-20 by DEC, it was a successor to TOPS-10, a commercial operating system DEC marketed for the PDP-10. Bolt Beranek Newman had deveoped an improved version, dubbed Tenex, which TOPS-20 drew upon.4 Stallman, the hacker who coined the Twenex term, says he came up with the name as a way to avoid using the TOPS-20 name. "The system was far from tops, so there was no way I was going to call it that," Stallman recalls. "So I decided to insert a `w' in the Tenex name and call it Twenex." + +The machine that ran the Twenex/TOPS-20 system had its own derisive nickname: Oz. According to one hacker legend, the machine got its nickname because it required a smaller PDP-11 machine to power its terminal. One hacker, upon viewing the KL-10-PDP-11 setup for the first time, likened it to the wizard's bombastic onscreen introduction in the Wizard of Oz. "I am the great and powerful Oz," the hacker intoned. "Pay no attention to the PDP-11 behind that console."5 + +If hackers laughed when they first encountered the KL-10, their laughter quickly died when they encountered Twenex. Not only did Twenex boast built-in security, but the system's software engineers had designed the tools and applications with the security system in mind. What once had been a cat-and-mouse game over passwords in the case of the Laboratory for Computer Science's security system, now became an out-and-out battle over system management. System administrators argued that without security, the Oz system was more prone to accidental crashes. Hackers argued that crashes could be better prevented by overhauling the source code. Unfortunately, the number of hackers with the time and inclination to perform this sort of overhaul had dwindled to the point that the system-administrator argument prevailed. + +Cadging passwords and deliberately crashing the system in order to glean evidence from the resulting wreckage, Stallman successfully foiled the system administrators' attempt to assert control. After one foiled "coup d'etat," Stallman issued an alert to the entire AI staff.3 + +"There has been another attempt to seize power," Stallman wrote. "So far, the aristocratic forces have been defeated." To protect his identity, Stallman signed the message "Radio Free OZ." + +The disguise was a thin one at best. By 1982, Stallman's aversion to passwords and secrecy had become so well known that users outside the AI Laboratory were using his account as a stepping stone to the ARPAnet, the research-funded computer network that would serve as a foundation for today's Internet. One such "tourist" during the early 1980s was Don Hopkins, a California programmer who learned through the hacking grapevine that all an outsider needed to do to gain access to MIT's vaunted ITS system was to log in under the initials RMS and enter the same three-letter monogram when the system requested a password. + +"I'm eternally grateful that MIT let me and many other people use their computers for free," says Hopkins. "It meant a lot to many people." + +This so-called "tourist" policy, which had been openly tolerated by MIT management during the ITS years,6 fell by the wayside when Oz became the lab's primary link to the ARPAnet. At first, Stallman continued his policy of repeating his login ID as a password so outside users could follow in his footsteps. Over time, however, the Oz's fragility prompted administrators to bar outsiders who, through sheer accident or malicious intent, might bring down the system. When those same administrators eventually demanded that Stallman stop publishing his password, Stallman, citing personal ethics, refused to do so and ceased using the Oz system altogether.3 + +"[When] passwords first appeared at the MIT AI Lab I [decided] to follow my belief that there should be no passwords," Stallman would later say. "Because I don't believe that it's really desirable to have security on a computer, I shouldn't be willing to help uphold the security regime."3 + +Stallman's refusal to bow before the great and powerful Oz symbolized the growing tension between hackers and AI Lab management during the early 1980s. This tension paled in comparison to the conflict that raged within the hacker community itself. By the time the KL-10 arrived, the hacker community had already divided into two camps. The first centered around a software company called Symbolics, Inc. The second centered around Symbolics chief rival, Lisp Machines, Inc. (LMI). Both companies were in a race to market the Lisp Machine, a device built to take full advantage of the Lisp programming language. + +Created by artificial-intelligence research pioneer John McCarthy, a MIT artificial-intelligence researcher during the late 1950s, Lisp is an elegant language well-suited for programs charged with heavy-duty sorting and processing. The language's name is a shortened version of LISt Processing. Following McCarthy's departure to the Stanford Artificial Intelligence Laboratory, MIT hackers refined the language into a local dialect dubbed MACLISP. The "MAC" stood for Project MAC, the DARPA-funded research project that gave birth to the AI Lab and the Laboratory for Computer Science. Led by AI Lab arch-hacker Richard Greenblatt, AI Lab programmers during the 1970s built up an entire Lisp-based operating system, dubbed the Lisp Machine operating system. By 1980, the Lisp Machine project had generated two commercial spin-offs. Symbolics was headed by Russell Noftsker, a former AI Lab administrator, and Lisp Machines, Inc., was headed by Greenblatt. + +The Lisp Machine software was hacker-built, meaning it was owned by MIT but available for anyone to copy as per hacker custom. Such a system limited the marketing advantage of any company hoping to license the software from MIT and market it as unique. To secure an advantage, and to bolster the aspects of the operating system that customers might consider attractive, the companies recruited various AI Lab hackers and set them working on various components of the Lisp Machine operating system outside the auspices of the AI Lab. + +The most aggressive in this strategy was Symbolics. By the end of 1980, the company had hired 14 AI Lab staffers as part-time consultants to develop its version of the Lisp Machine. Apart from Stallman, the rest signed on to help LMI.7 + +At first, Stallman accepted both companies' attempt to commercialize the Lisp machine, even though it meant more work for him. Both licensed the Lisp Machine OS source code from MIT, and it was Stallman's job to update the lab's own Lisp Machine to keep pace with the latest innovations. Although Symbolics' license with MIT gave Stallman the right to review, but not copy, Symbolics' source code, Stallman says a "gentleman's agreement" between Symbolics management and the AI Lab made it possible to borrow attractive snippets in traditional hacker fashion. + +On March 16, 1982, a date Stallman remembers well because it was his birthday, Symbolics executives decided to end this gentlemen's agreement. The move was largely strategic. LMI, the primary competition in the Lisp Machine marketplace, was essentially using a copy of the AI Lab Lisp Machine. Rather than subsidize the development of a market rival, Symbolics executives elected to enforce the letter of the license. If the AI Lab wanted its operating system to stay current with the Symbolics operating system, the lab would have to switch over to a Symbolics machine and sever its connection to LMI. + +As the person responsible for keeping up the lab's Lisp Machine, Stallman was incensed. Viewing this announcement as an "ultimatum," he retaliated by disconnecting Symbolics' microwave communications link to the laboratory. He then vowed never to work on a Symbolics machine and pledged his immediate allegiance to LMI. "The way I saw it, the AI Lab was a neutral country, like Belgium in World War I," Stallman says. "If Germany invades Belgium, Belgium declares war on Germany and sides with Britain and France." + +The circumstances of the so-called "Symbolics War" of 1982-1983 depend heavily on the source doing the telling. When Symbolics executives noticed that their latest features were still appearing in the AI Lab Lisp Machine and, by extension, the LMI Lisp machine, they installed a "spy" program on Stallman's computer terminal. Stallman says he was rewriting the features from scratch, taking advantage of the license's review clause but also taking pains to make the source code as different as possible. Symbolics executives argued otherwise and took their case to MIT administration. According to 1994 book, The Brain Makers: Genius, Ego, and Greed, and the Quest for Machines That Think, written by Harvey Newquist, the administration responded with a warning to Stallman to "stay away" from the Lisp Machine project.8 According to Stallman, MIT administrators backed Stallman up. "I was never threatened," he says. "I did make changes in my practices, though. Just to be ultra safe, I no longer read their source code. I used only the documentation and wrote the code from that." + +Whatever the outcome, the bickering solidified Stallman's resolve. With no source code to review, Stallman filled in the software gaps according to his own tastes and enlisted members of the AI Lab to provide a continuous stream of bug reports. He also made sure LMI programmers had direct access to the changes. "I was going to punish Symbolics if it was the last thing I did," Stallman says. + +Such statements are revealing. Not only do they shed light on Stallman's nonpacifist nature, they also reflect the intense level of emotion triggered by the conflict. According to another Newquist-related story, Stallman became so irate at one point that he issued an email threatening to "wrap myself in dynamite and walk into Symbolics' offices."9 Although Stallman would deny any memory of the email and still describes its existence as a "vicious rumor," he acknowledges that such thoughts did enter his head. "I definitely did have fantasies of killing myself and destroying their building in the process," Stallman says. "I thought my life was over."5 + +The level of despair owed much to what Stallman viewed as the "destruction" of his "home"-i.e., the demise of the AI Lab's close-knit hacker subculture. In a later email interview with Levy, Stallman would liken himself to the historical figure Ishi, the last surviving member of the Yahi, a Pacific Northwest tribe wiped out during the Indian wars of the 1860s and 1870s. The analogy casts Stallman's survival in epic, almost mythical, terms. In reality, however, it glosses over the tension between Stallman and his fellow AI Lab hackers prior to the Symbolics-LMI schism. Instead of seeing Symbolics as an exterminating force, many of Stallman's colleagues saw it as a belated bid for relevance. In commercializing the Lisp Machine, the company pushed hacker principles of engineer-driven software design out of the ivory-tower confines of the AI Lab and into the corporate marketplace where manager-driven design principles held sway. Rather than viewing Stallman as a holdout, many hackers saw him as a troubling anachronism. + +Stallman does not dispute this alternate view of historical events. In fact, he says it was yet another reason for the hostility triggered by the Symbolics "ultimatum." Even before Symbolics hired away most of the AI Lab's hacker staff, Stallman says many of the hackers who later joined Symbolics were shunning him. "I was no longer getting invited to go to Chinatown," Stallman recalls. "The custom started by Greenblatt was that if you went out to dinner, you went around or sent a message asking anybody at the lab if they also wanted to go. Sometime around 1980-1981, I stopped getting asked. They were not only not inviting me, but one person later confessed that he had been pressured to lie to me to keep their going away to dinner without me a secret." + +Although Stallman felt anger toward the hackers who orchestrated this petty form of ostracism, the Symbolics controversy dredged up a new kind of anger, the anger of a person about to lose his home. When Symbolics stopped sending over its source-code changes, Stallman responded by holing up in his MIT offices and rewriting each new software feature and tool from scratch. Frustrating as it may have been, it guaranteed that future Lisp Machine users had unfettered access to the same features as Symbolics users. + +It also guaranteed Stallman's legendary status within the hacker community. Already renowned for his work with Emacs, Stallman's ability to match the output of an entire team of Symbolics programmers-a team that included more than a few legendary hackers itself-still stands has one of the major human accomplishments of the Information Age, or of any age for that matter. Dubbing it a "master hack" and Stallman himself a "virtual John Henry of computer code," author Steven Levy notes that many of his Symbolics-employed rivals had no choice but to pay their idealistic former comrade grudging respect. Levy quotes Bill Gosper, a hacker who eventually went to work for Symbolics in the company's Palo Alto office, expressing amazement over Stallman's output during this period: + + I can see something Stallman wrote, and I might decide it was bad (probably not, but somebody could convince me it was bad), and I would still say, "But wait a minute-Stallman doesn't have anybody to argue with all night over there. He's working alone! It's incredible anyone could do this alone!"10 + +For Stallman, the months spent playing catch up with Symbolics evoke a mixture of pride and profound sadness. As a dyed-in-the-wool liberal whose father had served in World War II, Stallman is no pacifist. In many ways, the Symbolics war offered the rite of passage toward which Stallman had been careening ever since joining the AI Lab staff a decade before. At the same time, however, it coincided with the traumatic destruction of the AI Lab hacker culture that had nurtured Stallman since his teenage years. One day, while taking a break from writing code, Stallman experienced a traumatic moment passing through the lab's equipment room. There, Stallman encountered the hulking, unused frame of the PDP-10 machine. Startled by the dormant lights, lights that once actively blinked out a silent code indicating the status of the internal program, Stallman says the emotional impact was not unlike coming across a beloved family member's well-preserved corpse. + +"I started crying right there in the equipment room," he says. "Seeing the machine there, dead, with nobody left to fix it, it all drove home how completely my community had been destroyed." + +Stallman would have little opportunity to mourn. The Lisp Machine, despite all the furor it invoked and all the labor that had gone into making it, was merely a sideshow to the large battles in the technology marketplace. The relentless pace of computer miniaturization was bringing in newer, more powerful microprocessors that would soon incorporate the machine's hardware and software capabilities like a modern metropolis swallowing up an ancient desert village. + +Riding atop this microprocessor wave were hundreds-thousands-of commercial software programs, each protected by a patchwork of user licenses and nondisclosure agreements that made it impossible for hackers to review or share source code. The licenses were crude and ill-fitting, but by 1983 they had become strong enough to satisfy the courts and scare away would-be interlopers. Software, once a form of garnish most hardware companies gave away to make their expensive computer systems more flavorful, was quickly becoming the main dish. In their increasing hunger for new games and features, users were putting aside the traditional demand to review the recipe after every meal. + +Nowhere was this state of affairs more evident than in the realm of personal computer systems. Companies such as Apple Computer and Commodore were minting fresh millionaires selling machines with built-in operating systems. Unaware of the hacker culture and its distaste for binary-only software, many of these users saw little need to protest when these companies failed to attach the accompanying source-code files. A few anarchic adherents of the hacker ethic helped propel that ethic into this new marketplace, but for the most part, the marketplace rewarded the programmers speedy enough to write new programs and savvy enough to copyright them as legally protected works. + +One of the most notorious of these programmers was Bill Gates, a Harvard dropout two years Stallman's junior. Although Stallman didn't know it at the time, seven years before sending out his message to the n et.unix-wizards newsgroup, Gates, a budding entrepreneur and general partner with the Albuquerque-based software firm Micro-Soft, later spelled as Microsoft, had sent out his own open letter to the software-developer community. Written in response to the PC users copying Micro-Soft's software programs, Gates' " Open Letter to Hobbyists" had excoriated the notion of communal software development. + +"Who can afford to do professional work for nothing?" asked Gates. "What hobbyist can put three man-years into programming, finding all bugs, documenting his product, and distributing it for free?"11 + +Although few hackers at the AI Lab saw the missive, Gates' 1976 letter nevertheless represented the changing attitude toward software both among commercial software companies and commercial software developers. Why treat software as a zero-cost commodity when the market said otherwise? As the 1970s gave way to the 1980s, selling software became more than a way to recoup costs; it became a political statement. At a time when the Reagan Administration was rushing to dismantle many of the federal regulations and spending programs that had been built up during the half century following the Great Depression, more than a few software programmers saw the hacker ethic as anticompetitive and, by extension, un-American. At best, it was a throwback to the anticorporate attitudes of the late 1960s and early 1970s. Like a Wall Street banker discovering an old tie-dyed shirt hiding between French-cuffed shirts and double-breasted suits, many computer programmers treated the hacker ethic as an embarrassing reminder of an idealistic age. + +For a man who had spent the entire 1960s as an embarrassing throwback to the 1950s, Stallman didn't mind living out of step with his peers. As a programmer used to working with the best machines and the best software, however, Stallman faced what he could only describe as a "stark moral choice": either get over his ethical objection for " proprietary" software-the term Stallman and his fellow hackers used to describe any program that carried private copyright or end-user license that restricted copying and modification-or dedicate his life to building an alternate, nonproprietary system of software programs. Given his recent months-long ordeal with Symbolics, Stallman felt more comfortable with the latter option. "I suppose I could have stopped working on computers altogether," Stallman says. "I had no special skills, but I'm sure I could have become a waiter. Not at a fancy restaurant, probably, but I could've been a waiter somewhere." + +Being a waiter-i.e., dropping out of programming altogether-would have meant completely giving up an activity, computer programming, that had given him so much pleasure. Looking back on his life since moving to Cambridge, Stallman finds it easy to identify lengthy periods when software programming provided the only pleasure. Rather than drop out, Stallman decided to stick it out. + +An atheist, Stallman rejects notions such as fate, dharma, or a divine calling in life. Nevertheless, he does feel that the decision to shun proprietary software and build an operating system to help others do the same was a natural one. After all, it was Stallman's own personal combination of stubbornness, foresight, and coding virtuosity that led him to consider a fork in the road most others didn't know existed. In describing the decision in a chapter for the 1999 book, Open Sources, Stallman cites the spirit encapsulated in the words of the Jewish sage Hillel: + + If I am not for myself, who will be for me?If I am only for myself, what am I?If not now, when?12 + +Speaking to audiences, Stallman avoids the religious route and expresses the decision in pragmatic terms. "I asked myself: what could I, an operating-system developer, do to improve the situation? It wasn't until I examined the question for a while that I realized an operating-system developer was exactly what was needed to solve the problem." + +Once he reached that decision, Stallman says, everything else "fell into place." He would abstain from using software programs that forced him to compromise his ethical beliefs, while at the same time devoting his life to the creation of software that would make it easier for others to follow the same path. Pledging to build a free software operating system "or die trying-of old age, of course," Stallman quips, he resigned from the MIT staff in January, 1984, to build GNU. + +The resignation distanced Stallman's work from the legal auspices of MIT. Still, Stallman had enough friends and allies within the AI Lab to retain rent-free access to his MIT office. He also had the ability to secure outside consulting gigs to underwrite the early stages of the GNU Project. In resigning from MIT, however, Stallman negated any debate about conflict of interest or Institute ownership of the software. The man whose early adulthood fear of social isolation had driven him deeper and deeper into the AI Lab's embrace was now building a legal firewall between himself and that environment. + +For the first few months, Stallman operated in isolation from the Unix community as well. Although his announcement to the net.unix-wizards group had attracted sympathetic responses, few volunteers signed on to join the crusade in its early stages. + +"The community reaction was pretty much uniform," recalls Rich Morin, leader of a Unix user group at the time. "People said, `Oh, that's a great idea. Show us your code. Show us it can be done.'" + +In true hacker fashion, Stallman began looking for existing programs and tools that could be converted into GNU programs and tools. One of the first was a compiler named VUCK, which converted programs written in the popular C programming language into machine-readable code. Translated from the Dutch, the program's acronym stood for the Free University Compiler Kit. Optimistic, Stallman asked the program's author if the program was free. When the author informed him that the words "Free University" were a reference to the Vrije Universiteit in Amsterdam, Stallman was chagrined. + +"He responded derisively, stating that the university was free but the compiler was not," recalls Stallman. "I therefore decided that my first program for the GNU Project would be a multi-language, multi-platform compiler."3 + +Eventually Stallman found a Pastel language compiler written by programmers at Lawrence Livermore National Lab. According to Stallman's knowledge at the time, the compiler was free to copy and modify. Unfortunately, the program possessed a sizable design flaw: it saved each program into core memory, tying up precious space for other software activities. On mainframe systems this design flaw had been forgivable. On Unix systems it was a crippling barrier, since the machines that ran Unix were too small to handle the large files generated. Stallman made substantial progress at first, building a C-compatible frontend to the compiler. By summer, however, he had come to the conclusion that he would have to build a totally new compiler from scratch. + +In September of 1984, Stallman shelved compiler development for the near term and began searching for lower-lying fruit. He began development of a GNU version of Emacs, the program he himself had been supervising for a decade. The decision was strategic. Within the Unix community, the two native editor programs were vi, written by Sun Microsystems cofounder Bill Joy, and ed, written by Bell Labs scientist (and Unix cocreator) Ken Thompson. Both were useful and popular, but neither offered the endlessly expandable nature of Emacs. In rewriting Emacs for the Unix audience, Stallman stood a better chance of showing off his skills. It also stood to reason that Emacs users might be more attuned to the Stallman mentality. + +Looking back, Stallman says he didn't view the decision in strategic terms. "I wanted an Emacs, and I had a good opportunity to develop one." + +Once again, the notion of reinventing the wheel grated on Stallman's efficient hacker sensibilities. In writing a Unix version of Emacs, Stallman was soon following the footsteps of Carnegie Mellon graduate student James Gosling, author of a C-based version dubbed Gosling Emacs or GOSMACS. Gosling's version of Emacs included an interpreter that exploited a simplified offshoot of the Lisp language called MOCKLISP. Determined to build GNU Emacs on a similar Lisp foundation, Stallman borrowed copiously from Gosling's innovations. Although Gosling had put GOSMACS under copyright and had sold the rights to UniPress, a privately held software company, Stallman cited the assurances of a fellow developer who had participated in the early MOCKLISP interpreter. According to the developer, Gosling, while a Ph.D. student at Carnegie Mellon, had assured early collaborators that their work would remain accessible. When UniPress caught wind of Stallman's project, however, the company threatened to enforce the copyright. Once again, Stallman faced the prospect of building from the ground up. + +In the course of reverse-engineering Gosling's interpreter, Stallman would create a fully functional Lisp interpreter, rendering the need for Gosling's original interpreter moot. Nevertheless, the notion of developers selling off software rights-indeed, the very notion of developers having software rights to sell in the first place-rankled Stallman. In a 1986 speech at the Swedish Royal Technical Institute, Stallman cited the UniPress incident as yet another example of the dangers associated with proprietary software. + +"Sometimes I think that perhaps one of the best things I could do with my life is find a gigantic pile of proprietary software that was a trade secret, and start handing out copies on a street corner so it wouldn't be a trade secret any more," said Stallman. "Perhaps that would be a much more efficient way for me to give people new free software than actually writing it myself; but everyone is too cowardly to even take it."3 + +Despite the stress it generated, the dispute over Gosling's innovations would assist both Stallman and the free software movement in the long term. It would force Stallman to address the weaknesses of the Emacs Commune and the informal trust system that had allowed problematic offshoots to emerge. It would also force Stallman to sharpen the free software movement's political objectives. Following the release of GNU Emacs in 1985, Stallman issued " The GNU Manifesto," an expansion of the original announcement posted in September, 1983. Stallman included within the document a lengthy section devoted to the many arguments used by commercial and academic programmers to justify the proliferation of proprietary software programs. One argument, "Don't programmers deserve a reward for their creativity," earned a response encapsulating Stallman's anger over the recent Gosling Emacs episode: + +"If anything deserves a reward, it is social contribution," Stallman wrote. "Creativity can be a social contribution, but only in so far [sic] as society is free to use the results. If programmers deserve to be rewarded for creating innovative programs, by the same token they deserve to be punished if they restrict the use of these programs."13 + +With the release of GNU Emacs, the GNU Project finally had code to show. It also had the burdens of any software-based enterprise. As more and more Unix developers began playing with the software, money, gifts, and requests for tapes began to pour in. To address the business side of the GNU Project, Stallman drafted a few of his colleagues and formed the Free Software Foundation (FSF), a nonprofit organization dedicated to speeding the GNU Project towards its goal. With Stallman as president and various hacker allies as board members, the FSF helped provide a corporate face for the GNU Project. + +Robert Chassell, a programmer then working at Lisp Machines, Inc., became one of five charter board members at the Free Software Foundation following a dinner conversation with Stallman. Chassell also served as the organization's treasurer, a role that started small but quickly grew. + +"I think in '85 our total expenses and revenue were something in the order of $23,000, give or take," Chassell recalls. "Richard had his office, and we borrowed space. I put all the stuff, especially the tapes, under my desk. It wasn't until sometime later LMI loaned us some space where we could store tapes and things of that sort." + +In addition to providing a face, the Free Software Foundation provided a center of gravity for other disenchanted programmers. The Unix market that had seemed so collegial even at the time of Stallman's initial GNU announcement was becoming increasingly competitive. In an attempt to tighten their hold on customers, companies were starting to close off access to Unix source code, a trend that only speeded the number of inquiries into ongoing GNU software projects. The Unix wizards who once regarded Stallman as a noisy kook were now beginning to see him as a software Cassandra. + +"A lot of people don't realize, until they've had it happen to them, how frustrating it can be to spend a few years working on a software program only to have it taken away," says Chassell, summarizing the feelings and opinions of the correspondents writing in to the FSF during the early years. "After that happens a couple of times, you start to say to yourself, `Hey, wait a minute.'" + +For Chassell, the decision to participate in the Free Software Foundation came down to his own personal feelings of loss. Prior to LMI, Chassell had been working for hire, writing an introductory book on Unix for Cadmus, Inc., a Cambridge-area software company. When Cadmus folded, taking the rights to the book down with it, Chassell says he attempted to buy the rights back with no success. + +"As far as I know, that book is still sitting on shelf somewhere, unusable, uncopyable, just taken out of the system," Chassell says. "It was quite a good introduction if I may say so myself. It would have taken maybe three or four months to convert [the book] into a perfectly usable introduction to GNU/Linux today. The whole experience, aside from what I have in my memory, was lost." + +Forced to watch his work sink into the mire while his erstwhile employer struggled through bankruptcy, Chassell says he felt a hint of the anger that drove Stallman to fits of apoplexy. "The main clarity, for me, was the sense that if you want to have a decent life, you don't want to have bits of it closed off," Chassell says. "This whole idea of having the freedom to go in and to fix something and modify it, whatever it may be, it really makes a difference. It makes one think happily that after you've lived a few years that what you've done is worthwhile. Because otherwise it just gets taken away and thrown out or abandoned or, at the very least, you no longer have any relation to it. It's like losing a bit of your life." + + +Chapter 8 +St. Ignucius +The Maui High Performance Computing Center is located in a single-story building in the dusty red hills just above the town of Kihei. Framed by million-dollar views and the multimillion dollar real estate of the Silversword Golf Course, the center seems like the ultimate scientific boondoggle. Far from the boxy, sterile confines of Tech Square or even the sprawling research metropolises of Argonne, Illinois and Los Alamos, New Mexico, the MHPCC seems like the kind of place where scientists spend more time on their tans than their post-doctoral research projects. + +The image is only half true. Although researchers at the MHPCC do take advantage of the local recreational opportunities, they also take their work seriously. According to Top500.org, a web site that tracks the most powerful supercomputers in the world, the IBM SP Power3 supercomputer housed within the MHPCC clocks in at 837 billion floating-point operations per second, making it one of 25 most powerful computers in the world. Co-owned and operated by the University of Hawaii and the U.S. Air Force, the machine divides its computer cycles between the number crunching tasks associated with military logistics and high-temperature physics research. + +Simply put, the MHPCC is a unique place, a place where the brainy culture of science and engineering and the laid-back culture of the Hawaiian islands coexist in peaceful equilibrium. A slogan on the lab's 2000 web site sums it up: "Computing in paradise." + +It's not exactly the kind of place you'd expect to find Richard Stallman, a man who, when taking in the beautiful view of the nearby Maui Channel through the picture windows of a staffer's office, mutters a terse critique: "Too much sun." Still, as an emissary from one computing paradise to another, Stallman has a message to deliver, even if it means subjecting his pale hacker skin to the hazards of tropical exposure. + +The conference room is already full by the time I arrive to catch Stallman's speech. The gender breakdown is a little better than at the New York speech, 85% male, 15% female, but not by much. About half of the audience members wear khaki pants and logo-encrusted golf shirts. The other half seems to have gone native. Dressed in the gaudy flower-print shirts so popular in this corner of the world, their faces are a deep shade of ochre. The only residual indication of geek status are the gadgets: Nokia cell phones, Palm Pilots, and Sony VAIO laptops. + +Needless to say, Stallman, who stands in front of the room dressed in plain blue T-shirt, brown polyester slacks, and white socks, sticks out like a sore thumb. The fluorescent lights of the conference room help bring out the unhealthy color of his sun-starved skin. His beard and hair are enough to trigger beads of sweat on even the coolest Hawaiian neck. Short of having the words "mainlander" tattooed on his forehead, Stallman couldn't look more alien if he tried. + +As Stallman putters around the front of the room, a few audience members wearing T-shirts with the logo of the Maui FreeBSD Users Group (MFUG) race to set up camera and audio equipment. FreeBSD, a free software offshoot of the Berkeley Software Distribution, the venerable 1970s academic version of Unix, is technically a competitor to the GNU/Linux operating system. Still, in the hacking world, Stallman speeches are documented with a fervor reminiscent of the Grateful Dead and its legendary army of amateur archivists. As the local free software heads, it's up to the MFUG members to make sure fellow programmers in Hamburg, Mumbai, and Novosibirsk don't miss out on the latest pearls of RMS wisdom. + +The analogy to the Grateful Dead is apt. Often, when describing the business opportunities inherent within the free software model, Stallman has held up the Grateful Dead as an example. In refusing to restrict fans' ability to record live concerts, the Grateful Dead became more than a rock group. They became the center of a tribal community dedicated to Grateful Dead music. Over time, that tribal community became so large and so devoted that the band shunned record contracts and supported itself solely through musical tours and live appearances. In 1994, the band's last year as a touring act, the Grateful Dead drew $52 million in gate receipts alone.1 + +While few software companies have been able to match that success, the tribal aspect of the free software community is one reason many in the latter half of the 1990s started to accept the notion that publishing software source code might be a good thing. Hoping to build their own loyal followings, companies such as IBM, Sun Microsystems, and Hewlett Packard have come to accept the letter, if not the spirit, of the Stallman free software message. Describing the GPL as the information-technology industry's "Magna Carta," ZDNet software columnist Evan Leibovitch sees the growing affection for all things GNU as more than just a trend. "This societal shift is letting users take back control of their futures," Leibovitch writes. "Just as the Magna Carta gave rights to British subjects, the GPL enforces consumer rights and freedoms on behalf of the users of computer software."2 + +The tribal aspect of the free software community also helps explain why 40-odd programmers, who might otherwise be working on physics projects or surfing the Web for windsurfing buoy reports, have packed into a conference room to hear Stallman speak. + +Unlike the New York speech, Stallman gets no introduction. He also offers no self-introduction. When the FreeBSD people finally get their equipment up and running, Stallman simply steps forward, starts speaking, and steamrolls over every other voice in the room. + +"Most of the time when people consider the question of what rules society should have for using software, the people considering it are from software companies, and they consider the question from a self-serving perspective," says Stallman, opening his speech. "What rules can we impose on everybody else so they have to pay us lots of money? I had the good fortune in the 1970s to be part of a community of programmers who shared software. And because of this I always like to look at the same issue from a different direction to ask: what kind of rules make possible a good society that is good for the people who are in it? And therefore I reach completely different answers." + +Once again, Stallman quickly segues into the parable of the Xerox laser printer, taking a moment to deliver the same dramatic finger-pointing gestures to the crowd. He also devotes a minute or two to the GNU/Linux name. + +"Some people say to me, `Why make such a fuss about getting credit for this system? After all, the important thing is the job is done, not whether you get recognition for it.' Well, this would be wise advice if it were true. But the job wasn't to build an operating system; the job is to spread freedom to the users of computers. And to do that we have to make it possible to do everything with computers in freedom."3 + +Adds Stallman, "There's a lot more work to do." + +For some in the audience, this is old material. For others, it's a little arcane. When a member of the golf-shirt contingent starts dozing off, Stallman stops the speech and asks somebody to wake the person up. + +"Somebody once said my voice was so soothing, he asked if I was some kind of healer," says Stallman, drawing a quick laugh from the crowd. "I guess that probably means I can help you drift gently into a blissful, relaxing sleep. And some of you might need that. I guess I shouldn't object if you do. If you need to sleep, by all means do." + +The speech ends with a brief discussion of software patents, a growing issue of concern both within the software industry and within the free software community. Like Napster, software patents reflect the awkward nature of applying laws and concepts written for the physical world to the frictionless universe of information technology. The difference between protecting a program under copyright and protecting a program under software patents is subtle but significant. In the case of copyright, a software creator can restrict duplication of the source code but not duplication of the idea or functionality that the source code addresses. In other words, if a developer chooses not to use a software program under the original developer's terms, that second developer is still free to reverse-engineer the program-i.e., duplicate the software program's functionality by rewriting the source code from scratch. Such duplication of ideas is common within the commercial software industry, where companies often isolate reverse-engineering teams to head off accusations of corporate espionage or developer hanky-panky. In the jargon of modern software development, companies refer to this technique as "clean room" engineering. + +Software patents work differently. According to the U.S. Patent Office, companies and individuals may secure patents for innovative algorithms provided they submit their claims to a public review. In theory, this allows the patent-holder to trade off disclosure of their invention for a limited monopoly of a minimum of 20 years after the patent filing. In practice, the disclosure is of limited value, since the operation of the program is often self-evident. Unlike copyright, a patent gives its holder the ability to head off the independent development of software programs with the same or similar functionality. + +In the software industry, where 20 years can cover the entire life cycle of a marketplace, patents take on a strategic weight. Where companies such as Microsoft and Apple once battled over copyright and the "look and feel" of various technologies, today's Internet companies use patents as a way to stake out individual applications and business models, the most notorious example being Amazon.com's 2000 attempt to patent the company's "one-click" online shopping process. For most companies, however, software patents have become a defensive tool, with cross-licensing deals balancing one set of corporate patents against another in a tense form of corporate detente. Still, in a few notable cases of computer encryption and graphic imaging algorithms, software vendors have successfully stifled rival technologies. + +For Stallman, the software-patent issue dramatizes the need for eternal hacker vigilance. It also underlines the importance of stressing the political benefits of free software programs over the competitive benefits. Pointing to software patents' ability to create sheltered regions in the marketplace, Stallman says competitive performance and price, two areas where free software operating systems such as GNU/Linux and FreeBSD already hold a distinct advantage over their proprietary counterparts, are red herrings compared to the large issues of user and developer freedom. + +"It's not because we don't have the talent to make better software," says Stallman. "It's because we don't have the right. Somebody has prohibited us from serving the public. So what's going to happen when users encounter these gaps in free software? Well, if they have been persuaded by the open source movement that these freedoms are good because they lead to more-powerful reliable software, they're likely to say, `You didn't deliver what you promised. This software's not more powerful. It's missing this feature. You lied to me.' But if they have come to agree with the free software movement, that the freedom is important in itself, then they will say, `How dare those people stop me from having this feature and my freedom too.' And with that kind of response, we may survive the hits that we're going to take as these patents explode." + +Such comments involve a hefty dose of spin, of course. Most open source advocates are equally, if not more, vociferous as Stallman when it comes to opposing software patents. Still, the underlying logic of Stallman's argument-that open source advocates emphasize the utilitarian advantages of free software over the political advantages-remains uncontested. Rather than stress the political significance of free software programs, open source advocates have chosen to stress the engineering integrity of the hacker development model. Citing the power of peer review, the open source argument paints programs such as GNU/Linux or FreeBSD as better built, better inspected and, by extension, more trushworthy to the average user. + +That's not to say the term "open source" doesn't have its political implications. For open source advocates, the term open source serves two purposes. First, it eliminates the confusion associated with the word "free," a word many businesses interpret as meaning "zero cost." Second, it allows companies to examine the free software phenomenon on a technological, rather than ethical, basis. Eric Raymond, cofounder of the Open Source Initiative and one of the leading hackers to endorse the term, effectively summed up the frustration of following Stallman down the political path in a 1999 essay, titled " Shut Up and Show Them the Code": + + RMS's rhetoric is very seductive to the kind of people we are. We hackers are thinkers and idealists who readily resonate with appeals to "principle" and "freedom" and "rights." Even when we disagree with bits of his program, we want RMS's rhetorical style to work; we think it ought to work; we tend to be puzzled and disbelieving when it fails on the 95% of people who aren't wired like we are.4 + +Included among that 95%, Raymond writes, are the bulk of business managers, investors, and nonhacker computer users who, through sheer weight of numbers, tend to decide the overall direction of the commercial software marketplace. Without a way to win these people over, Raymond argues, programmers are doomed to pursue their ideology on the periphery of society: + + When RMS insists that we talk about "computer users' rights," he's issuing a dangerously attractive invitation to us to repeat old failures. It's one we should reject-not because his principles are wrong, but because that kind of language, applied to software, simply does not persuade anybody but us. In fact, it confuses and repels most people outside our culture.4 + +Watching Stallman deliver his political message in person, it is hard to see anything confusing or repellent. Stallman's appearance may seem off-putting, but his message is logical. When an audience member asks if, in shunning proprietary software, free software proponents lose the ability to keep up with the latest technological advancements, Stallman answers the question in terms of his own personal beliefs. "I think that freedom is more important than mere technical advance," he says. "I would always choose a less advanced free program rather than a more advanced nonfree program, because I won't give up my freedom for something like that. My rule is, if I can't share it with you, I won't take it." + +Such answers, however, reinforce the quasi-religious nature of the Stallman message. Like a Jew keeping kosher or a Mormon refusing to drink alcohol, Stallman paints his decision to use free software in the place of proprietary in the color of tradition and personal belief. As software evangelists go, Stallman avoids forcing those beliefs down listeners' throats. Then again, a listener rarely leaves a Stallman speech not knowing where the true path to software righteousness lies. + +As if to drive home this message, Stallman punctuates his speech with an unusual ritual. Pulling a black robe out of a plastic grocery bag, Stallman puts it on. Out of a second bag, he pulls a reflective yellow computer disk and places it on his head. The crowd lets out a startled laugh. + +"I am St. Ignucius of the Church of Emacs," says Stallman, raising his right hand in mock-blessing. "I bless your computer, my child." + + +Stallman dressed as St. Ignucius. Photo by Wouter van Oortmerssen. + +The laughter turns into full-blown applause after a few seconds. As audience members clap, the computer disk on Stallman's head catches the glare of an overhead light, eliciting a perfect halo effect. In the blink of an eye, Stallman goes from awkward haole to Russian religious icon. + +" Emacs was initially a text editor," says Stallman, explaining the getup. "Eventually it became a way of life for many and a religion for some. We call this religion the Church of Emacs." + +The skit is a lighthearted moment of self-pardoy, a humorous return-jab at the many people who might see Stallman's form of software asceticism as religious fanaticism in disguise. It is also the sound of the other shoe dropping-loudly. It's as if, in donning his robe and halo, Stallman is finally letting listeners of the hook, saying, "It's OK to laugh. I know I'm weird." + +Discussing the St. Ignucius persona afterward, Stallman says he first came up with it in 1996, long after the creation of Emacs but well before the emergence of the "open source" term and the struggle for hacker-community leadership that precipitated it. At the time, Stallman says, he wanted a way to "poke fun at himself," to remind listeners that, though stubborn, Stallman was not the fanatic some made him out to be. It was only later, Stallman adds, that others seized the persona as a convenient way to play up his reputation as software ideologue, as Eric Raymond did in an 1999 interview with the linux.com web site: + + When I say RMS calibrates what he does, I'm not belittling or accusing him of insincerity. I'm saying that like all good communicators he's got a theatrical streak. Sometimes it's conscious-have you ever seen him in his St. Ignucius drag, blessing software with a disk platter on his head? Mostly it's unconscious; he's just learned the degree of irritating stimulus that works, that holds attention without (usually) freaking people out.5 + +Stallman takes issue with the Raymond analysis. "It's simply my way of making fun of myself," he says. "The fact that others see it as anything more than that is a reflection of their agenda, not mine." + +That said, Stallman does admit to being a ham. "Are you kidding?" he says at one point. "I love being the center of attention." To facilitate that process, Stallman says he once enrolled in Toastmasters, an organization that helps members bolster their public-speaking skills and one Stallman recommends highly to others. He possesses a stage presence that would be the envy of most theatrical performers and feels a link to vaudevillians of years past. A few days after the Maui High Performance Computing Center speech, I allude to the 1999 LinuxWorld performace and ask Stallman if he has a Groucho Marx complex-i.e., the unwillingness to belong to any club that would have him as a member. Stallman's response is immediate: "No, but I admire Groucho Marx in a lot of ways and certainly have been in some things I say inspired by him. But then I've also been inspired in some ways by Harpo." + +The Groucho Marx influence is certainly evident in Stallman's lifelong fondness for punning. Then again, punning and wordplay are common hacker traits. Perhaps the most Groucho-like aspect of Stallman's personality, however, is the deadpan manner in which the puns are delivered. Most come so stealthily-without even the hint of a raised eyebrow or upturned smile-you almost have to wonder if Stallman's laughing at his audience more than the audience is laughing at him. + +Watching members of the Maui High Performance Computer Center laugh at the St. Ignucius parody, such concerns evaporate. While not exactly a standup act, Stallman certainly possesses the chops to keep a roomful of engineers in stitches. "To be a saint in the Church of Emacs does not require celibacy, but it does require making a commitment to living a life of moral purity," he tells the Maui audience. "You must exorcise the evil proprietary operating system from all your computer and then install a wholly [holy] free operating system. And then you must install only free software on top of that. If you make this commitment and live by it, then you too will be a saint in the Church of Emacs, and you too may have a halo." + +The St. Ignucius skit ends with a brief inside joke. On most Unix systems and Unix-related offshoots, the primary competitor program to Emacs is vi, a text-editing program developed by former UC Berkeley student and current Sun Microsystems chief scientist, Bill Joy. Before doffing his "halo," Stallman pokes fun at the rival program. "People sometimes ask me if it is a sin in the Church of Emacs to use vi," he says. "Using a free version of vi is not a sin; it is a penance. So happy hacking." + +After a brief question-and-answer session, audience members gather around Stallman. A few ask for autographs. "I'll sign this," says Stallman, holding up one woman's print out of the GNU General Public License, "but only if you promise me to use the term GNU/Linux instead of Linux and tell all your friends to do likewise." + +The comment merely confirms a private observation. Unlike other stage performers and political figures, Stallman has no "off" mode. Aside from the St. Ignucius character, the ideologue you see onstage is the ideologue you meet backstage. Later that evening, during a dinner conversation in which a programmer mentions his affinity for "open source" programs, Stallman, between bites, upbraids his tablemate: "You mean free software. That's the proper way to refer to it." + +During the question-and-answer session, Stallman admits to playing the pedagogue at times. "There are many people who say, `Well, first let's invite people to join the community, and then let's teach them about freedom.' And that could be a reasonable strategy, but what we have is almost everybody's inviting people to join the community, and hardly anybody's teaching them about freedom once they come in." + +The result, Stallman says, is something akin to a third-world city. People move in, hoping to strike it rich or at the very least to take part in a vibrant, open culture, and yet those who hold the true power keep evolving new tricks and strategies-i.e., software patents-to keep the masses out. "You have millions of people moving in and building shantytowns, but nobody's working on step two: getting them out of those shantytowns. If you think talking about software freedom is a good strategy, please join in doing step two. There are plenty working on step one. We need more people working on step two." + +Working on "step two" means driving home the issue that freedom, not acceptance, is the root issue of the free software movement. Those who hope to reform the proprietary software industry from the inside are on a fool's errand. "Change from the inside is risky," Stallman stays. "Unless you're working at the level of a Gorbachev, you're going to be neutralized." + +Hands pop up. Stallman points to a member of the golf shirt-wearing contingent. "Without patents, how would you suggest dealing with commercial espionage?" + +"Well, those two questions have nothing to do with each other, really," says Stallman. + +"But I mean if someone wants to steal another company's piece of software." + +Stallman's recoils as if hit by a poisonous spray. "Wait a second," Stallman says. "Steal? I'm sorry, there's so much prejudice in that statement that the only thing I can say is that I reject that prejudice. Companies that develop nonfree software and other things keep lots and lots of trade secrets, and so that's not really likely to change. In the old days-even in the 1980s-for the most part programmers were not aware that there were even software patents and were paying no attention to them. What happened was that people published the interesting ideas, and if they were not in the free software movement, they kept secret the little details. And now they patent those broad ideas and keep secret the little details. So as far as what you're describing, patents really make no difference to it one way or another." + +"But if it doesn't affect their publication," a new audience member jumps in, his voice trailing off almost as soon as he starts speaking. + +"But it does," Stallman says. "Their publication is telling you that this is an idea that's off limits to the rest of the community for 20 years. And what the hell good is that? Besides, they've written it in such a hard way to read, both to obfuscate the idea and to make the patent as broad as possible, that it's basically useless looking at the published information to learn anything anyway. The only reason to look at patents is to see the bad news of what you can't do." + +The audience falls silent. The speech, which began at 3:15, is now nearing the 5:00 whistle, and most listeners are already squirming in their seats, antsy to get a jump start on the weekend. Sensing the fatigue, Stallman glances around the room and hastily shuts things down. "So it looks like we're done," he says, following the observation with an auctioneer's "going, going, gone" to flush out any last-minute questioners. When nobody throws their hand up, Stallman signs off with a traditional exit line. + +"Happy hacking," he says. + + +Chapter 9 +The GNU General Public License +By the spring of 1985, Richard Stallman had settled on the GNU Project's first milestone-a Lisp-based free software version of Emacs. To meet this goal, however, he faced two challenges. First, he had to rebuild Emacs in a way that made it platform independent. Second, he had to rebuild the Emacs Commune in a similar fashion. + +The dispute with UniPress had highlighted a flaw in the Emacs Commune social contract. Where users relied on Stallman's expert insight, the Commune's rules held. In areas where Stallman no longer held the position of alpha hacker-pre-1984 Unix systems, for example-individuals and companies were free to make their own rules. + +The tension between the freedom to modify and the freedom to exert authorial privilege had been building before GOSMACS. The Copyright Act of 1976 had overhauled U.S. copyright law, extending the legal protection of copyright to software programs. According to Section 102(b) of the Act, individuals and companies now possessed the ability to copyright the "expression" of a software program but not the "actual processes or methods embodied in the program."1 Translated, programmers and companies had the ability to treat software programs like a story or song. Other programmers could take inspiration from the work, but to make a direct copy or nonsatirical derivative, they first had to secure permission from the original creator. Although the new law guaranteed that even programs without copyright notices carried copyright protection, programmers quickly asserted their rights, attaching coypright notices to their software programs. + +At first, Stallman viewed these notices with alarm. Rare was the software program that didn't borrow source code from past programs, and yet, with a single stroke of the president's pen, Congress had given programmers and companies the power to assert individual authorship over communally built programs. It also injected a dose of formality into what had otherwise been an informal system. Even if hackers could demonstrate how a given program's source-code bloodlines stretched back years, if not decades, the resources and money that went into battling each copyright notice were beyond most hackers' means. Simply put, disputes that had once been settled hacker-to-hacker were now settled lawyer-to-lawyer. In such a system, companies, not hackers, held the automatic advantage. + +Proponents of software copyright had their counter-arguments: without copyright, works might otherwise slip into the public domain. Putting a copyright notice on a work also served as a statement of quality. Programmers or companies who attached their name to the copyright attached their reputations as well. Finally, it was a contract, as well as a statement of ownership. Using copyright as a flexible form of license, an author could give away certain rights in exchange for certain forms of behavior on the part of the user. For example, an author could give away the right to suppress unauthorized copies just so long as the end user agreed not to create a commercial offshoot. + +It was this last argument that eventually softened Stallman's resistance to software copyright notices. Looking back on the years leading up to the GNU Project, Stallman says he began to sense the beneficial nature of copyright sometime around the release of Emacs 15.0, the last significant pre-GNU Project upgrade of Emacs. "I had seen email messages with copyright notices plus simple `verbatim copying permitted' licenses," Stallman recalls. "Those definitely were [an] inspiration." + +For Emacs 15, Stallman drafted a copyright that gave users the right to make and distribute copies. It also gave users the right to make modified versions, but not the right to claim sole ownership of those modified versions, as in the case of GOSMACS. + +Although helpful in codifying the social contract of the Emacs Commune, the Emacs 15 license remained too "informal" for the purposes of the GNU Project, Stallman says. Soon after starting work on a GNU version of Emacs, Stallman began consulting with the other members of the Free Software Foundation on how to shore up the license's language. He also consulted with the attorneys who had helped him set up the Free Software Foundation. + +Mark Fischer, a Boston attorney specializing in intellectual-property law, recalls discussing the license with Stallman during this period. "Richard had very strong views about how it should work," Fischer says, "He had two principles. The first was to make the software absolutely as open as possible. The second was to encourage others to adopt the same licensing practices." + +Encouraging others to adopt the same licensing practices meant closing off the escape hatch that had allowed privately owned versions of Emacs to emerge. To close that escape hatch, Stallman and his free software colleagues came up with a solution: users would be free to modify GNU Emacs just so long as they published their modifications. In addition, the resulting "derivative" works would also have carry the same GNU Emacs License. + +The revolutionary nature of this final condition would take a while to sink in. At the time, Fischer says, he simply viewed the GNU Emacs License as a simple contract. It put a price tag on GNU Emacs' use. Instead of money, Stallman was charging users access to their own later modifications. That said, Fischer does remember the contract terms as unique. + +"I think asking other people to accept the price was, if not unique, highly unusual at that time," he says. + +The GNU Emacs License made its debut when Stallman finally released GNU Emacs in 1985. Following the release, Stallman welcomed input from the general hacker community on how to improve the license's language. One hacker to take up the offer was future software activist John Gilmore, then working as a consultant to Sun Microsystems. As part of his consulting work, Gilmore had ported Emacs over to SunOS, the company's in-house version of Unix. In the process of doing so, Gilmore had published the changes as per the demands of the GNU Emacs License. Instead of viewing the license as a liability, Gilmore saw it as clear and concise expression of the hacker ethos. "Up until then, most licenses were very informal," Gilmore recalls. + +As an example of this informality, Gilmore cites a copyright notice for trn, a Unix utility. Written by Larry Wall, future creator of the Perl programming language, patch made it simple for Unix programmers to insert source-code fixes-" patches" in hacker jargon-into any large program. Recognizing the utility of this feature, Wall put the following copyright notice in the program's accompanying README file: + +Copyright (c) 1985, Larry Wall +You may copy the trn kit in whole or in part as long as you don't try +to make money off it, or pretend that you wrote it.2 + +Such statements, while reflective of the hacker ethic, also reflected the difficulty of translating the loose, informal nature of that ethic into the rigid, legal language of copyright. In writing the GNU Emacs License, Stallman had done more than close up the escape hatch that permitted proprietary offshoots. He had expressed the hacker ethic in a manner understandable to both lawyer and hacker alike. + +It wasn't long, Gilmore says, before other hackers began discussing ways to "port" the GNU Emacs License over to their own programs. Prompted by a conversation on Usenet, Gilmore sent an email to Stallman in November, 1986, suggesting modification: + + You should probably remove "EMACS" from the license and replace it with "SOFTWARE" or something. Soon, we hope, Emacs will not be the biggest part of the GNU system, and the license applies to all of it.3 + +Gilmore wasn't the only person suggesting a more general approach. By the end of 1986, Stallman himself was at work with GNU Project's next major milestone, a source-code debugger, and was looking for ways to revamp the Emacs license so that it might apply to both programs. Stallman's solution: remove all specific references to Emacs and convert the license into a generic copyright umbrella for GNU Project software. The GNU General Public License, GPL for short, was born. + +In fashioning the GPL, Stallman followed the software convention of using decimal numbers to indicate prototype versions and whole numbers to indicate mature versions. Stallman published Version 1.0 of the GPL in 1989 (a project Stallman was developing in 1985), almost a full year after the release of the GNU Debugger, Stallman's second major foray into the realm of Unix programming. The license contained a preamble spelling out its political intentions: + +The General Public License is designed to make sure that you have +the freedom to give away or sell copies of free software, that you +receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you +know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the software, or if you modify it.4 + +In fashioning the GPL, Stallman had been forced to make an additional adjustment to the informal tenets of the old Emacs Commune. Where he had once demanded that Commune members publish any and all changes, Stallman now demanded publication only in instances when programmers circulated their derivative versions in the same public manner as Stallman. In other words, programmers who simply modified Emacs for private use no longer needed to send the source-code changes back to Stallman. In what would become a rare compromise of free software doctrine, Stallman slashed the price tag for free software. Users could innovate without Stallman looking over their shoulders just so long as they didn't bar Stallman and the rest of the hacker community from future exchanges of the same program. + +Looking back, Stallman says the GPL compromise was fueled by his own dissatisfaction with the Big Brother aspect of the original Emacs Commune social contract. As much as he liked peering into other hackers' systems, the knowledge that some future source-code maintainer might use that power to ill effect forced him to temper the GPL. + +"It was wrong to require people to publish all changes," says Stallman. "It was wrong to require them to be sent to one privileged developer. That kind of centralization and privilege for one was not consistent with a society in which all had equal rights." + +As hacks go, the GPL stands as one of Stallman's best. It created a system of communal ownership within the normally proprietary confines of copyright law. More importantly, it demonstrated the intellectual similarity between legal code and software code. Implicit within the GPL's preamble was a profound message: instead of viewing copyright law with suspicion, hackers should view it as yet another system begging to be hacked. + +"The GPL developed much like any piece of free software with a large community discussing its structure, its respect or the opposite in their observation, needs for tweaking and even to compromise it mildly for greater acceptance," says Jerry Cohen, another attorney who helped Stallman with the creation of the license. "The process worked very well and GPL in its several versions has gone from widespread skeptical and at times hostile response to widespread acceptance." + +In a 1986 interview with Byte magazine, Stallman summed up the GPL in colorful terms. In addition to proclaiming hacker values, Stallman said, readers should also "see it as a form of intellectual jujitsu, using the legal system that software hoarders have set up against them."5 Years later, Stallman would describe the GPL's creation in less hostile terms. "I was thinking about issues that were in a sense ethical and in a sense political and in a sense legal," he says. "I had to try to do what could be sustained by the legal system that we're in. In spirit the job was that of legislating the basis for a new society, but since I wasn't a government, I couldn't actually change any laws. I had to try to do this by building on top of the existing legal system, which had not been designed for anything like this." + +About the time Stallman was pondering the ethical, political, and legal issues associated with free software, a California hacker named Don Hopkins mailed him a manual for the 68000 microprocessor. Hopkins, a Unix hacker and fellow science-fiction buff, had borrowed the manual from Stallman a while earlier. As a display of gratitude, Hopkins decorated the return envelope with a number of stickers obtained at a local science-fiction convention. One sticker in particular caught Stallman's eye. It read, "Copyleft (L), All Rights Reversed." Following the release of the first version of GPL, Stallman paid tribute to the sticker, nicknaming the free software license "Copyleft." Over time, the nickname and its shorthand symbol, a backwards "C," would become an official Free Software Foundation synonym for the GPL. + +The German sociologist Max Weber once proposed that all great religions are built upon the "routinization" or "institutionalization" of charisma. Every successful religion, Weber argued, converts the charisma or message of the original religious leader into a social, political, and ethical apparatus more easily translatable across cultures and time. + +While not religious per se, the GNU GPL certainly qualifies as an interesting example of this "routinization" process at work in the modern, decentralized world of software development. Since its unveiling, programmers and companies who have otherwise expressed little loyalty or allegiance to Stallman have willingly accepted the GPL bargain at face value. A few have even accepted the GPL as a preemptive protective mechanism for their own software programs. Even those who reject the GPL contract as too compulsory, still credit it as influential. + +One hacker falling into this latter group was Keith Bostic, a University of California employee at the time of the GPL 1.0 release. Bostic's department, the Computer Systems Research Group (SRG), had been involved in Unix development since the late 1970s and was responsible for many key parts of Unix, including the TCP/IP networking protocol, the cornerstone of modern Internet communications. By the late 1980s, AT&T, the original owner of the Unix brand name, began to focus on commercializing Unix and began looking to the Berkeley Software Distribution, or BSD, the academic version of Unix developed by Bostic and his Berkeley peers, as a key source of commercial technology. + +Although the Berkeley BSD source code was shared among researchers and commercial programmers with a source-code license, this commercialization presented a problem. The Berkeley code was intermixed with proprietary AT&T code. As a result, Berkeley distributions were available only to institutions that already had a Unix source license from AT&T. As AT&T raised its license fees, this arrangement, which had at first seemed innocuous, became increasingly burdensome. + +Hired in 1986, Bostic had taken on the personal project of porting BSD over to the Digital Equipment Corporation's PDP-11 computer. It was during this period, Bostic says, that he came into close interaction with Stallman during Stallman's occasional forays out to the west coast. "I remember vividly arguing copyright with Stallman while he sat at borrowed workstations at CSRG," says Bostic. "We'd go to dinner afterward and continue arguing about copyright over dinner." + +The arguments eventually took hold, although not in the way Stallman would have liked. In June, 1989, Berkeley separated its networking code from the rest of the AT&T-owned operating system and distributed it under a University of California license. The contract terms were liberal. All a licensee had to do was give credit to the university in advertisements touting derivative programs.6 In contrast to the GPL, proprietary offshoots were permissible. Only one problem hampered the license's rapid adoption: the BSD Networking release wasn't a complete operating system. People could study the code, but it could only be run in conjunction with other proprietary-licensed code. + +Over the next few years, Bostic and other University of California employees worked to replace the missing components and turn BSD into a complete, freely redistributable operating system. Although delayed by a legal challenge from Unix Systems Laboratories-the AT&T spin-off that retained ownership of the Unix brand name-the effort would finally bear fruit in the early 1990s. Even before then, however, many of the Berkeley utilities would make their way into Stallman's GNU Project. + +"I think it's highly unlikely that we ever would have gone as strongly as we did without the GNU influence," says Bostic, looking back. "It was clearly something where they were pushing hard and we liked the idea." + +By the end of the 1980s, the GPL was beginning to exert a gravitational effect on the free software community. A program didn't have to carry the GPL to qualify as free software-witness the case of the BSD utilities-but putting a program under the GPL sent a definite message. "I think the very existence of the GPL inspired people to think through whether they were making free software, and how they would license it," says Bruce Perens, creator of Electric Fence, a popular Unix utility, and future leader of the Debian GNU/Linux development team. A few years after the release of the GPL, Perens says he decided to discard Electric Fence's homegrown license in favor of Stallman's lawyer-vetted copyright. "It was actually pretty easy to do," Perens recalls. + +Rich Morin, the programmer who had viewed Stallman's initial GNU announcement with a degree of skepticism, recalls being impressed by the software that began to gather under the GPL umbrella. As the leader of a SunOS user group, one of Morin's primary duties during the 1980s had been to send out distribution tapes containing the best freeware or free software utilities. The job often mandated calling up original program authors to verify whether their programs were copyright protected or whether they had been consigned to the public domain. Around 1989, Morin says, he began to notice that the best software programs typically fell under the GPL license. "As a software distributor, as soon as I saw the word GPL, I knew I was home free," recalls Morin. + +To compensate for the prior hassles that went into compiling distribution tapes to the Sun User Group, Morin had charged recipients a convenience fee. Now, with programs moving over to the GPL, Morin was suddenly getting his tapes put together in half the time, turning a tidy profit in the process. Sensing a commercial opportunity, Morin rechristened his hobby as a business: Prime Time Freeware. + +Such commercial exploitation was completely within the confines of the free software agenda. "When we speak of free software, we are referring to freedom, not price," advised Stallman in the GPL's preamble. By the late 1980s, Stallman had refined it to a more simple mnemonic: "Don't think free as in free beer; think free as in free speech." + +For the most part, businesses ignored Stallman's entreaties. Still, for a few entrepreneurs, the freedom associated with free software was the same freedom associated with free markets. Take software ownership out of the commercial equation, and you had a situation where even the smallest software company was free to compete against the IBMs and DECs of the world. + +One of the first entrepreneurs to grasp this concept was Michael Tiemann, a software programmer and graduate student at Stanford University. During the 1980s, Tiemann had followed the GNU Project like an aspiring jazz musician following a favorite artist. It wasn't until the release of the GNU C Compiler in 1987, however, that he began to grasp the full potential of free software. Dubbing GCC a "bombshell," Tiemann says the program's own existence underlined Stallman's determination as a programmer. + +"Just as every writer dreams of writing the great American novel, every programmer back in the 1980s talked about writing the great American compiler," Tiemman recalls. "Suddenly Stallman had done it. It was very humbling." + +"You talk about single points of failure, GCC was it," echoes Bostic. "Nobody had a compiler back then, until GCC came along." + +Rather than compete with Stallman, Tiemann decided to build on top of his work. The original version of GCC weighed in at 110,000 lines of code, but Tiemann recalls the program as surprisingly easy to understand. So easy in fact that Tiemann says it took less than five days to master and another week to port the software to a new hardware platform, National Semiconductor's 32032 microchip. Over the next year, Tiemann began playing around with the source code, creating a native compiler for the C+ programming language. One day, while delivering a lecture on the program at Bell Labs, Tiemann ran into some AT&T developers struggling to pull off the same thing. + +"There were about 40 or 50 people in the room, and I asked how many people were working on the native code compiler," Tiemann recalls. "My host said the information was confidential but added that if I took a look around the room I might get a good general idea." + +It wasn't long after, Tiemann says, that the light bulb went off in his head. "I had been working on that project for six months," Tiemann says. I just thought to myself, whether it's me or the code this is a level of efficiency that the free market should be ready to reward." + +Tiemann found added inspiration in the GNU Manifesto, which, while excoriating the greed of some software vendors, encourages other vendors to consider the advantages of free software from a consumer point of view. By removing the power of monopoly from the commerical software question, the GPL makes it possible for the smartest vendors to compete on the basis of service and consulting, the two most profit-rich corners of the software marketplace. + +In a 1999 essay, Tiemann recalls the impact of Stallman's Manifesto. "It read like a socialist polemic, but I saw something different. I saw a business plan in disguise."7 + +Teaming up with John Gilmore, another GNU Project fan, Tiemann launched a software consulting service dedicated to customizing GNU programs. Dubbed Cygnus Support, the company signed its first development contract in February, 1990. By the end of the year, the company had $725,000 worth of support and development contracts. + +GNU Emacs, GDB, and GCC were the "big three" of developer-oriented tools, but they weren't the only ones developed by Stallman during the GNU Project's first half decade. By 1990, Stallman had also generated GNU versions of the Bourne Shell (rechristened the Bourne Again Shell, or BASH), YACC (rechristened Bison), and awk (rechristened gawk). Like GCC , every GNU program had to be designed to run on multiple systems, not just a single vendor's platform. In the process of making programs more flexible, Stallman and his collaborators often made them more useful as well. + +Recalling the GNU universalist approach, Prime Time Freeware's Morin points to a critical, albeit mundane, software package called hello. "It's the hello world program which is five lines of C, packaged up as if it were a GNU distribution," Morin says. "And so it's got the Texinfo stuff and the configure stuff. It's got all the other software engineering goo that the GNU Project has come up with to allow packages to port to all these different environments smoothly. That's tremendously important work, and it affects not only all of [Stallman's] software, but also all of the other GNU Project software." + +According to Stallman, improving software programs was secondary to building them in the first place. "With each piece I may or may not find a way to improve it," said Stallman to Byte. "To some extent I am getting the benefit of reimplementation, which makes many systems much better. To some extent it's because I have been in the field a long time and worked on many other systems. I therefore have many ideas to bring to bear."8 + +Nevertheless, as GNU tools made their mark in the late 1980s, Stallman's AI Lab-honed reputation for design fastidiousness soon became legendary throughout the entire software-development community. + +Jeremy Allison, a Sun user during the late 1980s and programmer destined to run his own free software project, Samba, in the 1990s, recalls that reputation with a laugh. During the late 1980s, Allison began using Emacs. Inspired by the program's community-development model, Allison says he sent in a snippet of source code only to have it rejected by Stallman. + +"It was like the Onion headline," Allison says. "`Child's prayers to God answered: No.'" + +Stallman's growing stature as a software programmer, however, was balanced by his struggles as a project manager. Although the GNU Project moved from success to success in creation of developer-oriented tools, its inability to generate a working kernel-the central "traffic cop" program in all Unix systems that determines which devices and applications get access to the microprocessor and when-was starting to elicit grumbles as the 1980s came to a close. As with most GNU Project efforts, Stallman had started kernel development by looking for an existing program to modify. According to a January 1987 "Gnusletter," Stallman was already working to overhaul TRIX, a Unix kernel developed at MIT. + +A review of GNU Project "GNUsletters" of the late 1980s reflects the management tension. In January, 1987, Stallman announced to the world that the GNU Project was working to overhaul TRIX, a Unix kernel developed at MIT. A year later, in February of 1988, the GNU Project announced that it had shifted its attentions to Mach, a lightweight "micro-kernel" developed at Carnegie Mellon. All told, however, official GNU Project kernel development wouldn't commence until 1990.9 + +The delays in kernel development were just one of many concerns weighing on Stallman during this period. In 1989, Lotus Development Corporation filed suit against rival software company, Paperback Software International, for copying menu commands in Lotus' popular 1-2-3 Spreadsheet program. Lotus' suit, coupled with the Apple -Microsoft "look and feel" battle, provided a troublesome backdrop for the GNU Project. Although both suits fell outside the scope of the GNU Project, both revolved around operating systems and software applications developed for the personal computer, not Unix-compatible hardware systems-they threatened to impose a chilling effect on the entire culture of software development. Determined to do something, Stallman recruited a few programmer friends and composed a magazine ad blasting the lawsuits. He then followed up the ad by helping to organize a group to protest the corporations filing the suit. Calling itself the League of Programming Freedom, the group held protests outside the offices of Lotus, Inc. and the Boston courtroom hosting the Lotus trial. + +The protests were notable.10 They document the evolving nature of software industry. Applications had quietly replaced operating systems as the primary corporate battleground. In its unfulfilled quest to build a free software operating system, the GNU Project seemed hopelessly behind the times. Indeed, the very fact that Stallman had felt it necessary to put together an entirely new group dedicated to battling the "look and feel" lawsuits reinforced that obsolescence in the eyes of some observers. + +In 1990, the John D. and Catherine T. MacArthur Foundation cerified Stallman's genius status when it granted Stallman a MacArthur fellowship, therefore making him a recipient for the organization's so-called "genius grant." The grant, a $240,000 reward for launching the GNU Project and giving voice to the free software philosophy, relieved a number of short-term concerns. First and foremost, it gave Stallman, a nonsalaried employee of the FSF who had been supporting himself through consulting contracts, the ability to devote more time to writing GNU code.11 + +Ironically, the award also made it possible for Stallman to vote. Months before the award, a fire in Stallman's apartment house had consumed his few earthly possessions. By the time of the award, Stallman was listing himself as a "squatter"12 at 545 Technology Square. "[The registrar of voters] didn't want to accept that as my address," Stallman would later recall. "A newspaper article about the MacArthur grant said that and then they let me register."13 + +Most importantly, the MacArthur money gave Stallman more freedom. Already dedicated to the issue of software freedom, Stallman chose to use the additional freedom to increase his travels in support of the GNU Project mission. + +Interestingly, the ultimate success of the GNU Project and the free software movement in general would stem from one of these trips. In 1990, Stallman paid a visit to the Polytechnic University in Helsinki, Finland. Among the audience members was 21-year-old Linus Torvalds, future developer of the Linux kernel-the free software kernel destined to fill the GNU Project's most sizable gap. + +A student at the nearby University of Helsinki at the time, Torvalds regarded Stallman with bemusement. "I saw, for the first time in my life, the stereotypical long-haired, bearded hacker type," recalls Torvalds in his 2001 autobiography Just for Fun. "We don't have much of them in Helsinki."14 + +While not exactly attuned to the "sociopolitical" side of the Stallman agenda, Torvalds nevertheless appreciated the agenda's underlying logic: no programmer writes error-free code. By sharing software, hackers put a program's improvement ahead of individual motivations such as greed or ego protection. + +Like many programmers of his generation, Torvalds had cut his teeth not on mainframe computers like the IBM 7094, but on a motley assortment of home-built computer systems. As university student, Torvalds had made the step up from C programming to Unix, using the university's MicroVAX. This ladder-like progression had given Torvalds a different perspective on the barriers to machine access. For Stallman, the chief barriers were bureaucracy and privilege. For Torvalds, the chief barriers were geography and the harsh Helsinki winter. Forced to trek across the University of Helsinki just to log in to his Unix account, Torvalds quickly began looking for a way to log in from the warm confines of his off-campus apartment. + +The search led Torvalds to the operating system Minix, a lightweight version of Unix developed for instructional purposes by Dutch university professor Andrew Tanenbaum. The program fit within the memory confines of a 386 PC, the most powerful machine Torvalds could afford, but still lacked a few necessary features. It most notably lacked terminal emulation, the feature that allowed Torvalds' machine to mimic a university terminal, making it possible to log in to the MicroVAX from home. + +During the summer of 1991, Torvalds rewrote Minix from the ground up, adding other features as he did so. By the end of the summer, Torvalds was referring to his evolving work as the "GNU/Emacs of terminal emulation programs."15 Feeling confident, he solicited a Minix newsgroup for copies of the POSIX standards, the software blue prints that determined whether a program was Unix compatible. A few weeks later, Torvalds was posting a message eerily reminiscent of Stallman's original 1983 GNU posting: + +Hello everybody out there using minix- + +I'm doing a (free) operating system (just a hobby, won't be big and +professional like gnu for 386 (486) AT clones). This has been brewing +since April, and is starting to get ready. I'd like any feedback on +things people like/dislike in minix, as my OS resembles it somewhat +(same physical layout of the file-system (due to practical reasons) +among other things).16 + +The posting drew a smattering of responses and within a month, Torvalds had posted a 0.01 version of the operating system-i.e., the earliest possible version fit for outside review-on an Internet FTP site. In the course of doing so, Torvalds had to come up with a name for the new system. On his own PC hard drive, Torvalds had saved the program as Linux, a name that paid its respects to the software convention of giving each Unix variant a name that ended with the letter X. Deeming the name too "egotistical," Torvalds changed it to Freax, only to have the FTP site manager change it back. + +Although Torvalds had set out build a full operating system, both he and other developers knew at the time that most of the functional tools needed to do so were already available, thanks to the work of GNU, BSD, and other free software developers. One of the first tools the Linux development team took advantage of was the GNU C Compiler, a tool that made it possible to process programs written in the C programming language. + +Integrating GCC improved the performance of Linux. It also raised issues. Although the GPL's "viral" powers didn't apply to the Linux kernel, Torvald's willingness to borrow GCC for the purposes of his own free software operating system indicated a certain obligation to let other users borrow back. As Torvalds would later put it: "I had hoisted myself up on the shoulders of giants."17 Not surprisingly, he began to think about what would happen when other people looked to him for similar support. A decade after the decision, Torvalds echoes the Free Software Foundation's Robert Chassel when he sums up his thoughts at the time: + + You put six months of your life into this thing and you want to make it available and you want to get something out of it, but you don't want people to take advantage of it. I wanted people to be able to see [Linux], and to make changes and improvements to their hearts' content. But I also wanted to make sure that what I got out of it was to see what they were doing. I wanted to always have access to the sources so that if they made improvements, I could make those improvements myself.18 + +When it was time to release the 0.12 version of Linux, the first to include a fully integrated version of GCC, Torvalds decided to voice his allegiance with the free software movement. He discarded the old kernel license and replaced it with the GPL. The decision triggered a porting spree, as Torvalds and his collaborators looked to other GNU programs to fold into the growing Linux stew. Within three years, Linux developers were offering their first production release, Linux 1.0, including fully modified versions of GCC, GDB, and a host of BSD tools. + +By 1994, the amalgamated operating system had earned enough respect in the hacker world to make some observers wonder if Torvalds hadn't given away the farm by switching to the GPL in the project's initial months. In the first issue of Linux Journal, publisher Robert Young sat down with Torvalds for an interview. When Young asked the Finnish programmer if he felt regret at giving up private ownership of the Linux source code, Torvalds said no. "Even with 20/20 hindsight," Torvalds said, he considered the GPL "one of the very best design decisions" made during the early stages of the Linux project.19 + +That the decision had been made with zero appeal or deference to Stallman and the Free Software Foundation speaks to the GPL's growing portability. Although it would take a few years to be recognized by Stallman, the explosiveness of Linux development conjured flashbacks of Emacs. This time around, however, the innovation triggering the explosion wasn't a software hack like Control-R but the novelty of running a Unix-like system on the PC architecture. The motives may have been different, but the end result certainly fit the ethical specifications: a fully functional operating system composed entirely of free software. + +As his initial email message to the comp.os.minix newsgroup indicates, it would take a few months before Torvalds saw Linux as anything less than a holdover until the GNU developers delivered on the HURD kernel. This initial unwillingness to see Linux in political terms would represent a major blow to the Free Software Foundation. + +As far as Torvalds was concerned, he was simply the latest in a long line of kids taking apart and reassembling things just for fun. Nevertheless, when summing up the runaway success of a project that could have just as easily spent the rest of its days on an abandoned computer hard drive, Torvalds credits his younger self for having the wisdom to give up control and accept the GPL bargain. + +"I may not have seen the light," writes Torvalds, reflecting on Stallman's 1991 Polytechnic University speech and his subsequent decision to switch to the GPL. "But I guess something from his speech sunk in ." 20 + + +Chapter 10 +GNU/Linux +By 1993, the free software movement was at a crossroads. To the optimistically inclined, all signs pointed toward success for the hacker culture. Wired magazine, a funky, new publication offering stories on data encryption, Usenet, and software freedom, was flying off magazine racks. The Internet, once a slang term used only by hackers and research scientists, had found its way into mainstream lexicon. Even President Clinton was using it. The personal computer, once a hobbyist's toy, had grown to full-scale respectability, giving a whole new generation of computer users access to hacker-built software. And while the GNU Project had not yet reached its goal of a fully intact, free software operating system, curious users could still try Linux in the interim. + +Any way you sliced it, the news was good, or so it seemed. After a decade of struggle, hackers and hacker values were finally gaining acceptance in mainstream society. People were getting it. + +Or were they? To the pessimistically inclined, each sign of acceptance carried its own troubling countersign. Sure, being a hacker was suddenly cool, but was cool good for a community that thrived on alienation? Sure, the White House was saying all the right things about the Internet, even going so far as to register its own domain name, whitehouse.gov, but it was also meeting with the companies, censorship advocates, and law-enforcement officials looking to tame the Internet's Wild West culture. Sure, PCs were more powerful, but in commoditizing the PC marketplace with its chips, Intel had created a situation in which proprietary software vendors now held the power. For every new user won over to the free software cause via Linux, hundreds, perhaps thousands, were booting up Microsoft Windows for the first time. + +Finally, there was the curious nature of Linux itself. Unrestricted by design bugs (like GNU) and legal disputes (like BSD), Linux' high-speed evolution had been so unplanned, its success so accidental, that programmers closest to the software code itself didn't know what to make of it. More compilation album than operating system, it was comprised of a hacker medley of greatest hits: everything from GCC, GDB, and glibc (the GNU Project's newly developed C Library) to X (a Unix-based graphic user interface developed by MIT's Laboratory for Computer Science) to BSD-developed tools such as BIND (the Berkeley Internet Naming Daemon, which lets users substitute easy-to-remember Internet domain names for numeric IP addresses) and TCP/IP. The arch's capstone, of course, was the Linux kernel-itself a bored-out, super-charged version of Minix. Rather than building their operating system from scratch, Torvalds and his rapidly expanding Linux development team had followed the old Picasso adage, "good artists borrow; great artists steal." Or as Torvalds himself would later translate it when describing the secret of his success: "I'm basically a very lazy person who likes to take credit for things other people actually do."1 + +Such laziness, while admirable from an efficiency perspective, was troubling from a political perspective. For one thing, it underlined the lack of an ideological agenda on Torvalds' part. Unlike the GNU developers, Torvalds hadn't built an operating system out of a desire to give his fellow hackers something to work with; he'd built it to have something he himself could play with. Like Tom Sawyer whitewashing a fence, Torvalds' genius lay less in the overall vision and more in his ability to recruit other hackers to speed the process. + +That Torvalds and his recruits had succeeded where others had not raised its own troubling question: what, exactly, was Linux? Was it a manifestation of the free software philosophy first articulated by Stallman in the GNU Manifesto? Or was it simply an amalgamation of nifty software tools that any user, similarly motivated, could assemble on his own home system? + +By late 1993, a growing number of Linux users had begun to lean toward the latter definition and began brewing private variations on the Linux theme. They even became bold enough to bottle and sell their variations-or "distributions"-to fellow Unix aficionados. The results were spotty at best. + +"This was back before Red Hat and the other commercial distributions," remembers Ian Murdock, then a computer science student at Purdue University. "You'd flip through Unix magazines and find all these business card-sized ads proclaiming `Linux.' Most of the companies were fly-by-night operations that saw nothing wrong with slipping a little of their own source code into the mix." + +Murdock, a Unix programmer, remembers being "swept away" by Linux when he first downloaded and installed it on his home PC system. "It was just a lot of fun," he says. "It made me want to get involved." The explosion of poorly built distributions began to dampen his early enthusiasm, however. Deciding that the best way to get involved was to build a version of Linux free of additives, Murdock set about putting a list of the best free software tools available with the intention of folding them into his own distribution. "I wanted something that would live up to the Linux name," Murdock says. + +In a bid to "stir up some interest," Murdock posted his intentions on the Internet, including Usenet's comp.os.linux newsgroup. One of the first responding email messages was from rms@ai.mit.edu. As a hacker, Murdock instantly recognized the address. It was Richard M. Stallman, founder of the GNU Project and a man Murdock knew even back then as "the hacker of hackers." Seeing the address in his mail queue, Murdock was puzzled. Why on Earth would Stallman, a person leading his own operating-system project, care about Murdock's gripes over Linux? + +Murdock opened the message. + +"He said the Free Software Foundation was starting to look closely at Linux and that the FSF was interested in possibly doing a Linux system, too. Basically, it looked to Stallman like our goals were in line with their philosophy." + +The message represented a dramatic about-face on Stallman's part. Until 1993, Stallman had been content to keep his nose out of the Linux community's affairs. In fact, he had all but shunned the renegade operating system when it first appeared on the Unix programming landscape in 1991. After receiving the first notification of a Unix-like operating system that ran on PCs, Stallman says he delegated the task of examining the new operating system to a friend. Recalls Stallman, "He reported back that the software was modeled after System V, which was the inferior version of Unix. He also told me it wasn't portable." + +The friend's report was correct. Built to run on 386-based machines, Linux was firmly rooted to its low-cost hardware platform. What the friend failed to report, however, was the sizable advantage Linux enjoyed as the only freely modifiable operating system in the marketplace. In other words, while Stallman spent the next three years listening to bug reports from his HURD team, Torvalds was winning over the programmers who would later uproot and replant the operating system onto new platforms. + +By 1993, the GNU Project's inability to deliver a working kernel was leading to problems both within the GNU Project and within the free software movement at large. A March, 1993, a Wired magazine article by Simson Garfinkel described the GNU Project as "bogged down" despite the success of the project's many tools.2 Those within the project and its nonprofit adjunct, the Free Software Foundation, remember the mood as being even worse than Garfinkel's article let on. "It was very clear, at least to me at the time, that there was a window of opportunity to introduce a new operating system," says Chassell. "And once that window was closed, people would become less interested. Which is in fact exactly what happened."3 + +Much has been made about the GNU Project's struggles during the 1990-1993 period. While some place the blame on Stallman for those struggles, Eric Raymond, an early member of the GNU Emacs team and later Stallman critic, says the problem was largely institutional. "The FSF got arrogant," Raymond says. "They moved away from the goal of doing a production-ready operating system to doing operating-system research." Even worse, "They thought nothing outside the FSF could affect them." + +Murdock, a person less privy to the inner dealings of the GNU Project, adopts a more charitable view. "I think part of the problem is they were a little too ambitious and they threw good money after bad," he says. "Micro-kernels in the late 80s and early 90s were a hot topic. Unfortunately, that was about the time that the GNU Project started to design their kernel. They ended up with alot of baggage and it would have taken a lot of backpedaling to lose it." + +Stallman cites a number of issues when explaining the delay. The Lotus and Apple lawsuits had provided political distractions, which, coupled with Stallman's inability to type, made it difficult for Stallman to lend a helping hand to the HURD team. Stallman also cites poor communication between various portions of the GNU Project. "We had to do a lot of work to get the debugging environment to work," he recalls. "And the people maintaining GDB at the time were not that cooperative." Mostly, however, Stallman says he and the other members of the GNU Project team underestimated the difficulty of expanding the Mach microkernal into a full-fledged Unix kernel. + +"I figured, OK, the [Mach] part that has to talk to the machine has already been debugged," Stallman says, recalling the HURD team's troubles in a 2000 speech. "With that head start, we should be able to get it done faster. But instead, it turned out that debugging these asynchronous multithreaded programs was really hard. There were timing books that would clobber the files, and that's no fun. The end result was that it took many, many years to produce a test version."4 + +Whatever the excuse, or excuses, the concurrent success of the Linux-kernel team created a tense situation. Sure, the Linux kernel had been licensed under the GPL, but as Murdock himself had noted, the desire to treat Linux as a purely free software operating system was far from uniform. By late 1993, the total Linux user population had grown from a dozen or so Minix enthusiasts to somewhere between 20,000 and 100,000.5 What had once been a hobby was now a marketplace ripe for exploitation. Like Winston Churchill watching Soviet troops sweep into Berlin, Stallman felt an understandable set of mixed emotions when it came time to celebrate the Linux "victory."6 + +Although late to the party, Stallman still had clout. As soon as the FSF announced that it would lend its money and moral support to Murdock's software project, other offers of support began rolling in. Murdock dubbed the new project Debian-a compression of his and his wife, Deborah's, names-and within a few weeks was rolling out the first distribution. "[Richard's support] catapulted Debian almost overnight from this interesting little project to something people within the community had to pay attention to," Murdock says. + +In January of 1994, Murdock issued the " Debian Manifesto." Written in the spirit of Stallman's "GNU Manifesto" from a decade before, it explained the importance of working closely with the Free Software Foundation. Murdock wrote: + + The Free Software Foundation plays an extremely important role in the future of Debian. By the simple fact that they will be distributing it, a message is sent to the world that Linux is not a commercial product and that it never should be, but that this does not mean that Linux will never be able to compete commercially. For those of you who disagree, I challenge you to rationalize the success of GNU Emacs and GCC, which are not commercial software but which have had quite an impact on the commercial market regardless of that fact. + + The time has come to concentrate on the future of Linux rather than on the destructive goal of enriching oneself at the expense of the entire Linux community and its future. The development and distribution of Debian may not be the answer to the problems that I have outlined in the Manifesto, but I hope that it will at least attract enough attention to these problems to allow them to be solved.7 + +Shortly after the Manifesto's release, the Free Software Foundation made its first major request. Stallman wanted Murdock to call its distribution "GNU/Linux." At first, Murdock says, Stallman had wanted to use the term " Lignux"-"as in Linux with GNU at the heart of it"-but a sample testing of the term on Usenet and in various impromptu hacker focus groups had merited enough catcalls to convince Stallman to go with the less awkward GNU/Linux. + +Although some would dismiss Stallman's attempt to add the "GNU" prefix as a belated quest for credit, Murdock saw it differently. Looking back, Murdock saw it as an attempt to counteract the growing tension between GNU Project and Linux-kernel developers. "There was a split emerging," Murdock recalls. "Richard was concerned." + +The deepest split, Murdock says, was over glibc. Short for GNU C Library, glibc is the package that lets programmers make "system calls" directed at the kernel. Over the course of 1993-1994, glibc emerged as a troublesome bottleneck in Linux development. Because so many new users were adding new functions to the Linux kernel, the GNU Project's glibc maintainers were soon overwhelmed with suggested changes. Frustrated by delays and the GNU Project's growing reputation for foot-dragging, some Linux developers suggested creating a " fork"-i.e., a Linux-specific C Library parallel to glibc. + +In the hacker world, forks are an interesting phenomenon. Although the hacker ethic permits a programmer to do anything he wants with a given program's source code, most hackers prefer to pour their innovations into a central source-code file or " tree" to ensure compatibility with other people's programs. To fork glibc this early in the development of Linux would have meant losing the potential input of hundreds, even thousands, of Linux developers. It would also mean growing incompatibility between Linux and the GNU system that Stallman and the GNU team still hoped to develop. + +As leader of the GNU Project, Stallman had already experienced the negative effects of a software fork in 1991. A group of Emacs developers working for a software company named Lucid had a falling out over Stallman's unwillingness to fold changes back into the GNU Emacs code base. The fork had given birth to a parallel version, Lucid Emacs, and hard feelings all around.8 + +Murdock says Debian was mounting work on a similar fork in glibc source code that motivated Stallman to insist on adding the GNU prefix when Debian rolled out its software distribution. "The fork has since converged. Still, at the time, there was a concern that if the Linux community saw itself as a different thing as the GNU community, it might be a force for disunity." + +Stallman seconds Murdock's recollection. In fact, he says there were nascent forks appearing in relation to every major GNU component. At first, Stallman says he considered the forks to be a product of sour grapes. In contrast to the fast and informal dynamics of the Linux-kernel team, GNU source-code maintainers tended to be slower and more circumspect in making changes that might affect a program's long-term viability. They also were unafraid of harshly critiquing other people's code. Over time, however, Stallman began to sense that there was an underlying lack of awareness of the GNU Project and its objectives when reading Linux developers' emails. + +"We discovered that the people who considered themselves Linux users didn't care about the GNU Project," Stallman says. "They said, `Why should I bother doing these things? I don't care about the GNU Project. It's working for me. It's working for us Linux users, and nothing else matters to us.' And that was quite surprising given that people were essentially using a variant of the GNU system, and they cared so little. They cared less than anybody else about GNU." + +While some viewed descriptions of Linux as a "variant" of the GNU Project as politically grasping, Murdock, already sympathetic to the free software cause, saw Stallman's request to call Debian's version GNU/Linux as reasonable. "It was more for unity than for credit," he says. + +Requests of a more technical nature quickly followed. Although Murdock had been accommodating on political issues, he struck a firmer pose when it came to the design and development model of the actual software. What had begun as a show of solidarity soon became of model of other GNU projects. + +"I can tell you that I've had my share of disagreements with him," says Murdock with a laugh. "In all honesty Richard can be a fairly difficult person to work with." + +In 1996, Murdock, following his graduation from Purdue, decided to hand over the reins of the growing Debian project. He had already been ceding management duties to Bruce Perens, the hacker best known for his work on Electric Fence, a Unix utility released under the GPL. Perens, like Murdock, was a Unix programmer who had become enamored of GNU/Linux as soon as the program's Unix-like abilities became manifest. Like Murdock, Perens sympathized with the political agenda of Stallman and the Free Software Foundation, albeit from afar. + +"I remember after Stallman had already come out with the GNU Manifesto, GNU Emacs, and GCC, I read an article that said he was working as a consultant for Intel," says Perens, recalling his first brush with Stallman in the late 1980s. "I wrote him asking how he could be advocating free software on the one hand and working for Intel on the other. He wrote back saying, `I work as a consultant to produce free software.' He was perfectly polite about it, and I thought his answer made perfect sense." + +As a prominent Debian developer, however, Perens regarded Murdock's design battles with Stallman with dismay. Upon assuming leadership of the development team, Perens says he made the command decision to distance Debian from the Free Software Foundation. "I decided we did not want Richard's style of micro-management," he says. + +According to Perens, Stallman was taken aback by the decision but had the wisdom to roll with it. "He gave it some time to cool off and sent a message that we really needed a relationship. He requested that we call it GNU/Linux and left it at that. I decided that was fine. I made the decision unilaterally. Everybody breathed a sigh of relief." + +Over time, Debian would develop a reputation as the hacker's version of Linux, alongside Slackware, another popular distribution founded during the same 1993-1994 period. Outside the realm of hacker-oriented systems, however, Linux was picking up steam in the commercial Unix marketplace. In North Carolina, a Unix company billing itself as Red Hat was revamping its business to focus on Linux. The chief executive officer was Robert Young, the former Linux Journal editor who in 1994 had put the question to Linus Torvalds, asking whether he had any regrets about putting the kernel under the GPL. To Young, Torvalds' response had a "profound" impact on his own view toward Linux. Instead of looking for a way to corner the GNU/Linux market via traditional software tactics, Young began to consider what might happen if a company adopted the same approach as Debian-i.e., building an operating system completely out of free software parts. Cygnus Solutions, the company founded by Michael Tiemann and John Gilmore in 1990, was already demonstrating the ability to sell free software based on quality and customizability. What if Red Hat took the same approach with GNU/Linux? + +"In the western scientific tradition we stand on the shoulders of giants," says Young, echoing both Torvalds and Sir Isaac Newton before him. "In business, this translates to not having to reinvent wheels as we go along. The beauty of [the GPL] model is you put your code into the public domain.9 If you're an independent software vendor and you're trying to build some application and you need a modem-dialer, well, why reinvent modem dialers? You can just steal PPP off of Red Hat Linux and use that as the core of your modem-dialing tool. If you need a graphic tool set, you don't have to write your own graphic library. Just download GTK. Suddenly you have the ability to reuse the best of what went before. And suddenly your focus as an application vendor is less on software management and more on writing the applications specific to your customer's needs." + +Young wasn't the only software executive intrigued by the business efficiencies of free software. By late 1996, most Unix companies were starting to wake up and smell the brewing source code. The Linux sector was still a good year or two away from full commercial breakout mode, but those close enough to the hacker community could feel it: something big was happening. The Intel 386 chip, the Internet, and the World Wide Web had hit the marketplace like a set of monster waves, and Linux-and the host of software programs that echoed it in terms of source-code accessibility and permissive licensing-seemed like the largest wave yet. + +For Ian Murdock, the programmer courted by Stallman and then later turned off by Stallman's micromanagement style, the wave seemed both a fitting tribute and a fitting punishment for the man who had spent so much time giving the free software movement an identity. Like many Linux aficionados, Murdock had seen the original postings. He'd seen Torvalds's original admonition that Linux was "just a hobby." He'd also seen Torvalds's admission to Minix creator Andrew Tanenbaum: "If the GNU kernel had been ready last spring, I'd not have bothered to even start my project." 10 Like many, Murdock knew the opportunities that had been squandered. He also knew the excitement of watching new opportunities come seeping out of the very fabric of the Internet. + +"Being involved with Linux in those early days was fun," recalls Murdock. "At the same time, it was something to do, something to pass the time. If you go back and read those old [comp.os.minix] exchanges, you'll see the sentiment: this is something we can play with until the HURD is ready. People were anxious. It's funny, but in a lot of ways, I suspect that Linux would never have happened if the HURD had come along more quickly." + +By the end of 1996, however, such "what if" questions were already moot. Call it Linux, call it GNU/Linux; the users had spoken. The 36-month window had closed, meaning that even if the GNU Project had rolled out its HURD kernel, chances were slim anybody outside the hard-core hacker community would have noticed. The first Unix-like free software operating system was here, and it had momentum. All hackers had left to do was sit back and wait for the next major wave to come crashing down on their heads. Even the shaggy-haired head of one Richard M. Stallman. + +Ready or not. + + +Chapter 11 +Open Source +In November , 1995, Peter Salus, a member of the Free Software Foundation and author of the 1994 book, A Quarter Century of Unix, issued a call for papers to members of the GNU Project's "system-discuss" mailing list. Salus, the conference's scheduled chairman, wanted to tip off fellow hackers about the upcoming Conference on Freely Redistributable Software in Cambridge, Massachusetts. Slated for February, 1996 and sponsored by the Free Software Foundation, the event promised to be the first engineering conference solely dedicated to free software and, in a show of unity with other free software programmers, welcomed papers on "any aspect of GNU, Linux, NetBSD, 386BSD, FreeBSD, Perl, Tcl/tk, and other tools for which the code is accessible and redistributable." Salus wrote: + + Over the past 15 years, free and low-cost software has become ubiquitous. This conference will bring together implementers of several different types of freely redistributable software and publishers of such software (on various media). There will be tutorials and refereed papers, as well as keynotes by Linus Torvalds and Richard Stallman.1 + +One of the first people to receive Salus' email was conference committee member Eric S. Raymond. Although not the leader of a project or company like the various other members of the list, Raymond had built a tidy reputation within the hacker community as a major contributor to GNU Emacs and as editor of The New Hacker Dictionary, a book version of the hacking community's decade-old Jargon File. + +For Raymond, the 1996 conference was a welcome event. Active in the GNU Project during the 1980s, Raymond had distanced himself from the project in 1992, citing, like many others before him, Stallman's "micro-management" style. "Richard kicked up a fuss about my making unauthorized modifications when I was cleaning up the Emacs LISP libraries," Raymond recalls. "It frustrated me so much that I decided I didn't want to work with him anymore." + +Despite the falling out, Raymond remained active in the free software community. So much so that when Salus suggested a conference pairing Stallman and Torvalds as keynote speakers, Raymond eagerly seconded the idea. With Stallman representing the older, wiser contingent of ITS/Unix hackers and Torvalds representing the younger, more energetic crop of Linux hackers, the pairing indicated a symbolic show of unity that could only be beneficial, especially to ambitious younger (i.e., below 40) hackers such as Raymond. "I sort of had a foot in both camps," Raymond says. + +By the time of the conference, the tension between those two camps had become palpable. Both groups had one thing in common, though: the conference was their first chance to meet the Finnish wunderkind in the flesh. Surprisingly, Torvalds proved himself to be a charming, affable speaker. Possessing only a slight Swedish accent, Torvalds surprised audience members with his quick, self-effacing wit.2 Even more surprising, says Raymond, was Torvalds' equal willingness to take potshots at other prominent hackers, including the most prominent hacker of all, Richard Stallman. By the end of the conference, Torvalds' half-hacker, half-slacker manner was winning over older and younger conference-goers alike. + +"It was a pivotal moment," recalls Raymond. "Before 1996, Richard was the only credible claimant to being the ideological leader of the entire culture. People who dissented didn't do so in public. The person who broke that taboo was Torvalds." + +The ultimate breach of taboo would come near the end of the show. During a discussion on the growing market dominance of Microsoft Windows or some similar topic, Torvalds admitted to being a fan of Microsoft's PowerPoint slideshow software program. From the perspective of old-line software purists, it was like a Mormon bragging in church about his fondness of whiskey. From the perspective of Torvalds and his growing band of followers, it was simply common sense. Why shun worthy proprietary software programs just to make a point? Being a hacker wasn't about suffering, it was about getting the job done. + +"That was a pretty shocking thing to say," Raymond remembers. "Then again, he was able to do that, because by 1995 and 1996, he was rapidly acquiring clout." + +Stallman, for his part, doesn't remember any tension at the 1996 conference, but he does remember later feeling the sting of Torvalds' celebrated cheekiness. "There was a thing in the Linux documentation which says print out the GNU coding standards and then tear them up," says Stallman, recalling one example. "OK, so he disagrees with some of our conventions. That's fine, but he picked a singularly nasty way of saying so. He could have just said `Here's the way I think you should indent your code.' Fine. There should be no hostility there." + +For Raymond, the warm reception other hackers gave to Torvalds' comments merely confirmed his suspicions. The dividing line separating Linux developers from GNU/Linux developers was largely generational. Many Linux hackers, like Torvalds, had grown up in a world of proprietary software. Unless a program was clearly inferior, most saw little reason to rail against a program on licensing issues alone. Somewhere in the universe of free software systems lurked a program that hackers might someday turn into a free software alternative to PowerPoint. Until then, why begrudge Microsoft the initiative of developing the program and reserving the rights to it? + +As a former GNU Project member, Raymond sensed an added dynamic to the tension between Stallman and Torvalds. In the decade since launching the GNU Project, Stallman had built up a fearsome reputation as a programmer. He had also built up a reputation for intransigence both in terms of software design and people management. Shortly before the 1996 conference, the Free Software Foundation would experience a full-scale staff defection, blamed in large part on Stallman. Brian Youmans, a current FSF staffer hired by Salus in the wake of the resignations, recalls the scene: "At one point, Peter [Salus] was the only staff member working in the office." + +For Raymond, the defection merely confirmed a growing suspicion: recent delays such as the HURD and recent troubles such as the Lucid-Emacs schism reflected problems normally associated with software project management, not software code development. Shortly after the Freely Redistributable Software Conference, Raymond began working on his own pet software project, a popmail utility called " fetchmail." Taking a cue from Torvalds, Raymond issued his program with a tacked-on promise to update the source code as early and as often as possible. When users began sending in bug reports and feature suggestions, Raymond, at first anticipating a tangled mess, found the resulting software surprisingly sturdy. Analyzing the success of the Torvalds approach, Raymond issued a quick analysis: using the Internet as his "petri dish" and the harsh scrutiny of the hacker community as a form of natural selection, Torvalds had created an evolutionary model free of central planning. + +What's more, Raymond decided, Torvalds had found a way around Brooks' Law. First articulated by Fred P. Brooks, manager of IBM's OS/360 project and author of the 1975 book, The Mythical Man-Month, Brooks' Law held that adding developers to a project only resulted in further project delays. Believing as most hackers that software, like soup, benefits from a limited number of cooks, Raymond sensed something revolutionary at work. In inviting more and more cooks into the kitchen, Torvalds had actually found away to make the resulting software better.3 + +Raymond put his observations on paper. He crafted them into a speech, which he promptly delivered before a group of friends and neighbors in Chester County, Pennsylvania. Dubbed " The Cathedral and the Bazaar," the speech contrasted the management styles of the GNU Project with the management style of Torvalds and the kernel hackers. Raymond says the response was enthusiastic, but not nearly as enthusiastic as the one he received during the 1997 Linux Kongress, a gathering of Linux users in Germany the next spring. + +"At the Kongress, they gave me a standing ovation at the end of the speech," Raymond recalls. "I took that as significant for two reasons. For one thing, it meant they were excited by what they were hearing. For another thing, it meant they were excited even after hearing the speech delivered through a language barrier." + +Eventually, Raymond would convert the speech into a paper, also titled "The Cathedral and the Bazaar." The paper drew its name from Raymond's central analogy. GNU programs were "cathedrals," impressive, centrally planned monuments to the hacker ethic, built to stand the test of time. Linux, on the other hand, was more like "a great babbling bazaar," a software program developed through the loose decentralizing dynamics of the Internet. + +Implicit within each analogy was a comparison of Stallman and Torvalds. Where Stallman served as the classic model of the cathedral architect-i.e., a programming "wizard" who could disappear for 18 months and return with something like the GNU C Compiler-Torvalds was more like a genial dinner-party host. In letting others lead the Linux design discussion and stepping in only when the entire table needed a referee, Torvalds had created a development model very much reflective of his own laid-back personality. From the Torvalds' perspective, the most important managerial task was not imposing control but keeping the ideas flowing. + +Summarized Raymond, "I think Linus's cleverest and most consequential hack was not the construction of the Linux kernel itself, but rather his invention of the Linux development model."4 + +In summarizing the secrets of Torvalds' managerial success, Raymond himself had pulled off a coup. One of the audience members at the Linux Kongress was Tim O'Reilly, publisher of O'Reilly & Associates, a company specializing in software manuals and software-related books (and the publisher of this book). After hearing Raymond's Kongress speech, O'Reilly promptly invited Raymond to deliver it again at the company's inaugural Perl Conference later that year in Monterey, California. + +Although the conference was supposed to focus on Perl, a scripting language created by Unix hacker Larry Wall, O'Reilly assured Raymond that the conference would address other free software technologies. Given the growing commercial interest in Linux and Apache, a popular free software web server, O'Reilly hoped to use the event to publicize the role of free software in creating the entire infrastructure of the Internet. From web-friendly languages such as Perl and Python to back-room programs such as BIND (the Berkeley Internet Naming Daemon), a software tool that lets users replace arcane IP numbers with the easy-to-remember domain-name addresses (e.g., amazon.com), and sendmail, the most popular mail program on the Internet, free software had become an emergent phenomenon. Like a colony of ants creating a beautiful nest one grain of sand at a time, the only thing missing was the communal self-awareness. O'Reilly saw Raymond's speech as a good way to inspire that self-awareness, to drive home the point that free software development didn't start and end with the GNU Project. Programming languages, such as Perl and Python, and Internet software, such as BIND, sendmail, and Apache, demonstrated that free software was already ubiquitous and influential. He also assured Raymond an even warmer reception than the one at Linux Kongress. + +O'Reilly was right. "This time, I got the standing ovation before the speech," says Raymond, laughing. + +As predicted, the audience was stocked not only with hackers, but with other people interested in the growing power of the free software movement. One contingent included a group from Netscape, the Mountain View, California startup then nearing the end game of its three-year battle with Microsoft for control of the web-browser market. + +Intrigued by Raymond's speech and anxious to win back lost market share, Netscape executives took the message back to corporate headquarters. A few months later, in January, 1998, the company announced its plan to publish the source code of its flagship Navigator web browser in the hopes of enlisting hacker support in future development. + +When Netscape CEO Jim Barksdale cited Raymond's "Cathedral and the Bazaar" essay as a major influence upon the company's decision, the company instantly elevated Raymond to the level of hacker celebrity. Determined not to squander the opportunity, Raymond traveled west to deliver interviews, advise Netscape executives, and take part in the eventual party celebrating the publication of Netscape Navigator's source code. The code name for Navigator's source code was "Mozilla": a reference both to the program's gargantuan size-30 million lines of code-and to its heritage. Developed as a proprietary offshoot of Mosaic, the web browser created by Marc Andreessen at the University of Illinois, Mozilla was proof, yet again, that when it came to building new programs, most programmers preferred to borrow on older, modifiable programs. + +While in California, Raymond also managed to squeeze in a visit to VA Research, a Santa Clara-based company selling workstations with the GNU/Linux operating system preinstalled. Convened by Raymond, the meeting was small. The invite list included VA founder Larry Augustin, a few VA employees, and Christine Peterson, president of the Foresight Institute, a Silicon Valley think tank specializing in nanotechnology. + +"The meeting's agenda boiled down to one item: how to take advantage of Netscape's decision so that other companies might follow suit?" Raymond doesn't recall the conversation that took place, but he does remember the first complaint addressed. Despite the best efforts of Stallman and other hackers to remind people that the word "free" in free software stood for freedom and not price, the message still wasn't getting through. Most business executives, upon hearing the term for the first time, interpreted the word as synonymous with "zero cost," tuning out any follow up messages in short order. Until hackers found a way to get past this cognitive dissonance, the free software movement faced an uphill climb, even after Netscape. + +Peterson, whose organization had taken an active interest in advancing the free software cause, offered an alternative: open source. + +Looking back, Peterson says she came up with the open source term while discussing Netscape's decision with a friend in the public relations industry. She doesn't remember where she came upon the term or if she borrowed it from another field, but she does remember her friend disliking the term.5 + +At the meeting, Peterson says, the response was dramatically different. "I was hesitant about suggesting it," Peterson recalls. "I had no standing with the group, so started using it casually, not highlighting it as a new term." To Peterson's surprise, the term caught on. By the end of the meeting, most of the attendees, including Raymond, seemed pleased by it. + +Raymond says he didn't publicly use the term "open source" as a substitute for free software until a day or two after the Mozilla launch party, when O'Reilly had scheduled a meeting to talk about free software. Calling his meeting "the Freeware Summit," O'Reilly says he wanted to direct media and community attention to the other deserving projects that had also encouraged Netscape to release Mozilla. "All these guys had so much in common, and I was surprised they didn't all know each other," says O'Reilly. "I also wanted to let the world know just how great an impact the free software culture had already made. People were missing out on a large part of the free software tradition." + +In putting together the invite list, however, O'Reilly made a decision that would have long-term political consequences. He decided to limit the list to west-coast developers such as Wall, Eric Allman, creator of sendmail, and Paul Vixie, creator of BIND. There were exceptions, of course: Pennsylvania-resident Raymond, who was already in town thanks to the Mozilla launch, earned a quick invite. So did Virginia-resident Guido van Rossum, creator of Python. "Frank Willison, my editor in chief and champion of Python within the company, invited him without first checking in with me," O'Reilly recalls. "I was happy to have him there, but when I started, it really was just a local gathering." + +For some observers, the unwillingness to include Stallman's name on the list qualified as a snub. "I decided not to go to the event because of it," says Perens, remembering the summit. Raymond, who did go, says he argued for Stallman's inclusion to no avail. The snub rumor gained additional strength from the fact that O'Reilly, the event's host, had feuded publicly with Stallman over the issue of software-manual copyrights. Prior to the meeting, Stallman had argued that free software manuals should be as freely copyable and modifiable as free software programs. O'Reilly, meanwhile, argued that a value-added market for nonfree books increased the utility of free software by making it more accessible to a wider community. The two had also disputed the title of the event, with Stallman insisting on "Free Software" over the less politically laden "Freeware." + +Looking back, O'Reilly doesn't see the decision to leave Stallman's name off the invite list as a snub. "At that time, I had never met Richard in person, but in our email interactions, he'd been inflexible and unwilling to engage in dialogue. I wanted to make sure the GNU tradition was represented at the meeting, so I invited John Gilmore and Michael Tiemann, whom I knew personally, and whom I knew were passionate about the value of the GPL but seemed more willing to engage in a frank back-and-forth about the strengths and weaknesses of the various free software projects and traditions. Given all the later brouhaha, I do wish I'd invited Richard as well, but I certainly don't think that my failure to do so should be interpreted as a lack of respect for the GNU Project or for Richard personally." + +Snub or no snub, both O'Reilly and Raymond say the term "open source" won over just enough summit-goers to qualify as a success. The attendees shared ideas and experiences and brainstormed on how to improve free software's image. Of key concern was how to point out the successes of free software, particularly in the realm of Internet infrastructure, as opposed to playing up the GNU/Linux challenge to Microsoft Windows. But like the earlier meeting at VA, the discussion soon turned to the problems associated with the term "free software." O'Reilly, the summit host, remembers a particularly insightful comment from Torvalds, a summit attendee. + +"Linus had just moved to Silicon Valley at that point, and he explained how only recently that he had learned that the word `free' had two meanings-free as in `libre' and free as in `gratis'-in English." + +Michael Tiemann, founder of Cygnus, proposed an alternative to the troublesome "free software" term: sourceware. "Nobody got too excited about it," O'Reilly recalls. "That's when Eric threw out the term `open source.'" + +Although the term appealed to some, support for a change in official terminology was far from unanimous. At the end of the one-day conference, attendees put the three terms-free software, open source, or sourceware-to a vote. According to O'Reilly, 9 out of the 15 attendees voted for "open source." Although some still quibbled with the term, all attendees agreed to use it in future discussions with the press. "We wanted to go out with a solidarity message," O'Reilly says. + +The term didn't take long to enter the national lexicon. Shortly after the summit, O'Reilly shepherded summit attendees to a press conference attended by reporters from the New York Times, the Wall Street Journal, and other prominent publications. Within a few months, Torvalds' face was appearing on the cover of Forbes magazine, with the faces of Stallman, Perl creator Larry Wall, and Apache team leader Brian Behlendorf featured in the interior spread. Open source was open for business. + +For summit attendees such as Tiemann, the solidarity message was the most important thing. Although his company had achieved a fair amount of success selling free software tools and services, he sensed the difficulty other programmers and entrepreneurs faced. + +"There's no question that the use of the word free was confusing in a lot of situations," Tiemann says. "Open source positioned itself as being business friendly and business sensible. Free software positioned itself as morally righteous. For better or worse we figured it was more advantageous to align with the open source crowd. + +For Stallman, the response to the new "open source" term was slow in coming. Raymond says Stallman briefly considered adopting the term, only to discard it. "I know because I had direct personal conversations about it," Raymond says. + +By the end of 1998, Stallman had formulated a position: open source, while helpful in communicating the technical advantages of free software, also encouraged speakers to soft-pedal the issue of software freedom. Given this drawback, Stallman would stick with the term free software. + +Summing up his position at the 1999 LinuxWorld Convention and Expo, an event billed by Torvalds himself as a "coming out party" for the Linux community, Stallman implored his fellow hackers to resist the lure of easy compromise. + +"Because we've shown how much we can do, we don't have to be desperate to work with companies or compromise our goals," Stallman said during a panel discussion. "Let them offer and we'll accept. We don't have to change what we're doing to get them to help us. You can take a single step towards a goal, then another and then more and more and you'll actually reach your goal. Or, you can take a half measure that means you don't ever take another step and you'll never get there." + +Even before the LinuxWorld show, however, Stallman was showing an increased willingness to alienate his more conciliatory peers. A few months after the Freeware Summit, O'Reilly hosted its second annual Perl Conference. This time around, Stallman was in attendance. During a panel discussion lauding IBM's decision to employ the free software Apache web server in its commercial offerings, Stallman, taking advantage of an audience microphone, disrupted the proceedings with a tirade against panelist John Ousterhout, creator of the Tcl scripting language. Stallman branded Ousterhout a "parasite" on the free software community for marketing a proprietary version of Tcl via Ousterhout's startup company, Scriptics. "I don't think Scriptics is necessary for the continued existence of Tcl," Stallman said to hisses from the fellow audience members.5 + +"It was a pretty ugly scene," recalls Prime Time Freeware's Rich Morin. "John's done some pretty respectable things: Tcl, Tk, Sprite. He's a real contributor." + +Despite his sympathies for Stallman and Stallman's position, Morin felt empathy for those troubled by Stallman's discordant behavior. + +Stallman's Perl Conference outburst would momentarily chase off another potential sympathizer, Bruce Perens. In 1998, Eric Raymond proposed launching the Open Source Initiative, or OSI, an organization that would police the use of the term "open source" and provide a definition for companies interested in making their own programs. Raymond recruited Perens to draft the definition.6 + +Perens would later resign from the OSI, expressing regret that the organization had set itself up in opposition to Stallman and the FSF. Still, looking back on the need for a free software definition outside the Free Software Foundation's auspices, Perens understands why other hackers might still feel the need for distance. "I really like and admire Richard," says Perens. "I do think Richard would do his job better if Richard had more balance. That includes going away from free software for a couple of months." + +Stallman's monomaniacal energies would do little to counteract the public-relations momentum of open source proponents. In August of 1998, when chip-maker Intel purchased a stake in GNU/Linux vendor Red Hat, an accompanying New York Times article described the company as the product of a movement "known alternatively as free software and open source."7 Six months later, a John Markoff article on Apple Computer was proclaiming the company's adoption of the "open source" Apache server in the article headline.8 + +Such momentum would coincide with the growing momentum of companies that actively embraced the "open source" term. By August of 1999, Red Hat, a company that now eagerly billed itself as "open source," was selling shares on Nasdaq. In December, VA Linux-formerly VA Research-was floating its own IPO to historical effect. Opening at $30 per share, the company's stock price exploded past the $300 mark in initial trading only to settle back down to the $239 level. Shareholders lucky enough to get in at the bottom and stay until the end experienced a 698% increase in paper wealth, a Nasdaq record. + +Among those lucky shareholders was Eric Raymond, who, as a company board member since the Mozilla launch, had received 150,000 shares of VA Linux stock. Stunned by the realization that his essay contrasting the Stallman-Torvalds managerial styles had netted him $36 million in potential wealth, Raymond penned a follow-up essay. In it, Raymond mused on the relationship between the hacker ethic and monetary wealth: + + Reporters often ask me these days if I think the open-source community will be corrupted by the influx of big money. I tell them what I believe, which is this: commercial demand for programmers has been so intense for so long that anyone who can be seriously distracted by money is already gone. Our community has been self-selected for caring about other things-accomplishment, pride, artistic passion, and each other.9 + +Whether or not such comments allayed suspicions that Raymond and other open source proponents had simply been in it for the money, they drove home the open source community's ultimate message: all you needed to sell the free software concept is a friendly face and a sensible message. Instead of fighting the marketplace head-on as Stallman had done, Raymond, Torvalds, and other new leaders of the hacker community had adopted a more relaxed approach-ignoring the marketplace in some areas, leveraging it in others. Instead of playing the role of high-school outcasts, they had played the game of celebrity, magnifying their power in the process. + +"On his worst days Richard believes that Linus Torvalds and I conspired to hijack his revolution," Raymond says. "Richard's rejection of the term open source and his deliberate creation of an ideological fissure in my view comes from an odd mix of idealism and territoriality. There are people out there who think it's all Richard's personal ego. I don't believe that. It's more that he so personally associates himself with the free software idea that he sees any threat to that as a threat to himself." + +Ironically, the success of open source and open source advocates such as Raymond would not diminish Stallman's role as a leader. If anything, it gave Stallman new followers to convert. Still, the Raymond territoriality charge is a damning one. There are numerous instances of Stallman sticking to his guns more out of habit than out of principle: his initial dismissal of the Linux kernel, for example, and his current unwillingness as a political figure to venture outside the realm of software issues. + +Then again, as the recent debate over open source also shows, in instances when Stallman has stuck to his guns, he's usually found a way to gain ground because of it. "One of Stallman's primary character traits is the fact he doesn't budge," says Ian Murdock. "He'll wait up to a decade for people to come around to his point of view if that's what it takes." + +Murdock, for one, finds that unbudgeable nature both refreshing and valuable. Stallman may no longer be the solitary leader of the free software movement, but he is still the polestar of the free software community. "You always know that he's going to be consistent in his views," Murdock says. "Most people aren't like that. Whether you agree with him or not, you really have to respect that." + + +Chapter 12 +A Brief Journey Through Hacker Hell +Richard Stallman stares, unblinking, through the windshield of a rental car, waiting for the light to change as we make our way through downtown Kihei. + +The two of us are headed to the nearby town of Pa'ia, where we are scheduled to meet up with some software programmers and their wives for dinner in about an hour or so. + +It's about two hours after Stallman's speech at the Maui High Performance Center, and Kihei, a town that seemed so inviting before the speech, now seems profoundly uncooperative. Like most beach cities, Kihei is a one-dimensional exercise in suburban sprawl. Driving down its main drag, with its endless succession of burger stands, realty agencies, and bikini shops, it's hard not to feel like a steel-coated morsel passing through the alimentary canal of a giant commercial tapeworm. The feeling is exacerbated by the lack of side roads. With nowhere to go but forward, traffic moves in spring-like lurches. 200 yards ahead, a light turns green. By the time we are moving, the light is yellow again. + +For Stallman, a lifetime resident of the east coast, the prospect of spending the better part of a sunny Hawaiian afternoon trapped in slow traffic is enough to trigger an embolism. Even worse is the knowledge that, with just a few quick right turns a quarter mile back, this whole situation easily could have been avoided. Unfortunately, we are at the mercy of the driver ahead of us, a programmer from the lab who knows the way and who has decided to take us to Pa'ia via the scenic route instead of via the nearby Pilani Highway. + +"This is terrible," says Stallman between frustrated sighs. "Why didn't we take the other route?" + +Again, the light a quarter mile ahead of us turns green. Again, we creep forward a few more car lengths. This process continues for another 10 minutes, until we finally reach a major crossroad promising access to the adjacent highway. + +The driver ahead of us ignores it and continues through the intersection. + +"Why isn't he turning?" moans Stallman, throwing up his hands in frustration. "Can you believe this?" + +I decide not to answer either. I find the fact that I am sitting in a car with Stallman in the driver seat, in Maui no less, unbelievable enough. Until two hours ago, I didn't even know Stallman knew how to drive. Now, listening to Yo-Yo Ma's cello playing the mournful bass notes of "Appalachian Journey" on the car stereo and watching the sunset pass by on our left, I do my best to fade into the upholstery. + +When the next opportunity to turn finally comes up, Stallman hits his right turn signal in an attempt to cue the driver ahead of us. No such luck. Once again, we creep slowly through the intersection, coming to a stop a good 200 yards before the next light. By now, Stallman is livid. + +"It's like he's deliberately ignoring us," he says, gesturing and pantomiming like an air craft carrier landing-signals officer in a futile attempt to catch our guide's eye. The guide appears unfazed, and for the next five minutes all we see is a small portion of his head in the rearview mirror. + +I look out Stallman's window. Nearby Kahoolawe and Lanai Islands provide an ideal frame for the setting sun. It's a breathtaking view, the kind that makes moments like this a bit more bearable if you're a Hawaiian native, I suppose. I try to direct Stallman's attention to it, but Stallman, by now obsessed by the inattentiveness of the driver ahead of us, blows me off. + +When the driver passes through another green light, completely ignoring a "Pilani Highway Next Right," I grit my teeth. I remember an early warning relayed to me by BSD programmer Keith Bostic. "Stallman does not suffer fools gladly," Bostic warned me. "If somebody says or does something stupid, he'll look them in the eye and say, `That's stupid.'" + +Looking at the oblivious driver ahead of us, I realize that it's the stupidity, not the inconvenience, that's killing Stallman right now. + +"It's as if he picked this route with absolutely no thought on how to get there efficiently," Stallman says. + +The word "efficiently" hangs in the air like a bad odor. Few things irritate the hacker mind more than inefficiency. It was the inefficiency of checking the Xerox laser printer two or three times a day that triggered Stallman's initial inquiry into the printer source code. It was the inefficiency of rewriting software tools hijacked by commercial software vendors that led Stallman to battle Symbolics and to launch the GNU Project. If, as Jean Paul Sartre once opined, hell is other people, hacker hell is duplicating other people's stupid mistakes, and it's no exaggeration to say that Stallman's entire life has been an attempt to save mankind from these fiery depths. + +This hell metaphor becomes all the more apparent as we take in the slowly passing scenery. With its multitude of shops, parking lots, and poorly timed street lights, Kihei seems less like a city and more like a poorly designed software program writ large. Instead of rerouting traffic and distributing vehicles through side streets and expressways, city planners have elected to run everything through a single main drag. From a hacker perspective, sitting in a car amidst all this mess is like listening to a CD rendition of nails on a chalkboard at full volume. + +"Imperfect systems infuriate hackers," observes Steven Levy, another warning I should have listened to before climbing into the car with Stallman. "This is one reason why hackers generally hate driving cars-the system of randomly programmed red lights and oddly laid out one-way streets causes delays which are so goddamn unnecessary [Levy's emphasis] that the impulse is to rearrange signs, open up traffic-light control boxes . . . redesign the entire system."1 + +More frustrating, however, is the duplicity of our trusted guide. Instead of searching out a clever shortcut-as any true hacker would do on instinct-the driver ahead of us has instead chosen to play along with the city planners' game. Like Virgil in Dante's Inferno, our guide is determined to give us the full guided tour of this hacker hell whether we want it or not. + +Before I can make this observation to Stallman, the driver finally hits his right turn signal. Stallman's hunched shoulders relax slightly, and for a moment the air of tension within the car dissipates. The tension comes back, however, as the driver in front of us slows down. "Construction Ahead" signs line both sides of the street, and even though the Pilani Highway lies less than a quarter mile off in the distance, the two-lane road between us and the highway is blocked by a dormant bulldozer and two large mounds of dirt. + +It takes Stallman a few seconds to register what's going on as our guide begins executing a clumsy five-point U-turn in front of us. When he catches a glimpse of the bulldozer and the "No Through Access" signs just beyond, Stallman finally boils over. + +"Why, why, why?" he whines, throwing his head back. "You should have known the road was blocked. You should have known this way wouldn't work. You did this deliberately." + +The driver finishes the turn and passes us on the way back toward the main drag. As he does so, he shakes his head and gives us an apologetic shrug. Coupled with a toothy grin, the driver's gesture reveals a touch of mainlander frustration but is tempered with a protective dose of islander fatalism. Coming through the sealed windows of our rental car, it spells out a succinct message: "Hey, it's Maui; what are you gonna do?" + +Stallman can take it no longer. + +"Don't you fucking smile!" he shouts, fogging up the glass as he does so. "It's your fucking fault. This all could have been so much easier if we had just done it my way." + +Stallman accents the words "my way" by gripping the steering wheel and pulling himself towards it twice. The image of Stallman's lurching frame is like that of a child throwing a temper tantrum in a car seat, an image further underlined by the tone of Stallman's voice. Halfway between anger and anguish, Stallman seems to be on the verge of tears. + +Fortunately, the tears do not arrive. Like a summer cloudburst, the tantrum ends almost as soon as it begins. After a few whiny gasps, Stallman shifts the car into reverse and begins executing his own U-turn. By the time we are back on the main drag, his face is as impassive as it was when we left the hotel 30 minutes earlier. + +It takes less than five minutes to reach the next cross-street. This one offers easy highway access, and within seconds, we are soon speeding off toward Pa'ia at a relaxing rate of speed. The sun that once loomed bright and yellow over Stallman's left shoulder is now burning a cool orange-red in our rearview mirror. It lends its color to the gauntlet wili wili trees flying past us on both sides of the highway. + +For the next 20 minutes, the only sound in our vehicle, aside from the ambient hum of the car's engine and tires, is the sound of a cello and a violin trio playing the mournful strains of an Appalachian folk tune. + + +Chapter 13 +Continuing the Fight +For Richard Stallman, time may not heal all wounds, but it does provide a convenient ally. + +Four years after " The Cathedral and the Bazaar," Stallman still chafes over the Raymond critique. He also grumbles over Linus Torvalds' elevation to the role of world's most famous hacker. He recalls a popular T-shirt that began showing at Linux tradeshows around 1999. Designed to mimic the original promotional poster for Star Wars, the shirt depicted Torvalds brandishing a lightsaber like Luke Skywalker, while Stallman's face rides atop R2D2. The shirt still grates on Stallmans nerves not only because it depicts him as a Torvalds' sidekick, but also because it elevates Torvalds to the leadership role in the free software/open source community, a role even Torvalds himself is loath to accept. "It's ironic," says Stallman mournfully. "Picking up that sword is exactly what Linus refuses to do. He gets everybody focusing on him as the symbol of the movement, and then he won't fight. What good is it?" + +Then again, it is that same unwillingness to "pick up the sword," on Torvalds part, that has left the door open for Stallman to bolster his reputation as the hacker community's ethical arbiter. Despite his grievances, Stallman has to admit that the last few years have been quite good, both to himself and to his organization. Relegated to the periphery by the unforeseen success of GNU/Linux, Stallman has nonetheless successfully recaptured the initiative. His speaking schedule between January 2000 and December 2001 included stops on six continents and visits to countries where the notion of software freedom carries heavy overtones-China and India, for example. + +Outside the bully pulpit, Stallman has also learned how to leverage his power as costeward of the GNU General Public License (GPL). During the summer of 2000, while the air was rapidly leaking out of the 1999 Linux IPO bubble, Stallman and the Free Software Foundation scored two major victories. In July, 2000, Troll Tech, a Norwegian software company and developer of Qt, a valuable suite of graphics tools for the GNU/Linux operating system, announced it was licensing its software under the GPL. A few weeks later, Sun Microsystems, a company that, until then, had been warily trying to ride the open source bandwagon without giving up total control of its software properties, finally relented and announced that it, too, was dual licensing its new OpenOffice application suite under the Lesser GNU Public License (LGPL) and the Sun Industry Standards Source License (SISSL). + +Underlining each victory was the fact that Stallman had done little to fight for them. In the case of Troll Tech, Stallman had simply played the role of free software pontiff. In 1999, the company had come up with a license that met the conditions laid out by the Free Software Foundation, but in examining the license further, Stallman detected legal incompatibles that would make it impossible to bundle Qt with GPL-protected software programs. Tired of battling Stallman, Troll Tech management finally decided to split the Qt into two versions, one GPL-protected and one QPL-protected, giving developers a way around the compatibility issues cited by Stallman. + +In the case of Sun, they desired to play according to the Free Software Foundation's conditions. At the 1999 O'Reilly Open Source Conference, Sun Microsystems cofounder and chief scientist Bill Joy defended his company's "community source" license, essentially a watered-down compromise letting users copy and modify Sun-owned software but not charge a fee for said software without negotiating a royalty agreement with Sun. A year after Joy's speech, Sun Microsystems vice president Marco Boerries was appearing on the same stage spelling out the company's new licensing compromise in the case of OpenOffice, an office-application suite designed specifically for the GNU/Linux operating system. + +"I can spell it out in three letters," said Boerries. "GPL." + +At the time, Boerries said his company's decision had little to do with Stallman and more to do with the momentum of GPL-protected programs. "What basically happened was the recognition that different products attracted different communities, and the license you use depends on what type of community you want to attract," said Boerries. "With [OpenOffice], it was clear we had the highest correlation with the GPL community."1 + +Such comments point out the under-recognized strength of the GPL and, indirectly, the political genius of man who played the largest role in creating it. "There isn't a lawyer on earth who would have drafted the GPL the way it is," says Eben Moglen, Columbia University law professor and Free Software Foundation general counsel. "But it works. And it works because of Richard's philosophy of design." + +A former professional programmer, Moglen traces his pro bono work with Stallman back to 1990 when Stallman requested Moglen's legal assistance on a private affair. Moglen, then working with encryption expert Phillip Zimmerman during Zimmerman's legal battles with the National Security Administration, says he was honored by the request. "I told him I used Emacs every day of my life, and it would take an awful lot of lawyering on my part to pay off the debt." + +Since then, Moglen, perhaps more than any other individual, has had the best chance to observe the crossover of Stallman's hacker philosophies into the legal realm. Moglen says the difference between Stallman's approach to legal code and software code are largely the same. "I have to say, as a lawyer, the idea that what you should do with a legal document is to take out all the bugs doesn't make much sense," Moglen says. "There is uncertainty in every legal process, and what most lawyers want to do is to capture the benefits of uncertainty for their client. Richard's goal is the complete opposite. His goal is to remove uncertainty, which is inherently impossible. It is inherently impossible to draft one license to control all circumstances in all legal systems all over the world. But if you were to go at it, you would have to go at it his way. And the resulting elegance, the resulting simplicity in design almost achieves what it has to achieve. And from there a little lawyering will carry you quite far." + +As the person charged with pushing the Stallman agenda, Moglen understands the frustration of would-be allies. "Richard is a man who does not want to compromise over matters that he thinks of as fundamental," Moglen says, "and he does not take easily the twisting of words or even just the seeking of artful ambiguity, which human society often requires from a lot of people." + +Because of the Free Software Foundation's unwillingness to weigh in on issues outside the purview of GNU development and GPL enforcement, Moglen has taken to devoting his excess energies to assisting the Electronic Frontier Foundation, the organization providing legal aid to recent copyright defendants such as Dmitri Skylarov. In 2000, Moglen also served as direct counsel to a collection of hackers that were joined together from circulating the DVD decryption program deCSS. Despite the silence of his main client in both cases, Moglen has learned to appreciate the value of Stallman's stubbornness. "There have been times over the years where I've gone to Richard and said, `We have to do this. We have to do that. Here's the strategic situation. Here's the next move. Here's what he have to do.' And Richard's response has always been, `We don't have to do anything.' Just wait. What needs doing will get done." + +"And you know what?" Moglen adds. "Generally, he's been right." + +Such comments disavow Stallman's own self-assessment: "I'm not good at playing games," Stallman says, addressing the many unseen critics who see him as a shrewd strategist. "I'm not good at looking ahead and anticipating what somebody else might do. My approach has always been to focus on the foundation, to say `Let's make the foundation as strong as we can make it.'" + +The GPL's expanding popularity and continuing gravitational strength are the best tributes to the foundation laid by Stallman and his GNU colleagues. While no longer capable of billing himself as the "last true hacker," Stallman nevertheless can take sole credit for building the free software movement's ethical framework. Whether or not other modern programmers feel comfortable working inside that framework is immaterial. The fact that they even have a choice at all is Stallman's greatest legacy. + +Discussing Stallman's legacy at this point seems a bit premature. Stallman, 48 at the time of this writing, still has a few years left to add to or subtract from that legacy. Still, the autopilot nature of the free software movement makes it tempting to examine Stallman's life outside the day-to-day battles of the software industry and within a more august, historical setting. + +To his credit, Stallman refuses all opportunities to speculate. "I've never been able to work out detailed plans of what the future was going to be like," says Stallman, offering his own premature epitaph. "I just said `I'm going to fight. Who knows where I'll get?'" + +There's no question that in picking his fights, Stallman has alienated the very people who might otherwise have been his greatest champions. It is also a testament to his forthright, ethical nature that many of Stallman's erstwhile political opponents still manage to put in a few good words for him when pressed. The tension between Stallman the ideologue and Stallman the hacker genius, however, leads a biographer to wonder: how will people view Stallman when Stallman's own personality is no longer there to get in the way? + +In early drafts of this book, I dubbed this question the "100 year" question. Hoping to stimulate an objective view of Stallman and his work, I asked various software-industry luminaries to take themselves out of the current timeframe and put themselves in a position of a historian looking back on the free software movement 100 years in the future. From the current vantage point, it is easy to see similarities between Stallman and past Americans who, while somewhat marginal during their lifetime, have attained heightened historical importance in relation to their age. Easy comparisons include Henry David Thoreau, transcendentalist philosopher and author of On Civil Disobedience, and John Muir, founder of the Sierra Club and progenitor of the modern environmental movement. It is also easy to see similarities in men like William Jennings Bryan, a.k.a. "The Great Commoner," leader of the populist movement, enemy of monopolies, and a man who, though powerful, seems to have faded into historical insignificance. + +Although not the first person to view software as public property, Stallman is guaranteed a footnote in future history books thanks to the GPL. Given that fact, it seems worthwhile to step back and examine Richard Stallman's legacy outside the current time frame. Will the GPL still be something software programmers use in the year 2102, or will it have long since fallen by the wayside? Will the term "free software" seem as politically quaint as "free silver" does today, or will it seem eerily prescient in light of later political events? + +Predicting the future is risky sport, but most people, when presented with the question, seemed eager to bite. "One hundred years from now, Richard and a couple of other people are going to deserve more than a footnote," says Moglen. "They're going to be viewed as the main line of the story." + +The "couple other people" Moglen nominates for future textbook chapters include John Gilmore, Stallman's GPL advisor and future founder of the Electronic Frontier Foundation, and Theodor Holm Nelson, a.k.a. Ted Nelson, author of the 1982 book, Literary Machines. Moglen says Stallman, Nelson, and Gilmore each stand out in historically significant, nonoverlapping ways. He credits Nelson, commonly considered to have coined the term "hypertext," for identifying the predicament of information ownership in the digital age. Gilmore and Stallman, meanwhile, earn notable credit for identifying the negative political effects of information control and building organizations-the Electronic Frontier Foundation in the case of Gilmore and the Free Software Foundation in the case of Stallman-to counteract those effects. Of the two, however, Moglen sees Stallman's activities as more personal and less political in nature. + +"Richard was unique in that the ethical implications of unfree software were particularly clear to him at an early moment," says Moglen. "This has a lot to do with Richard's personality, which lots of people will, when writing about him, try to depict as epiphenomenal or even a drawback in Richard Stallman's own life work." + +Gilmore, who describes his inclusion between the erratic Nelson and the irascible Stallman as something of a "mixed honor," nevertheless seconds the Moglen argument. Writes Gilmore: + + My guess is that Stallman's writings will stand up as well as Thomas Jefferson's have; he's a pretty clear writer and also clear on his principles . . . Whether Richard will be as influential as Jefferson will depend on whether the abstractions we call "civil rights" end up more important a hundred years from now than the abstractions that we call "software" or "technically imposed restrictions." + +Another element of the Stallman legacy not to be overlooked, Gilmore writes, is the collaborative software-development model pioneered by the GNU Project. Although flawed at times, the model has nevertheless evolved into a standard within the software-development industry. All told, Gilmore says, this collaborative software-development model may end up being even more influential than the GNU Project, the GPL License, or any particular software program developed by Stallman: + + Before the Internet, it was quite hard to collaborate over distance on software, even among teams that know and trust each other. Richard pioneered collaborative development of software, particularly by disorganized volunteers who seldom meet each other. Richard didn't build any of the basic tools for doing this (the TCP protocol, email lists, diff and patch, tar files, RCS or CVS or remote-CVS), but he used the ones that were available to form social groups of programmers who could effectively collaborate. + +Lawrence Lessig, Stanford law professor and author of the 2001 book, The Future of Ideas, is similarly bullish. Like many legal scholars, Lessig sees the GPL as a major bulwark of the current so-called "digital commons," the vast agglomeration of community-owned software programs, network and telecommunication standards that have triggered the Internet's exponential growth over the last three decades. Rather than connect Stallman with other Internet pioneers, men such as Vannevar Bush, Vinton Cerf, and J. C. R. Licklider who convinced others to see computer technology on a wider scale, Lessig sees Stallman's impact as more personal, introspective, and, ultimately, unique: + + [Stallman] changed the debate from is to ought. He made people see how much was at stake, and he built a device to carry these ideals forward . . . That said, I don't quite know how to place him in the context of Cerf or Licklider. The innovation is different. It is not just about a certain kind of code, or enabling the Internet. [It's] much more about getting people to see the value in a certain kind of Internet. I don't think there is anyone else in that class, before or after. + +Not everybody sees the Stallman legacy as set in stone, of course. Eric Raymond, the open source proponent who feels that Stallman's leadership role has diminished significantly since 1996, sees mixed signals when looking into the 2102 crystal ball: + + I think Stallman's artifacts (GPL, Emacs, GCC) will be seen as revolutionary works, as foundation-stones of the information world. I think history will be less kind to some of the theories from which RMS operated, and not kind at all to his personal tendency towards territorial, cult-leader behavior. + +As for Stallman himself, he, too, sees mixed signals: + + What history says about the GNU Project, twenty years from now, will depend on who wins the battle of freedom to use public knowledge. If we lose, we will be just a footnote. If we win, it is uncertain whether people will know the role of the GNU operating system-if they think the system is "Linux," they will build a false picture of what happened and why. + + But even if we win, what history people learn a hundred years from now is likely to depend on who dominates politically. + +Searching for his own 19th-century historical analogy, Stallman summons the figure of John Brown, the militant abolitionist regarded as a hero on one side of the Mason Dixon line and a madman on the other. + +John Brown's slave revolt never got going, but during his subsequent trial he effectively roused national demand for abolition. During the Civil War, John Brown was a hero; 100 years after, and for much of the 1900s, history textbooks taught that he was crazy. During the era of legal segregation, while bigotry was shameless, the US partly accepted the story that the South wanted to tell about itself, and history textbooks said many untrue things about the Civil War and related events. + +Such comparisons document both the self-perceived peripheral nature of Stallman's current work and the binary nature of his current reputation. Although it's hard to see Stallman's reputation falling to the level of infamy as Brown's did during the post-Reconstruction period-Stallman, despite his occasional war-like analogies, has done little to inspire violence-it's easy to envision a future in which Stallman's ideas wind up on the ash-heap. In fashioning the free software cause not as a mass movement but as a collection of private battles against the forces of proprietary temptation, Stallman seems to have created a unwinnable situation, especially for the many acolytes with the same stubborn will. + +Then again, it is that very will that may someday prove to be Stallman's greatest lasting legacy. Moglen, a close observer over the last decade, warns those who mistake the Stallman personality as counter-productive or epiphenomenal to the "artifacts" of Stalllman's life. Without that personality, Moglen says, there would be precious few artifiacts to discuss. Says Moglen, a former Supreme Court clerk: + + Look, the greatest man I ever worked for was Thurgood Marshall. I knew what made him a great man. I knew why he had been able to change the world in his possible way. I would be going out on a limb a little bit if I were to make a comparison, because they could not be more different. Thurgood Marshall was a man in society, representing an outcast society to the society that enclosed it, but still a man in society. His skill was social skills. But he was all of a piece, too. Different as they were in every other respect, that the person I most now compare him to in that sense, all of a piece, compact, made of the substance that makes stars, all the way through, is Stallman. + +In an effort to drive that image home, Moglen reflects on a shared moment in the spring of 2000. The success of the VA Linux IPO was still resonating in the business media, and a half dozen free software-related issues were swimming through the news. Surrounded by a swirling hurricane of issues and stories each begging for comment, Moglen recalls sitting down for lunch with Stallman and feeling like a castaway dropped into the eye of the storm. For the next hour, he says, the conversation calmly revolved around a single topic: strengthening the GPL. + +"We were sitting there talking about what we were going to do about some problems in Eastern Europe and what we were going to do when the problem of the ownership of content began to threaten free software," Moglen recalls. "As we were talking, I briefly thought about how we must have looked to people passing by. Here we are, these two little bearded anarchists, plotting and planning the next steps. And, of course, Richard is plucking the knots from his hair and dropping them in the soup and behaving in his usual way. Anybody listening in on our conversation would have thought we were crazy, but I knew: I knew the revolution's right here at this table. This is what's making it happen. And this man is the person making it happen." + +Moglen says that moment, more than any other, drove home the elemental simplicity of the Stallman style. + +"It was funny," recalls Moglen. "I said to him, `Richard, you know, you and I are the two guys who didn't make any money out of this revolution.' And then I paid for the lunch, because I knew he didn't have the money to pay for it .'" + + +Chapter 14 +Epilogue: Crushing Loneliness +Writing the biography of a living person is a bit like producing a play. The drama in front of the curtain often pales in comparison to the drama backstage. + +In The Autobiography of Malcolm X, Alex Haley gives readers a rare glimpse of that backstage drama. Stepping out of the ghostwriter role, Haley delivers the book's epilogue in his own voice. The epilogue explains how a freelance reporter originally dismissed as a "tool" and "spy" by the Nation of Islam spokesperson managed to work through personal and political barriers to get Malcolm X's life story on paper. + +While I hesitate to compare this book with The Autobiography of Malcolm X, I do owe a debt of gratitude to Haley for his candid epilogue. Over the last 12 months, it has served as a sort of instruction manual on how to deal with a biographical subject who has built an entire career on being disagreeable. From the outset, I envisioned closing this biography with a similar epilogue, both as an homage to Haley and as a way to let readers know how this book came to be. + +The story behind this story starts in an Oakland apartment, winding its way through the various locales mentioned in the book-Silicon Valley, Maui, Boston, and Cambridge. Ultimately, however, it is a tale of two cities: New York, New York, the book-publishing capital of the world, and Sebastopol, California, the book-publishing capital of Sonoma County. + +The story starts in April, 2000. At the time, I was writing stories for the ill-fated BeOpen web site (http://www.beopen.com/). One of my first assignments was a phone interview with Richard M. Stallman. The interview went well, so well that Slashdot (http://www.slashdot.org/), the popular "news for nerds" site owned by VA Software, Inc. (formerly VA Linux Systems and before that, VA Research), gave it a link in its daily list of feature stories. Within hours, the web servers at BeOpen were heating up as readers clicked over to the site. + +For all intents and purposes, the story should have ended there. Three months after the interview, while attending the O'Reilly Open Source Conference in Monterey, California, I received the following email message from Tracy Pattison, foreign-rights manager at a large New York publishing house: + +To: sam@BeOpen.com Subject: +RMS InterviewDate: Mon, 10 Jul 2000 15:56:37 -0400Dear Mr. Williams, + +I read your interview with Richard Stallman on BeOpen with great +interest. I've been intrigued by RMS and his work for some time now +and was delighted to find your piece which I really think you did a +great job of capturing some of the spirit of what Stallman is trying +to do with GNU-Linux and the Free Software Foundation. + +What I'd love to do, however, is read more - and I don't think I'm +alone. Do you think there is more information and/or sources out there +to expand and update your interview and adapt it into more of a +profile of Stallman? Perhaps including some more anecdotal information +about his personality and background that might really interest and +enlighten readers outside the more hardcore programming scene? + +The email asked that I give Tracy a call to discuss the idea further. I did just that. Tracy told me her company was launching a new electronic book line, and it wanted stories that appealed to an early-adopter audience. The e-book format was 30,000 words, about 100 pages, and she had pitched her bosses on the idea of profiling a major figure in the hacker community. Her bosses liked the idea, and in the process of searching for interesting people to profile, she had come across my BeOpen interview with Stallman. Hence her email to me. + +That's when Tracy asked me: would I be willing to expand the interview into a full-length feature profile? + +My answer was instant: yes. Before accepting it, Tracy suggested I put together a story proposal she could show her superiors. Two days later, I sent her a polished proposal. A week later, Tracy sent me a follow up email. Her bosses had given it the green light. + +I have to admit, getting Stallman to participate in an e-book project was an afterthought on my part. As a reporter who covered the open source beat, I knew Stallman was a stickler. I'd already received a half dozen emails at that point upbraiding me for the use of "Linux" instead of "GNU/Linux." + +Then again, I also knew Stallman was looking for ways to get his message out to the general public. Perhaps if I presented the project to him that way, he would be more receptive. If not, I could always rely upon the copious amounts of documents, interviews, and recorded online conversations Stallman had left lying around the Internet and do an unauthorized biography. + +During my research, I came across an essay titled "Freedom-Or Copyright?" Written by Stallman and published in the June, 2000, edition of the MIT Technology Review, the essay blasted e-books for an assortment of software sins. Not only did readers have to use proprietary software programs to read them, Stallman lamented, but the methods used to prevent unauthorized copying were overly harsh. Instead of downloading a transferable HTML or PDF file, readers downloaded an encrypted file. In essence, purchasing an e-book meant purchasing a nontransferable key to unscramble the encrypted content. Any attempt to open a book's content without an authorized key constituted a criminal violation of the Digital Millennium Copyright Act, the 1998 law designed to bolster copyright enforcement on the Internet. Similar penalties held for readers who converted a book's content into an open file format, even if their only intention was to read the book on a different computer in their home. Unlike a normal book, the reader no longer held the right to lend, copy, or resell an e-book. They only had the right to read it on an authorized machine, warned Stallman: + + We still have the same old freedoms in using paper books. But if e-books replace printed books, that exception will do little good. With "electronic ink," which makes it possible to download new text onto an apparently printed piece of paper, even newspapers could become ephemeral. Imagine: no more used book stores; no more lending a book to your friend; no more borrowing one from the public library-no more "leaks" that might give someone a chance to read without paying. (And judging from the ads for Microsoft Reader, no more anonymous purchasing of books either.) This is the world publishers have in mind for us.1 + +Needless to say, the essay caused some concern. Neither Tracy nor I had discussed the software her company would use nor had we discussed the type of copyright that would govern the e-book's usage. I mentioned the Technology Review article and asked if she could give me information on her company's e-book policies. Tracy promised to get back to me. + +Eager to get started, I decided to call Stallman anyway and mention the book idea to him. When I did, he expressed immediate interest and immediate concern. "Did you read my essay on e-books?" he asked. + +When I told him, yes, I had read the essay and was waiting to hear back from the publisher, Stallman laid out two conditions: he didn't want to lend support to an e-book licensing mechanism he fundamentally opposed, and he didn't want to come off as lending support. "I don't want to participate in anything that makes me look like a hypocrite," he said. + +For Stallman, the software issue was secondary to the copyright issue. He said he was willing to ignore whatever software the publisher or its third-party vendors employed just so long as the company specified within the copyright that readers were free to make and distribute verbatim copies of the e-book's content. Stallman pointed to Stephen King's The Plant as a possible model. In June, 2000, King announced on his official web site that he was self-publishing The Plant in serial form. According to the announcement, the book's total cost would be $13, spread out over a series of $1 installments. As long as at least 75% of the readers paid for each chapter, King promised to continue releasing new installments. By August, the plan seemed to be working, as King had published the first two chapters with a third on the way. + +"I'd be willing to accept something like that," Stallman said. "As long as it also permitted verbatim copying." + +I forwarded the information to Tracy. Feeling confident that she and I might be able to work out an equitable arrangement, I called up Stallman and set up the first interview for the book. Stallman agreed to the interview without making a second inquiry into the status issue. Shortly after the first interview, I raced to set up a second interview (this one in Kihei), squeezing it in before Stallman headed off on a 14-day vacation to Tahiti. + +It was during Stallman's vacation that the bad news came from Tracy. Her company's legal department didn't want to adjust its copyright notice on the e-books. Readers who wanted to make their books transferable would either have to crack the encryption code or convert the book to an open format such as HTML. Either way, the would be breaking the law and facing criminal penalties. + +With two fresh interviews under my belt, I didn't see any way to write the book without resorting to the new material. I quickly set up a trip to New York to meet with my agent and with Tracy to see if there was a compromise solution. + +When I flew to New York, I met my agent, Henning Guttman. It was our first face-to-face meeting, and Henning seemed pessimistic about our chances of forcing a compromise, at least on the publisher's end. The large, established publishing houses already viewed the e-book format with enough suspicion and weren't in the mood to experiment with copyright language that made it easier for readers to avoid payment. As an agent who specialized in technology books, however, Henning was intrigued by the novel nature of my predicament. I told him about the two interviews I'd already gathered and the promise not to publish the book in a way that made Stallman "look like a hypocrite." Agreeing that I was in an ethical bind, Henning suggested we make that our negotiating point. + +Barring that, Henning said, we could always take the carrot-and-stick approach. The carrot would be the publicity that came with publishing an e-book that honored the hacker community's internal ethics. The stick would be the risks associated with publishing an e-book that didn't. Nine months before Dmitri Skylarov became an Internet cause cČlËbre, we knew it was only a matter of time before an enterprising programmer revealed how to hack e-books. We also knew that a major publishing house releasing an encryption-protected e-book on Richard M. Stallman was the software equivalent of putting "Steal This E-Book" on the cover. + +After my meeting with Henning, I put a call into Stallman. Hoping to make the carrot more enticing, I discussed a number of potential compromises. What if the publisher released the book's content under a split license, something similar to what Sun Microsystems had done with Open Office, the free software desktop applications suite? The publisher could then release commercial versions of the e-book under a normal format, taking advantage of all the bells and whistles that went with the e-book software, while releasing the copyable version under a less aesthetically pleasing HTML format. + +Stallman told me he didn't mind the split-license idea, but he did dislike the idea of making the freely copyable version inferior to the restricted version. Besides, he said, the idea was too cumbersome. Split licenses worked in the case of Sun's Open Office only because he had no control over the decision making. In this case, Stallman said, he did have a way to control the outcome. He could refuse to cooperate. + +I made a few more suggestions with little effect. About the only thing I could get out of Stallman was a concession that the e-book's copyright restrict all forms of file sharing to "noncommercial redistribution." + +Before I signed off, Stallman suggested I tell the publisher that I'd promised Stallman that the work would be free. I told Stallman I couldn't agree to that statement but that I did view the book as unfinishable without his cooperation. Seemingly satisfied, Stallman hung up with his usual sign-off line: "Happy hacking." + +Henning and I met with Tracy the next day. Tracy said her company was willing to publish copyable excerpts in a unencrypted format but would limit the excerpts to 500 words. Henning informed her that this wouldn't be enough for me to get around my ethical obligation to Stallman. Tracy mentioned her own company's contractual obligation to online vendors such as Amazon.com. Even if the company decided to open up its e-book content this one time, it faced the risk of its partners calling it a breach of contract. Barring a change of heart in the executive suite or on the part of Stallman, the decision was up to me. I could use the interviews and go against my earlier agreement with Stallman, or I could plead journalistic ethics and back out of the verbal agreement to do the book. + +Following the meeting, my agent and I relocated to a pub on Third Ave. I used his cell phone to call Stallman, leaving a message when nobody answered. Henning left for a moment, giving me time to collect my thoughts. When he returned, he was holding up the cell phone. + +"It's Stallman," Henning said. + +The conversation got off badly from the start. I relayed Tracy's comment about the publisher's contractual obligations. + +"So," Stallman said bluntly. "Why should I give a damn about their contractual obligations?" + +Because asking a major publishing house to risk a legal battle with its vendors over a 30,000 word e-book is a tall order, I suggested. + +"Don't you see?" Stallman said. "That's exactly why I'm doing this. I want a signal victory. I want them to make a choice between freedom and business as usual." + +As the words "signal victory" echoed in my head, I felt my attention wander momentarily to the passing foot traffic on the sidewalk. Coming into the bar, I had been pleased to notice that the location was less than half a block away from the street corner memorialized in the 1976 Ramones song, "53rd and 3rd," a song I always enjoyed playing in my days as a musician. Like the perpetually frustrated street hustler depicted in that song, I could feel things falling apart as quickly as they had come together. The irony was palpable. After weeks of gleefully recording other people's laments, I found myself in the position of trying to pull off the rarest of feats: a Richard Stallman compromise. + +When I continued hemming and hawing, pleading the publisher's position and revealing my growing sympathy for it, Stallman, like an animal smelling blood, attacked. + +"So that's it? You're just going to screw me? You're just going to bend to their will?" + +I brought up the issue of a dual-copyright again. + +"You mean license," Stallman said curtly. + +"Yeah, license. Copyright. Whatever," I said, feeling suddenly like a wounded tuna trailing a rich plume of plasma in the water. + +"Aw, why didn't you just fucking do what I told you to do!" he shouted. + +I must have been arguing on behalf of the publisher to the very end, because in my notes I managed to save a final Stallman chestnut: "I don't care. What they're doing is evil. I can't support evil. Good-bye." + +As soon as I put the phone down, my agent slid a freshly poured Guinness to me. "I figured you might need this," he said with a laugh. "I could see you shaking there towards the end." + +I was indeed shaking. The shaking wouldn't stop until the Guinness was more than halfway gone. It felt weird, hearing myself characterized as an emissary of "evil." It felt weirder still, knowing that three months before, I was sitting in an Oakland apartment trying to come up with my next story idea. Now, I was sitting in a part of the world I'd only known through rock songs, taking meetings with publishing executives and drinking beer with an agent I'd never even laid eyes on until the day before. It was all too surreal, like watching my life reflected back as a movie montage. + +About that time, my internal absurdity meter kicked in. The initial shaking gave way to convulsions of laughter. To my agent, I must have looked like a another fragile author undergoing an untimely emotional breakdown. To me, I was just starting to appreciate the cynical beauty of my situation. Deal or no deal, I already had the makings of a pretty good story. It was only a matter of finding a place to tell it. When my laughing convulsions finally subsided, I held up my drink in a toast. + +"Welcome to the front lines, my friend," I said, clinking pints with my agent. "Might as well enjoy it." + +If this story really were a play, here's where it would take a momentary, romantic interlude. Disheartened by the tense nature of our meeting, Tracy invited Henning and I to go out for drinks with her and some of her coworkers. We left the bar on Third Ave., headed down to the East Village, and caught up with Tracy and her friends. + +Once there, I spoke with Tracy, careful to avoid shop talk. Our conversation was pleasant, relaxed. Before parting, we agreed to meet the next night. Once again, the conversation was pleasant, so pleasant that the Stallman e-book became almost a distant memory. + +When I got back to Oakland, I called around to various journalist friends and acquaintances. I recounted my predicament. Most upbraided me for giving up too much ground to Stallman in the preinterview negotiation. A former j-school professor suggested I ignore Stallman's "hypocrite" comment and just write the story. Reporters who knew of Stallman's media-savviness expressed sympathy but uniformly offered the same response: it's your call. + +I decided to put the book on the back burner. Even with the interviews, I wasn't making much progress. Besides, it gave me a chance to speak with Tracy without running things past Henning first. By Christmas we had traded visits: she flying out to the west coast once, me flying out to New York a second time. The day before New Year's Eve, I proposed. Deciding which coast to live on, I picked New York. By February, I packed up my laptop computer and all my research notes related to the Stallman biography, and we winged our way to JFK Airport. Tracy and I were married on May 11. So much for failed book deals. + +During the summer, I began to contemplate turning my interview notes into a magazine article. Ethically, I felt in the clear doing so, since the original interview terms said nothing about traditional print media. To be honest, I also felt a bit more comfortable writing about Stallman after eight months of radio silence. Since our telephone conversation in September, I'd only received two emails from Stallman. Both chastised me for using "Linux" instead of "GNU/Linux" in a pair of articles for the web magazine Upside Today. Aside from that, I had enjoyed the silence. In June, about a week after the New York University speech, I took a crack at writing a 5,000-word magazine-length story about Stallman. This time, the words flowed. The distance had helped restore my lost sense of emotional perspective, I suppose. + +In July, a full year after the original email from Tracy, I got a call from Henning. He told me that O'Reilly & Associates, a publishing house out of Sebastopol, California, was interested in the running the Stallman story as a biography. The news pleased me. Of all the publishing houses in the world, O'Reilly, the same company that had published Eric Raymond's The Cathedral and the Bazaar, seemed the most sensitive to the issues that had killed the earlier e-book. As a reporter, I had relied heavily on the O'Reilly book Open Sources as a historical reference. I also knew that various chapters of the book, including a chapter written by Stallman, had been published with copyright notices that permitted redistribution. Such knowledge would come in handy if the issue of electronic publication ever came up again. + +Sure enough, the issue did come up. I learned through Henning that O'Reilly intended to publish the biography both as a book and as part of its new Safari Tech Books Online subscription service. The Safari user license would involve special restrictions,1 Henning warned, but O'Reilly was willing to allow for a copyright that permitted users to copy and share and the book's text regardless of medium. Basically, as author, I had the choice between two licenses: the Open Publication License or the GNU Free Documentation License. + +I checked out the contents and background of each license. The Open Publication License (OPL)2 gives readers the right to reproduce and distribute a work, in whole or in part, in any medium "physical or electronic," provided the copied work retains the Open Publication License. It also permits modification of a work, provided certain conditions are met. Finally, the Open Publication License includes a number of options, which, if selected by the author, can limit the creation of "substantively modified" versions or book-form derivatives without prior author approval. + +The GNU Free Documentation License (GFDL),3 meanwhile, permits the copying and distribution of a document in any medium, provided the resulting work carries the same license. It also permits the modification of a document provided certain conditions. Unlike the OPL, however, it does not give authors the option to restrict certain modifications. It also does not give authors the right to reject modifications that might result in a competitive book product. It does require certain forms of front- and back-cover information if a party other than the copyright holder wishes to publish more than 100 copies of a protected work, however. + +In the course of researching the licenses, I also made sure to visit the GNU Project web page titled "Various Licenses and Comments About Them."4 On that page, I found a Stallman critique of the Open Publication License. Stallman's critique related to the creation of modified works and the ability of an author to select either one of the OPL's options to restrict modification. If an author didn't want to select either option, it was better to use the GFDL instead, Stallman noted, since it minimized the risk of the nonselected options popping up in modified versions of a document. + +The importance of modification in both licenses was a reflection of their original purpose-namely, to give software-manual owners a chance to improve their manuals and publicize those improvements to the rest of the community. Since my book wasn't a manual, I had little concern about the modification clause in either license. My only concern was giving users the freedom to exchange copies of the book or make copies of the content, the same freedom they would have enjoyed if they purchased a hardcover book. Deeming either license suitable for this purpose, I signed the O'Reilly contract when it came to me. + +Still, the notion of unrestricted modification intrigued me. In my early negotiations with Tracy, I had pitched the merits of a GPL-style license for the e-book's content. At worst, I said, the license would guarantee a lot of positive publicity for the e-book. At best, it would encourage readers to participate in the book-writing process. As an author, I was willing to let other people amend my work just so long as my name always got top billing. Besides, it might even be interesting to watch the book evolve. I pictured later editions looking much like online versions of the Talmud, my original text in a central column surrounded by illuminating, third-party commentary in the margins. + +My idea drew inspiration from Project Xanadu (http://www.xanadu.com/), the legendary software concept originally conceived by Ted Nelson in 1960. During the O'Reilly Open Source Conference in 1999, I had seen the first demonstration of the project's open source offshoot Udanax and had been wowed by the result. In one demonstration sequence, Udanax displayed a parent document and a derivative work in a similar two-column, plain-text format. With a click of the button, the program introduced lines linking each sentence in the parent to its conceptual offshoot in the derivative. An e-book biography of Richard M. Stallman didn't have to be Udanax-enabled, but given such technological possibilities, why not give users a chance to play around?5 + +When Laurie Petrycki, my editor at O'Reilly, gave me a choice between the OPL or the GFDL, I indulged the fantasy once again. By September of 2001, the month I signed the contract, e-books had become almost a dead topic. Many publishing houses, Tracy's included, were shutting down their e-book imprints for lack of interest. I had to wonder. If these companies had treated e-books not as a form of publication but as a form of community building, would those imprints have survived? + +After I signed the contract, I notified Stallman that the book project was back on. I mentioned the choice O'Reilly was giving me between the Open Publication License and the GNU Free Documentation License. I told him I was leaning toward the OPL, if only for the fact I saw no reason to give O'Reilly's competitors a chance to print the same book under a different cover. Stallman wrote back, arguing in favor of the GFDL, noting that O'Reilly had already used it several times in the past. Despite the events of the past year, I suggested a deal. I would choose the GFDL if it gave me the possibility to do more interviews and if Stallman agreed to help O'Reilly publicize the book. Stallman agreed to participate in more interviews but said that his participation in publicity-related events would depend on the content of the book. Viewing this as only fair, I set up an interview for December 17, 2001 in Cambridge. + +I set up the interview to coincide with a business trip my wife Tracy was taking to Boston. Two days before leaving, Tracy suggested I invite Stallman out to dinner. + +"After all," she said, "he is the one who brought us together." + +I sent an email to Stallman, who promptly sent a return email accepting the offer. When I drove up to Boston the next day, I met Tracy at her hotel and hopped the T to head over to MIT. When we got to Tech Square, I found Stallman in the middle of a conversation just as we knocked on the door. + +"I hope you don't mind," he said, pulling the door open far enough so that Tracy and I could just barely hear Stallman's conversational counterpart. It was a youngish woman, mid-20s I'd say, named Sarah. + +"I took the liberty of inviting somebody else to have dinner with us," Stallman said, matter-of-factly, giving me the same cat-like smile he gave me back in that Palo Alto restaurant. + +To be honest, I wasn't too surprised. The news that Stallman had a new female friend had reached me a few weeks before, courtesy of Stallman's mother. "In fact, they both went to Japan last month when Richard went over to accept the Takeda Award," Lippman told me at the time.6 + +On the way over to the restaurant, I learned the circumstances of Sarah and Richard's first meeting. Interestingly, the circumstances were very familiar. Working on her own fictional book, Sarah said she heard about Stallman and what an interesting character he was. She promptly decided to create a character in her book on Stallman and, in the interests of researching the character, set up an interview with Stallman. Things quickly went from there. The two had been dating since the beginning of 2001, she said. + +"I really admired the way Richard built up an entire political movement to address an issue of profound personal concern," Sarah said, explaining her attraction to Stallman. + +My wife immediately threw back the question: "What was the issue?" + +"Crushing loneliness." + +During dinner, I let the women do the talking and spent most of the time trying to detect clues as to whether the last 12 months had softened Stallman in any significant way. I didn't see anything to suggest they had. Although more flirtatious than I remembered-a flirtatiousness spoiled somewhat by the number of times Stallman's eyes seemed to fixate on my wife's chest-Stallman retained the same general level of prickliness. At one point, my wife uttered an emphatic "God forbid" only to receive a typical Stallman rebuke. + +"I hate to break it to you, but there is no God," Stallman said. + +Afterwards, when the dinner was complete and Sarah had departed, Stallman seemed to let his guard down a little. As we walked to a nearby bookstore, he admitted that the last 12 months had dramatically changed his outlook on life. "I thought I was going to be alone forever," he said. "I'm glad I was wrong." + +Before parting, Stallman handed me his "pleasure card," a business card listing Stallman's address, phone number, and favorite pastimes ("sharing good books, good food and exotic music and dance") so that I might set up a final interview. + + +Stallman's "pleasure" card, handed to me the night of our dinner. + +The next day, over another meal of dim sum, Stallman seemed even more lovestruck than the night before. Recalling his debates with Currier House dorm maters over the benefits and drawbacks of an immortality serum, Stallman expressed hope that scientists might some day come up with the key to immortality. "Now that I'm finally starting to have happiness in my life, I want to have more," he said. + +When I mentioned Sarah's "crushing loneliness" comment, Stallman failed to see a connection between loneliness on a physical or spiritual level and loneliness on a hacker level. "The impulse to share code is about friendship but friendship at a much lower level," he said. Later, however, when the subject came up again, Stallman did admit that loneliness, or the fear of perpetual loneliness, had played a major role in fueling his determination during the earliest days of the GNU Project. + +"My fascination with computers was not a consequence of anything else," he said. "I wouldn't have been less fascinated with computers if I had been popular and all the women flocked to me. However, it's certainly true the experience of feeling I didn't have a home, finding one and losing it, finding another and having it destroyed, affected me deeply. The one I lost was the dorm. The one that was destroyed was the AI Lab. The precariousness of not having any kind of home or community was very powerful. It made me want to fight to get it back." + +After the interview, I couldn't help but feel a certain sense of emotional symmetry. Hearing Sarah describe what attracted her to Stallman and hearing Stallman himself describe the emotions that prompted him to take up the free software cause, I was reminded of my own reasons for writing this book. Since July, 2000, I have learned to appreciate both the seductive and the repellent sides of the Richard Stallman persona. Like Eben Moglen before me, I feel that dismissing that persona as epiphenomenal or distracting in relation to the overall free software movement would be a grievous mistake. In many ways the two are so mutually defining as to be indistinguishable. + +While I'm sure not every reader feels the same level of affinity for Stallman-indeed, after reading this book, some might feel zero affinity-I'm sure most will agree. Few individuals offer as singular a human portrait as Richard M. Stallman. It is my sincere hope that, with this initial portrait complete and with the help of the GFDL, others will feel a similar urge to add their own perspective to that portrait. diff --git a/examples/txt/stallman-pl.txt b/examples/txt/stallman-pl.txt new file mode 100755 index 0000000..23949b2 --- /dev/null +++ b/examples/txt/stallman-pl.txt @@ -0,0 +1,1847 @@ + Podziękowania + + Specjalne podziękowania należą się Henningowi Gutmannowi za zainspirowanie mnie do napisania tej książki. Dziękuję także Baronowi Oasowi za uprzednie zasugerowanie tego pomysłu Tracy. Dziękuję Laurie Petrycki, Jeffreyowi Holcombowi i pozostałym osobom z O'Reilly & Associates, a szczególnie Timowi O'Reilly za poparcie udzielone tej książce. Wyrazy uznania należą się grupie osób spraw-dzających tekst, a byli to: Bruce Perens, Eric Raymond, Eric Allman, Jon Orwant, Julie i Gerard Jay Sussman, Hal Abelson oraz Guy Steele. Mam nadzieję, że obecna wolna od błędów wersja dała Wam wiele radości. Dziękuję również Alice Lippman za wywiady, ciasteczka i fotografie. Wreszcie moja rodzina: Steve, Jane, Tish i Dave - im składam równie gorące podziękowania. Na koniec wyrażam wdzięczność Richardowi Stallmanowi za to, że nie zabrakło mu serca ani cierpliwości, gdy "pokazywał mi kod". + + - Sam Williams + + +Wstęp +Działalność Richarda M. Stallmana mówi sama za siebie: od udokumentowanych kodów źródłowych, przez liczne publikacje, po zarejestrowane rozmowy i wywiady. Niewiele jest osób, które tyle wysiłku wkładają w przekazanie innym swoich myśli i przekonań. + +Taka otwartość - użyjmy na chwilę tego niestallmanowskiego określenia - jest niecodzienna. Żyjemy przecież w społeczeństwie, które traktuje informację, a zwłaszcza informację osobistą, jako towar. Zatem rodzi się pytanie, dlaczego istnieje ktoś, kto chce dzielić się z innymi taką masą informacji, nie żądając nic w zamian. + +Jak przekonamy się w kolejnych rozdziałach, poczynania Stallmana nie są w pełni altruistyczne. Każdy program, przemówienie i zapisany bon mot ma przypisaną cenę, która jednak nie określa płatności w znaczeniu, do jakiego ludzie przywykli. + +Nie jest to ostrzeżenie lecz zwykłe stwierdzenie faktu. Jako ktoś, kto spędził ostatni rok na wygrzebywaniu faktów z życia Stallmana, mogę się obawiać wystąpienia z krytyką jego dorobku. "Nigdy nie podejmuj walki z kimś, kto kupuje atrament beczkami" - mawiał Mark Twain. Trudno się pokusić o napisanie wyczerpującej biografii kogoś takiego jak Stallman, który każdą swą myśl podaje do publicznej wiadomości. + +Czytelników, którzy zdecydują się poświęcić kilka godzin na przewertowanie tej książki, zapewniam, że znajdą tu fakty i cytaty, których nie da się odszukać na stronach internetowych za pomocą Google lub innej wyszukiwarki. Ale dostęp do tych informacji kosztuje. Kupując książkę, płacicie zań w tradycyjny sposób, zaś w przypadku wersji elektronicznej opłata jest pobierana jak za wolne oprogramowanie1. Dzięki wydawnictwu O'Reilly & Associates książka ta jest rozprowadzana na zasadzie Licencji Wolnej Dokumentacji GNU2, co oznacza, że każdy może jej tekst poprawiać, tworzyć własną wersję i upowszechniać na zasadzie tej samej licencji. + +Jeżeli czytacie wersję elektroniczną i wybieracie drugi rodzaj płatności, tzn. chcecie przyczynić się do poprawienia treści ku pożytkowi następnych czytelników, czekam na Wasze teksty. Wersję w formacie html publikuję od czerwca 2002 r. pod adresem internetowym http://www.faifzilla.org/. Celem jest regularne uaktualnianie i rozszerzanie tekstu Free as In Freedom. Jeżeli zamierzacie wziąć udział w tym przedsięwzięciu, czyli wybieracie drugą formę płatności, przeczytajcie dodatek C, gdzie zostały podane Wasze prawa wynikające z Licencji Wolnej Dokumentacji GNU. + +I jeszcze uwaga końcowa: książka, którą trzymacie w ręku, to robota dziennikarska lecz również dokumentalna. Podczas jej pisanie i przygotowywania do druku korzystałem z licznych uwag i komentarzy wielu uczestników opisywanych wydarzeń, łącznie z samym Richardem Stallmanem. Uświadomiliśmy sobie wówczas, że w tekście zostało zawarte wiele informacji technicznych, których dokładniejsze lub lepsze wyjaśnienie bardzo ułatwiłoby lekturę. Ponieważ książka została wydana na zasadach Licencji Wolnej Dokumentacji GNU, akceptujemy wszelkie poprawki, tak jakbyśmy robili w przypadku opublikowania wolnego oprogramowania. Zaakceptowane zmiany zostaną włączone do wersji elektroniczne oraz, być może, także do przyszłej wersji drukowanej. Jeżeli chcecie się przyczynić do podniesienia jakości i wartości tej książki, możecie przesłać mi informację na adres sam@inow.com.. + + +Rozdział 1. +Gdy potrzebna drukarka + +Obawiam się Greków, nawet gdy przynoszą dary +- Wergiliusz +Eneida + +Nowa drukarka znowu się zacięła. + +Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + +Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + +Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + +Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. Urządzenie było darem Xerox Corporation. Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + +Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. Natychmiast osiągnięto zadawalające rezultaty. Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + +Był to ze pod każdym względem dar, który należało docenić. + +Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. W ich założeniach czujna obecność użytkownika było częścią systemu. + +Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + +Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + +Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + +"Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + +Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + +Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + +Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + +Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. Jednakże jako haker miał do dyspozycji inne źródła informacji. Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + +Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + +Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + +W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + +"Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + +Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + +Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + +Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. Był to zwiastun HTML-a, lingua franca Word Wide Web. W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + +Dla Reida była to procedura doskonała. Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. Natomiast dla Stallmana była to oczywista zdrada etosu programisty. Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + +Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + +Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + +Nie musiał długo czekać. W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + +Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + +"Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + +Pamięć jest ciekawą rzeczą. Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + +"Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. - "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + +Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + +Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + +Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + +Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. Na początku uznał odmowę za skierowaną przeciwko sobie. Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. Być może nawet trzasnąłem drzwiami. Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + +Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + +"Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + +Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + +Teraz nowa drukarka stała się oznaką zmian, które nastały. Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. Z punktu widzenia Stallmana drukarka była koniem trojańskim. W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. Pojawiło się w postaci daru. + +Stallman musiał przełknąć dwie gorzkie pigułki. Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + +"Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + +Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. Dla Stallmana był to początek staczania się po równi pochyłej. + +"Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + +Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + +"Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + +Rozdział 2. +2001: Odyseja hakerska + +Wydział nauk komputerowych New York University (NYU)1 znajduje się w Warren Weaver Hall, przypominającym fortecę gmaszysku oddalonym o dwa kwartały ulic na wschód od Washington Square Park. Wyloty instalacji klimatyzacyjnych dużej mocy tworzą wokół niego wał gorącego powietrza zniechęcający w równej mierze łazików, jak i radców prawnych. Przełamawszy barierę gorącego powietrza, odwiedzający trafiają na następną, równie nieprzyjemną - kontrolę straży pilnującej jedynego wejścia. + +Za punktem kontrolnym atmosfera łagodnieje. Nadal jednak liczne znaki rozsiane na pierwszym piętrze przypominają o zagrożeniu ze strony niezabezpieczonych drzwi i niezaplombowanych wyjść awaryjnych. Nawet w niezmąconej atmosferze Nowego Jorku sprzed 11 września 2001 roku wszystko to uświadamiało, że nikt nie jest zbyt bezpieczny lub zbyt podejrzliwy. + +Znaki te stanowiły tematyczny kontrapunkt dla gęstniejącego tłumu gości zbierających się w wewnętrznym atrium. Nieliczni wyglądali na studentów NYU. Większość przypominała raczej rozchełstanych fanów muzyki współczesnej tłoczących się przed salą koncertową w oczekiwaniu na główny punkt programu. Na jedno krótkie przedpołudnie masy te zawładnęły Warren Weaver Hall, ograniczając zadania pilnującej bezpieczeństwa portierki do oglądania telewizji i wskazywania ruchem ramienia audytorium, w którym odbywa się "przemówienie". + +Wewnątrz audytorium przybywający mogli zobaczyć osobę, która spowodowała czasowe zawieszenie zwykłych procedur bezpieczeństwa. Był to Richard M. Stallman, twórca projektu GNU, prezes Fundacji Wolnego Oprogramowania2, zdobywca MacArthur Fellowship3 w 1990, Association of Computing Machinery's Grace Murray Hopper Award4 (także w roku 1990), współzdobywca Takeda Award5 za rok 2001 i były haker z AI Lab. Zapowiedziany jako gospodarz "okołohakerskich" stron internetowych, w tym http://www.gnu.org, Stallman zjawił się na Manhattanie, gdzie się urodził, by wygłosić przemówienie o łatwej do przewidzenia treści, w którym wystąpił przeciwko prowadzonej przez Microsoft kampanii zwalczania projektu Powszechnej Licencji Publicznej GNU6. + +Tematem wykładu Stallmana była historia i przyszłość ruchu wolnego oprogramowania. Istotne jest miejsce jego wygłoszenia. Mniej niż miesiąc wcześniej w należącej również do NYU, położonej nieopodal Stern School of Business przemawiał Craig Mundie, jeden z prezesów Microsoft Corporation, grzmiąc i odsądzając od czci i wiary Powszechną Licencję Publiczną GNU wymyśloną przed Stallmana przed 16 laty, po perypetiach z drukarką laserową Xeroxa w r. 1980. Stworzona w celu przeciwdziałania narastającej fali utajniania oprogramowania, GPL ewoluowała, by stać się głównym narzędziem społeczności zwolenników wolnego oprogramowania. Mówiąc prościej, GPL nadaje programom komputerowym status własności społecznej lub, jak kto woli, powszechnej z zachowaniem legalności praw autorskich ((c) copyright). Nadanie tych praw jest nieusuwalne. Wszystkie wersje pochodne podlegają tej samej zasadzie ochrony praw autorskich, nawet te, które zawierają jedynie niewielki wycinek oryginalnego kodu źródłowego. Z tego powodu licencja ta w świecie przemysłu programistycznego została nazwana "wirusową", gdyż zarażała każdy program, którego dotknęła7. + +W biznesie informacyjnym, coraz bardziej zależnym od standardów oprogramowania, do GPL przywarła nazwa straszaka. Nawet firmy, które z początku z lekceważeniem naśmiewały się z niej, traktując ją jako programistyczną odmianę socjalizmu, zaczęły z wolna zmieniać zdanie i zauważać niesione przez nią korzyści. Linux - uniksopodobne jądro systemu stworzone przez fińskiego studenta Linusa Torvaldsa w roku 1991 - jest rozpowszechniany z licencją GPL, tak samo jak wiele powszechnie w świecie stosowanych narzędzi: GNU Emacs, GNU Debugger, GNU C Compiler itd. Razem narzędzia te tworzą wolny system operacyjny zbudowany przez hakerów i będący własnością ich światowej społeczności. Zamiast uważać tę społeczność za groźbę firmy najnowszej technologii, jak IBM, Hewlett Packard i Sun Microsystems, zaczęły polegać na jej osiągnięciach i sprzedawać aplikacje i usługi, korzystając ze wciąż rosnących zasobów wolnego oprogramowania. + +Jako broń strategiczną wykorzystują również wieczną wojnę społeczności hakerskiej z Microsoft Corporation, firmą programistyczną z Redmond w stanie Washington, która w latach osiemdziesiątych zdominowała rynek oprogramowania komputerów PC. Jako właściciel popularnego systemu operacyjnego Windows, Microsoft ma najwięcej do stracenia w przypadku przesuwania się światowego przemysłu w stronę oprogramowania z licencją GPL. Niemal każda linia kodu źródłowego Windows jest chroniona prawami autorskimi potwierdzającymi prywatną naturę własności lub przynajmniej prywatne prawa Microsoftu do korzystania z tego oprogramowania. Z punktu widzenia Microsoftu włączanie do Windows programów na licencji GNU byłoby podobne do zażywania tabletek poronnych zmniejszających populację własnych programów i klientów. Konkurencyjne firmy zdobyłyby nagle prawo kopiowania, modyfikowania i sprzedawania poprawionych wersji Windows, podkopując pozycję Microsoftu jako firmy numer 1 na rynku oprogramowania, dostarczającej wciąż nowe wersje pełnego luk i błędów systemu. Zatem wiele firm z coraz większym zainteresowaniem zaczęło się zastanawiać nad możliwością "adopcji" oprogramowania GPL. Z tego powodu Mundie w swoim przemówieniu wyklinał oprogramowanie z "ogólnie dostępnymi kodami źródłowymi", jego rozwój i rosnącą sprzedaż. Dlatego Stallman postanowił publicznie odpowiedzieć na te zarzuty w tym samym campusie uniwersyteckim. + +20 lat to dla przemysłu programistycznego bardzo długi okres. W roku 1980, gdy Stallman w AI Lab miał kłopoty z drukarką laserową Xeroxa, Microsoft, postrzegany obecnie przez hakerów jako główne zagrożenie, dopiero raczkował jako niewielka prywatna firma. IBM, wówczas najpotężniejsza firma przemysłu komputerowego na świecie, wprowadził właśnie na rynek swój pierwszy komputer osobisty, dając początek tworzeniu rynku taniego sprzętu komputerowego. Wiele technologii, których istnienie przyjmujemy teraz za rzecz oczywistą: Word Wide Web, telewizja satelitarna, 32-bitowe konsole gier wideo, w ogóle wówczas nie istniało. To samo dotyczy wielu firm znajdujących się obecnie w czołówce establishmentu, jak np. AOL, Sun Microsystems, Amazon.com i Dell. To wyliczanie można długo kontynuować. + +Fakt, że rynek wysokich technologii rozwinął się tak bardzo w tak krótkim czasie, przyczynił się do wzmocnienia obu stron biorących udział w debacie na temat GPL. Zwolennicy GPL wskazują na krótki żywot większości typów sprzętu komputerowego. Obawiając się ryzyka kupienia przestarzałego produktu, konsumenci biegną do firm, które od lat potrafią się utrzymać na rynku. Z tego powodu rynek oprogramowania stał się areną, na której słabsi są dobijani, a zwycięzcy biorą wszystko8. Zwolennicy GPL twierdzą, że rozpowszechnianie oprogramowania z zastrzeżonymi prawami własności prowadzi do monopolu i stagnacji. Silniejsze firmy zużywają całe zapasy życiodajnego tlenu i mniejsze, innowacyjne firmy nie mogą na rynku nawet odetchnąć. + +Oponenci GPL argumentują, że jest wprost przeciwnie. Sprzedaż oprogramowania jest tak samo lub nawet bardziej ryzykowna niż jego kupowanie. Bez legalnych gwarancji przypisanych do prywatnych licencji, nie wspominając już o ekonomicznych perspektywach tzw. killer app (tzn. przełomowych technologii pobudzających do życia nowe rynki)9, firmy tracą zainteresowanie udziałem w tych przedsięwzięciach. Powoduje to stagnację na rynku i zanikanie innowacji. W przemówieniu wygłoszonym 3 maja w tym samym campusie Mundie twierdził, że "wirusowa" natura GPL "stanowi zagrożenie" dla wszystkich firm, których konkurencyjność zależy od unikalności ich oprogramowania. Mówił: + + Podkopuje to fundamenty działalności niezależnego sektora komercyjnego przemysłu programistycznego, gdyż efektywnie uniemożliwia sprzedaż oprogramowania, gdy klienci są zmuszeni do płacenia za produkt, a nie tylko za jego dystrybucję10. + +Znaczny sukces GNU/Linux - systemu operacyjnego będącego połączeniem elementów skupionych wokół jądra chronionego licencją GPL - oraz osiągnięcia Windows w ciągu ostatnich 10 lat wskazują na znaczenie i perspektywy obu typów licencjonowania. Tak czy inaczej walka bieżąca jest wciąż ważnym elementem działania przemysłu oprogramowania. Nawet najwięksi dostawcy, jak Microsoft, korzystają ze wsparcia firm trzecich, których narzędzia, aplikacje i gry wspierają i uatrakcyjniają główne platformy systemowe, np. Windows. Opowiadając o gwałtownej ewolucji rynku technologii w ciągu ostatnich 20 lat, nawet bez brania pod uwagę osiągnięć jego własnej firmy, Mundie przestrzegał słuchaczy, by nie dali się uwieść owczemu pędowi do stosowania wolnego oprogramowania: + + Dwie dekady doświadczenia wskazują, że model ekonomiczny, w którym własność intelektualna podlega ochronie prawnej, zapewnia zwrot kosztów badań i prac rozwojowych oraz przynosi korzyści ekonomiczne, które stają się udziałem szerokich rzesz odbiorców. + +Te ostrzeżenia posłużyły Stallmanowi za punkt wyjścia dzisiejszego przemówienia. Mniej niż miesiąc po ich sformułowaniu rozdrażniony i gotów do rozpoczęcia ataku stanął na podium sali wykładowej. + +Dwie ostatnie dekady przyniosły dramatyczne zmiany rynku oprogramowania, a pewnie jeszcze silniej zmieniły samego Stallmana. Zniknął chuderlawy, gładko wygolony haker spędzający całe dnie w towarzystwie ukochanego PDP-10. Zamiast niego przed słuchaczami pojawił się mężczyzna w średnim wieku, o przeciętnej tuszy, z długą rabiniczną brodą; człowiek spędzający większość czasu na pisaniu e-maili i odpowiadaniu na nie, zwracający się do kolegów programistów i wygłaszający przemówienia takie jak dzisiejsze. Ubrany w kolorowy T-shirt i poliestrowe brązowe spodnie, wyglądał jak pustynny eremita, który właśnie opuścił siedzibę Armii Zbawienia. + +Tłum słuchaczy wyglądał podobnie. Wiele osób przyszło z laptopami i modemami komórkowymi, aby usłyszane słowa zapisywać i przekazywać na użytek społeczności internetowej. Na jedną kobietę przypadało piętnastu mężczyzn, a jedna na siedem lub osiem kobiet przyszła z wypchanym pingwinem, oficjalną linuksową maskotką, lub z wypchanym niedźwiadkiem "teddy bear11". + +Podniecony Stallman opuścił miejsce na mównicy i zasiadłszy w pierwszym rzędzie, zaczął wystukiwać polecenia na klawiaturze przygotowanego laptopa. Robił to przez następnych 10 minut niepomny obecności wzrastającej liczby krążących wokół niego studentów, profesorów i fanów. + +Przed rozpoczęciem wykładu musiała zostać dopełniona akademicka celebra. Ukazanie się Stallmana poprzedziły dwie, zamiast zwyczajowej jednej, zapowiedzi. Pierwszy wystąpił Mike Uretsky, jeden z dyrektorów Stern School's Center for Advanced Technology12. + + +Richard Stallman około roku 2000. "Zdecydowałem, że stworzę wolny system operacyjny lub polegnę próbując... oczywiście dożywszy słusznego wieku". Zdjęcie dzięki uprzejmości: http://www.stallman.org. + +Stwierdził, że "zadaniem uniwersytetu jest popieranie debat i podtrzymywanie interesujących dyskusji. To szczególne seminarium spełnia doskonale ten cel. Dyskusja na temat oprogramowania z otwartym kodem źródłowym jest bardzo interesująca." + +Zanim przeszedł do następnego zdania, Stallman zerwał się na równe nogi i zamachał rękami jak autostopowicz usiłujący zatrzymać samochód. + +"Ja robię wolne oprogramowanie" - rzekł wzbudzając wybuch śmiechu. - "Otwarty kod źródłowy to co innego". + +Śmiech przerodził się w aplauz. Sala była wypełniona zwolennikami Stallmana znającymi jego reputację człowieka zwracającego uwagę na ścisłe wysławianie się. Pamiętali też o jego publikacji z roku 1998, w której odżegnał się od propozycji zwolenników ruchu otwartego kodu źródłowego. Większość oczekiwała podobnych wybuchów, tak jak fani Jacka Benny'ego oczekują na jego słynną frazę "Nie wycinaj tego" wygłaszaną w czasie popularnych audycji radiowych. + +Uretsky szybko skończył swoją przedmowę, ustępując miejsca Edmundowi Schonbergowi, profesorowi wydziału nauk komputerowych NYU. Jako programista i uczestnik projektu GNU Schonberg wiedział, jak omijać lingwistyczne "miny". Składnie podsumował karierę Stallmana jako współczesnego programisty. + +"Richard jest doskonałym przykładem kogoś, kto przeszedł od działania lokalnego do myślenia o globalnym problemie dostępności kodów źródłowych." - mówił Schonberg. "Stworzył zgodną wewnętrznie filozofię, która zmusiła nas do ponownego przemyślenia problemów dotyczących produkcji oprogramowania, znaczenia własności intelektualnej i tego, co obecnie reprezentuje społeczność programistów." + +Gorąco powitał Stallmana, który po chwili potrzebnej do zamknięcia laptopa powstał z krzesła i wszedł na podium. + +Początek tego wystąpienia bardziej przypominał komedię Catskills13 niż przemówienie polityczne. "Chciałbym podziękować firmie Microsoft za danie mi okazji do dzisiejszego wystąpienia" - rozpoczął od dowcipu Stallman. "Przez kilka ostatnich tygodni czułem się jak autor książki przypadkowo zakazanej". + +Dla niewtajemniczonych wygłosił krótką, choć konkretną, gorącą pochwałę wolnego oprogramowania. Porównał program komputerowy do kucharskiej recepty. W obu przypadkach mamy do czynienia z dokładnym przepisem, który krok po kroku prowadzi nas aż do wykonania całego zadania, ale pozwala na dokonanie pożądanych modyfikacji - jeżeli mamy na to ochotę lub okoliczności tego wymagają. "Nikt was nie zmusza do dokładnego przestrzegania receptury. Możecie coś opuścić lub coś dodać. Jeżeli lubicie grzyby, możecie włożyć więcej grzybów, a jeżeli nie lubicie soli lub lekarz zabronił wam jej używać, możecie dać jej mniej niż w przepisie." + +Twierdził, że najważniejsze, by programy komputerowe, tak jak przepisy kucharskie, były ogólnodostępne. Dając gościowi przepis, kucharz traci niewiele ponad czas i papier potrzebny do jego zapisania. W przypadku programów komputerowych wysiłek jest jeszcze mniejszy; zwykle wystarcza kilka kliknięć myszą i nieco elektryczności. W obu przypadkach osoba dająca informacje korzysta podwójnie: wzmacnia przyjaźń i zwiększa prawdopodobieństwo uzyskania w rewanżu innych przepisów/programów. + +"Wyobraźcie sobie, co by się działo, gdyby przepisy kucharskie zapakować w szczelne czarne pudełka" - pytał Stallman, podnosząc głos. - "Nie wiedzielibyście, jakie składniki zostały użyte, więc nie wiedzielibyście również, co możecie zmienić. A gdybyście mimo to jakichś zmian dokonali albo sporządzili kopię dla przyjaciela, bylibyście ścigani jako piraci, a ścigający staraliby się osadzić was w więzieniu na długie lata. Taki świat może się wydawać straszny dla tych, którzy przywykli do dzielenia się z innymi posiadanymi informacjami. Ale właśnie taki jest świat własności prywatnej oprogramowania. Jest to świat, w którym zwykła ludzka przyzwoitość została zakazana". + +Dla uzasadnienia swojego zdania opowiedział epizod z drukarką laserową Xeroxa. Historia ta była chwytem retorycznym równie użytecznym jak porównanie z przepisem kucharskim. Pełniąc funkcję przypowieści, uświadamiała, jak dramatycznie szybkie zmiany następują w świecie oprogramowania. Cofnął słuchaczy myślą do czasów sprzed "jednokliknięciowego" dokonywania zakupów w Amazon.com, czasów bez Windows i bez baz danych Oracle'a, gdy znaki firmowe nie przypominały o prawach własności oprogramowania. + +Opowiedział to wszystko z wprawą i praktyką oskarżyciela publicznego dostarczającego ostatecznych, przygważdżających przeciwnika argumentów. Gdy doszedł do historii z drukarką laserową i odmawiającym mu udostępnienia kodu źródłowego profesorem Carnegie Mellon, zrobił efektowną pauzę. + +"On nas zdradził" - powiedział, - "ale krzywdę uczynił nie tylko nam. Prawdopodobnie uczynił ją każdemu z was". + +Mówiąc "was", skierował palec wskazujący w stronę jednego z nic niepodejrzewających słuchaczy. Brwi wskazanego uniosły się w zdziwieniu, ale wzrok Stallmana już przesunął się dalej. Powoli i z rozwagą wskazał kogoś innego, chichoczącego nerwowo: "I sądzę, że skrzywdził również ciebie" - rzekł do jegomościa w trzecim rzędzie. + +Wskazany przestał chichotać, co widownia przyjęła śmiechem. Gest wyglądał scenicznie i taki był w rzeczywistości. Zawsze, gdy dochodził do końca historii o drukarce laserowej, czynił to z doskonałością showmana. "Wyrządził zło prawdopodobnie każdemu z obecnych tu na sali, za wyjątkiem tych niewielu, którzy w roku 1980 jeszcze się nie narodzili" - mówił dalej, wzbudzając gromki śmiech. "Twierdzę tak, gdyż odmówił współpracy z całą ludzkością, ze wszystkimi mieszkańcami planety Ziemia". + +Poczekał aż komentarz dotrze do świadomości słuchaczy i dodał "Zdradził was, podpisując umowę o nieujawnianiu informacji". + +Przekształcenie Richarda Matthew Stallmana ze sfrustrowanego akademika w politycznego przywódcę przemawiającego już od 20 lat świadczy o jego upartej naturze i wyjątkowej woli oraz jasno określonej wizji i wartościach, które głosi, wytrwale budując ruch wolnego oprogramowania. Dodać do tego należy autorstwo programów najwyższej jakości, które ustaliły jego legendarną reputację programisty. Wielu zwolenników uważa jednak ruch wolnego oprogramowania za jego największe osiągnięcie. + +Co najważniejsze, Stallman działa w świecie o zmiennej naturze potęg politycznych, który jednak coraz bardziej uzależnia się od komputerów i sterujących ich działaniem programów. + +Być może dlatego w czasach, gdy wiele osobistości związanych z najnowszą technologią odchodzi w zapomnienie, jego gwiazda błyszczy coraz silniejszym światłem. Od czasu rozpoczęcia projektu GNU w roku 198414, Stallman był kolejno ignorowany, wyśmiewany, oczerniany i atakowany wewnątrz ruchu wolnego oprogramowania i poza nim. Pomimo to projekt GNU pokonuje na swej drodze kolejne kamienie milowe, aczkolwiek czasem z pewnym opóźnieniem wynikającym z coraz większych wymagań rynku, o wiele bardziej złożonego niż w chwili rozpoczęcia działania przed 18 laty. To samo można powiedzieć o ideologii GNU drobiazgowo dopracowywanej przez samego Stallmana. + +Aby zrozumieć ukryte mechanizmy tego działania, należy dokładnie poznać wypowiedzi zarówno samego Stallmana, jak i ludzi z nim współpracujących oraz tych, którzy go zwalczają. Jego charakter nie jest skomplikowany i pasuje do starego powiedzenia: "koń jaki jest, każdy widzi". + +Eden Moglen, doradca prawny Fundacji Wolnego Oprogramowania i profesor prawa na w Columbia University, twierdzi, że "aby poznać ludzką naturę Stallmana, wystarczy się przyjrzeć poszczególnym jej częściom i złożyć wszystko w całość. Ekscentryczność, którą niektórzy uważają za barierę utrudniającą poznanie go, jest jego właściwą naturą. Prawdziwe są jego silne poczucie frustracji i nadawanie wielkiego znaczenia przestrzeganiu zasad etycznych oraz całkowita niezdolność do kompromisu. Jest to podstawa jego działań i fundament tego, co zbudował". + +Wytłumaczenie drogi, która doprowadziła go od epizodu z drukarką laserową do walki z najbogatszą korporacją świata, nie jest łatwym zadaniem. Wymaga szczegółowego przemyślenia powodów, dla których sprawa własności oprogramowania stała się tak istotna dla współczesnego społeczeństwa. Wymaga także przemyślanej oceny człowieka, który jak wielu przywódców politycznych przed nim zrozumiał podatność ludzkiej świadomości. Wymaga to umiejętności interpretowania mitów i politycznych obciążeń słów kojarzonych z jego osobą. Na koniec, wymaga to zrozumienia geniuszu programistycznego Stallmana oraz wzlotów i upadków na drodze wykorzystania tego geniuszu w innych dziedzinach. + +Poproszony o podsumowanie swojej drogi, Stallman zgadza się, że istotą jest spostrzeżona przez Moglena fuzja osobowości i zasad. "Upór to moja mocna strona" - przyznaje. "Wielu ludzi biorących się za rzeczy trudne zniechęca się i rezygnuje w wyniku piętrzących się trudności. Ja nigdy nie rezygnuję". + +Wierzy także w ślepy traf. Mógł nigdy nie mieć kłopotów z drukarką Xeroxa, mógł nie doznać osobistych i politycznych problemów, które zakończyły jego karierę pracownika MIT, mogło nie mieć miejsca pół tuzina innych zdarzeń, które stały się istotnymi czynnikami w jego życiu. Z łatwością wyobraża sobie swoje życie przebiegające zgoła odmiennie. Jak już powiedzieliśmy, Stallman jest wdzięczny siłom i okolicznościom, które odmieniły jego los. + +"Po prostu mam odpowiednie uzdolnienia i skłonności" - mówi do słuchaczy, podsumowując rozpoczęcie projektu GNU. "Nikt oprócz mnie się tym mnie zajął, więc zapewne byłem przeznaczony do tej roli. Muszę podołać zadaniu. Jeżeli nie ja, to kto?" + + +Rozdział 3. +Portret hakera w wieku młodzieńczym + +Matka Richarda Stallmana, Alice Lippman, pamięta moment, w którym uświadomiła sobie, że jej syn posiada szczególny dar. + + "Myślę, że miał wtedy osiem lat" - wspomina. + +Był rok 1961 i Lippman, świeżo po rozwodzie, chciała spędzić weekend z rodziną w niewielkim jednopokojowym mieszkaniu na manhattańskim Upper West Side. Kartkując Scientific American, dotarła do ulubionego działu, prowadzonej przez Martina Gardnera kolumny autorskiej pod tytułem "Gry matematyczne". Jako pracująca na zastępstwie nauczycielka sztuki lubiła kolumnę Gardnera, gdyż drażniąc trudnymi pytaniami, zmuszała do myślenia. Richard z nosem ukrytym w książce siedział na sąsiedniej sofie, więc postanowiła wziąć się za rozwiązywanie cotygodniowej łamigłówki. + +"Nie byłam w tym najlepsza" - przyznaje, - "ale jako artystka, uważałam, że pomaga mi to w przełamywaniu barier myślowych". + +Przypomina sobie, że wówczas nie wiedziała, jak "ugryźć" łamigłówkę, i gdy już miała zamiar z niesmakiem odrzucić pismo, poczuła delikatne pociągnięcie za rękaw bluzki. + +"To był Richard" - wspomina, - który chciał się dowiedzieć, czy nie potrzebuję pomocy". + +Spoglądając na przemian na łamigłówkę i syna, na początku podeszła sceptycznie do propozycji. "Spytałam go, czy już przeczytał pismo. Potwierdził i dodał, że rozwiązał łamigłówkę, po czym zaczął mi wyjaśniać, jak to zrobił". + +W miarę słuchania wyjaśnień syna jej sceptycyzm szybko przeradzał się w niedowierzanie. "Zawsze wiedziałam, że z niego zdolne dziecko, ale po raz pierwszy uświadomiłam sobie, jak bardzo jest rozwinięty". + +Trzydzieści lat później kwituje to wspomnienie uśmiechem. "Prawdę mówiąc, nie sądzę, abym kiedykolwiek pojęła, jak należało rozwiązać tamtą łamigłówkę. Pamiętam jedynie swoje zdumienie, że on to potrafi". + +Siedząc w jadalni trzypokojowego mieszkania, tego samego, do którego przeniosła się wraz z synem w roku 1967, po ślubie z nieżyjącym już drugim mężem Mauricem Lippmannem, promienieje mieszaniną dumy żydowskiej matki i radości, jaką jej sprawia wspominanie dziecięcych lat syna. Na stojącej opodal komodzie widnieje zdjęcie o wymiarach 8 na 10 cali przedstawiające Stallmana w dostojeństwie długiej brody i togi doktora honoris causa. W jego cieniu pozostają zdjęcia bratanicy i siostrzeńców, ale nim gość zdoła się przyjrzeć, Alice Lippman rozluźnia nastrój dowcipną uwagą. + +"Po otrzymaniu doktoratu University of Glasgow Richard upierał się, abym wzięła to zdjęcie, mówiąc: Wiesz, mamo, to mój pierwszy stopień naukowy"1. + +Takie komentarze ukazują rodzaj humoru, który towarzyszył wzrastaniu cudownego dziecka. Na każdą wzmiankę o uporze i niezwyczajnym zachowaniu syna Alice potrafi opowiedzieć tuzin anegdot. + +"Był bardzo konserwatywny" - opowiada, zacierając ręce żartobliwym gestem. "Najostrzejsze dyskusje odbywały się przy tym stole. Należałam do pierwszej grupy nauczycieli szkół publicznych, którzy założyli związek zawodowy, za co Richard bardzo się na mnie gniewał. Uważał, że związki zawodowe powodują korupcję. Był także przeciwnikiem ubezpieczeń społecznych. Uważał, że ludzie mogą osiągnąć znacznie więcej, samodzielnie inwestując pieniądze. Kto się mógł spodziewać, że po 10 latach wyrośnie z niego idealista. Pamiętam, że jego przyrodnia siostra mówiła: Co z niego będzie? Wyrośnie na faszystę". + +Alice Lippman wyszła za Daniela Stallmana w roku 1948. Rozeszła się z nim w 1958 i przez niemal 10 lat samotnie wychowując Richarda, wpoiła mu awersję do autorytetów oraz żądzę wiedzy. Był to czas ścierania się dwóch sił, ona i syn staczali ciągłe boje. + +"Nigdy nie chciał jeść" - wspomina. "Trwało to od skończenia 8 lat do końca szkoły średniej w roku 1970. Gdy wołałam go na obiad, nigdy nie słyszał. Zanim to do niego dotarło, musiałam krzyczeć dziewięć lub dziesięć razy. Całkowicie zatapiał się w myślach". + +Stallman pamięta to podobnie, ale z pewnym podtekstem. "Lubiłem czytać" - wspomina. - "Jeżeli miałem ochotę poczytać, a matka wołała mnie do kuchni albo kazała iść spać, nie miałem ochoty słuchać. Nie rozumiałem, dlaczego mam przerywać czytanie. Nie było żadnego powodu, dla którego miała prawo mi nakazywać, co mam robić. Podstawowe idee demokracji, o których czytałem, stosowałem do siebie samego. Nie rozumiałem, dlaczego nie miałyby dotyczyć dzieci". + +Wiarę w osobistą wolność wyłamywania się spod władzy autorytetów rozciągał na szkołę. Wyprzedzając kolegów klasowych o dwa lata, już w wieku 11 lat doświadczył frustracji, które zwykle są udziałem utalentowanego ucznia szkoły publicznej. Niedługo po rozwiązaniu przez Richarda prasowej łamigłówki jego matka przeżyła pierwszą z wielu wywiadówek. + +"W ogóle odmawiał pisania wypracowań" - wspomina dawne problemy. "Myślę, że ostatnie, jakie napisał przed klasą maturalną, było esejem na temat historii systemów liczbowych przygotowanym na polecenie nauczyciela w czwartej klasie". + +Uzdolniony we wszystkich dziedzinach, które wymagały myślenia analitycznego, ciążył ku matematyce i naukom ścisłym, zaniedbując wszystkie pozostałe. To, co inni nauczyciele traktowali jako jednostronne ograniczenie, matka uważała za głód wiedzy. Matematyka i nauki ścisłe oferowały tak wiele do poznania w porównaniu z przedmiotami, do których jej syn miał mniej zdolności. W wieku 10 lub 11 lat, gdy inni chłopcy z jego klasy rozpoczęli naukę gry w futbol, jej syn - jak wspomina - zaczął wracać do domu sfrustrowany. "Nie chciał grać tak fatalnie, ale po prostu miał kłopoty z koordynacją ruchów. To go wprawiało we wściekłość". + +Złość spowodowała jeszcze silniejsze skupienie się na matematyce i naukach ścisłych. Jego pasja nawet przy rzeczywistej pracy naukowej mogła sprawiać kłopoty. Pochłaniając książki matematyczne w wieku siedmiu lat, nie odczuwał potrzeby wdawania się w rozmowy z dorosłymi. W latach nauki w middle-school2 matka wpadła na pomysł, by wynająć studenta z sąsiedniego Columbia University, który mógłby zajmować się Richardem jak starszy brat. Po pierwszym spotkaniu student wyszedł i nigdy nie powrócił. "Wyobrażam sobie, co Richard musiał mu nagadać" - spekuluje matka. + +Kolejna matczyna anegdota dotyczy lat sześćdziesiątych, czasu tuż po zdarzeniu z łamigłówką. Mniej więcej w wieku lat siedmiu, w dwa lata po rozwodzie matki, Richard zajął się puszczaniem modeli rakiet w sąsiednim Riverside Drive Park. To, co zaczęło się jako niewinna zabawa, rychło stało się poważnym zadaniem badawczym połączonym z zapisywaniem danych o każdym starcie. Podobnie jak zainteresowanie grami matematycznymi, tak i ta pasja syna nie wzbudzała jej zbytniego zainteresowania. Było tak do czasu ważnego wystrzelenia rakiety przez NASA. Spytała wówczas Richarda, czy zamierza to oglądać w telewizji. + +"Wściekł się i jedyne, co mogłam zrozumieć, to to, że jeszcze czegoś nie opublikował" - wspomina. - "Naprawdę uważał, że ma coś istotnego do zakomunikowania NASA". + +Takie anegdoty świadczą o jego wczesnym silnym angażowaniu się w wykonywane zadania. Będzie go to cechowało przez całe życie. Gdy inne dzieci bawiły się, on siedział w pokoju i czytał. Gdy inne dzieci naśladowały Johnny'ego Unitasa3, on naśladował Wernera von Brauna. "Byłem dziwakiem" - zwięźle podsumował swoje młodzieńcze lata w wywiadzie z 1999 r. - "W pewnym wieku nie miałem żadnych przyjaciół poza nauczycielami4". + +Choć oznaczało to dla niej częstsze starcia ze szkołą, Alice Lippman zdecydowała się pozwalać synowi na realizowanie jego pasji. W wieku 12 lat Richard uczestniczył w letnich obozach naukowych, a w ciągu roku szkolnego - w dodatkowych zajęciach w szkole prywatnej. Nauczyciel poradził jej zapisanie syna do uczestnictwa w Columbia Science Honors Program5, który w erze posputnikowej uruchomiono dla uzdolnionej młodzieży z nowojorskich szkół średnich i college'ów. W ten sposób Stallman zaczął sobotnie wędrówki do campusu Columbia University. Jak wspomina Dan Chess, kolega z wykładów w Columbia Science Honors Program, Stallman wydawał się być "zakręcony" nawet w tej grupie miłośników matematyki i nauk ścisłych. "Wszyscy byliśmy dziwacznymi, nieprzystosowanymi do życia młokosami, zakochanymi w matematyce i naukach ścisłych, ale Richard wyróżniał się nawet wśród nas" - wspomina Chess, obecnie profesor matematyki w Hunter College. "Był bystry jak diabli. Widziałem wielu bystrych ludzi, ale on był ze wszystkich najbystrzejszy". + +Inny kolega z Columbia Science Honors Program, Seth Breidbart, potwierdza tę opinię. Programista, którego ze Stallmanem łączyły wspólne zainteresowania science-fiction i konwencjami tego gatunku, wspomina go jako krótko wystrzyżonego "strasznego" piętnastolatka. + +"Ciężko to opisać" - mówi Breidbart. - "Nie był niedostępny. Był strasznie spięty. O dużej wiedzy, ale pod pewnymi względami niereformowalny". + +Takie opinie rodzą spekulacje: czy określenia "spięty" i "niereformowalny" to cechy, które możemy dzisiaj uznać za zwykłe dziecięce wyłamywanie się z reguł środowiska? Pismo Wired z grudnia 2001 r. w artykule "The Geek Syndrome6"7 kreśli portrety kilku naukowo uzdolnionych dzieci, u których zdiagnozowano zespół Aspergera8 z cechami silnego autyzmu. Pod wieloma względami przytoczone przez Wired wspomnienia rodziców tych dzieci niejasno kojarzą się z tym, co opowiada matka Stallmana. Nawet on sam czasem pozwala sobie na psychiatryczne konotacje. W roku 2000, kreśląc swą sylwetkę dla Toronto Star, opisał siebie jako "będącego na granicy autyzmu"9, co odpowiada jego wykazywanej przez całe życie chęci społecznego i emocjonalnego izolowania się od otoczenia i równie długotrwałym usiłowaniom przezwyciężenia tych skłonności. + +Takie spekulacje wynikają, oczywiście, z częstych ostatnio rozważań na temat swobodnego i nieodpowiedzialnego zachowania związanego z tzw. behavioral disorder10. Jak twierdzi Steve Silberman, autor The Geek Syndrome, amerykańscy psychiatrzy używają ostatnio nazwy zespołu Aspergera jako wygodnego parasola kryjącego wiele różnorakich cech behawioralnych: od ograniczonych zdolności motorycznych i niemożności współżycia z otoczeniem po wybitną inteligencję połączoną ze szczególnym zainteresowaniem liczbami, komputerami i systemami11. Biorąc pod uwagę tak szeroki zasięg "parasola" zwanego zespołem Aspergera, Stallman może przypuszczać, że gdyby urodził się 40 lat później, w ten sposób zostałby zdiagnozowany. Zapewne spotkałoby to wielu jego kolegów-komputerowców. + +"Możliwe, że miałem coś takiego" - stwierdza - "ale z drugiej strony jedną z cech charakterystycznych tego zespołu są trudności w zachowaniu rytmu. Ja umiem tańczyć, a nawet sprawia mi przyjemność poruszanie się w takt melodii o najbardziej skomplikowanym rytmie. Ale to wszystko nie jest do końca wyjaśnione". + +Chess wyklucza tego rodzaju diagnozę: "Nigdy nie przypuszczałem, że cierpi na coś takiego. Był po prostu nietowarzyski, ale wszyscy byliśmy tacy". + +Matka Richarda uznaje tę interpretację za zabawną. Jednakże wspomina kilka historii z jego dzieciństwa, które mogą stanowić pożywkę dla dalszych spekulacji. Dwie spośród opowiadanych przez nią anegdot pasują do ważnej cechy autyzmu, jaką jest nadwrażliwość na dźwięki i kolory. "Gdy Richard był dzieckiem, zabraliśmy go na plażę" - powiada matka. - "Zaczął marudzić o dwie lub trzy przecznice wcześniej, nim dotarliśmy do wody. Dopiero gdy to się powtórzyło, za trzecim razem zrozumieliśmy, jaka była przyczyna jego narzekania. Szum fal ranił jego uszy". Pamięta również podobną reakcję na kolory. "Moja matka miała intensywnie rude włosy i zawsze, gdy się pochylała nad Richardem, aby go wziąć na ręce, uderzał w płacz". + +Ostatnio zaczęła czytać książki o autyzmie i sądzi, że zdarzenia te były czymś więcej niż zwykłym zbiegiem okoliczności. "Sądzę, że Richard miał pewne skłonności autystyczne. Szkoda, że wówczas tak niewiele o tym wiedziano". + +Jednakże uważa, że z czasem jej syn przystosował się. W wieku siedmiu lat lubił stawać w pobliżu przedniej szyby wagonu metra, odczytywać, zapamiętywać i porządkować w głowie podziemny labirynt komunikacyjny. Było to jego hobby połączone z przystosowywaniem się do słuchania dźwięków towarzyszących ruchowi wagonów. "W pierwszej chwili hałas wywoływał w nim odrazę, po czym jego nerwy uspokajały się". + +Jak wspomina, jej syn prawie zawsze wykazywał podniecenie, energię i umiejętność kontaktowania się z innymi, taką samą jak wszyscy normalni chłopcy. Dopiero po serii traumatycznych zdarzeń, które spadły na ich rodzinę, zamknął się w sobie i stał się introwertykiem. + +Pierwszym zdarzeniem traumatycznym był jej rozwód z Danielem Stallmanem, ojcem Richarda. Choć oboje starali się przygotować chłopca na ten cios, spowodował on spustoszenia w jego psychice. "Gdy po raz pierwszy powiedzieliśmy mu o tym, co ma nastąpić, zdawał się nie przywiązywać do tego wagi" - wspomina. "Rzeczywistym uderzeniem była dla niego moja i jego przeprowadzka do nowego mieszkania. Pierwszym jego pytaniem było A gdzie meble tatusia?". + +W ciągu następnych dziesięciu lat pięć dni w tygodniu spędzał w mieszkaniu matki na Manhattanie, a weekendy - w domu ojca w Queens. Te odejścia i powroty pozwoliły mu na ocenę różnego stylu życia obojga rodziców i wywołały trwały uraz przejawiający się w niechęci do posiadania i wychowywania dzieci. Gdy mówi o ojcu, weteranie II wojny światowej, który zmarł w roku 2001, wyraża na przemian złość i szacunek. Z jednej strony pamięta go jako człowieka, który z moralnego obowiązku, aby być bardziej użytecznym dla aliantów, nauczył się francuskiego, a z drugiej - jako ojca, który zawsze wiedział, w jaki sposób sformułować odmowę, aby cios był najokrutniejszy12. + +"Mój ojciec miał straszny charakter" - twierdzi Richard. - "Nigdy nie narzekał, ale zawsze znalazł sposób, aby krytykować spokojnie, na zimno i miażdżąco." + +Na temat mieszkania z matką wyraża się mniej dwuznacznie. "To była wojna" - powiada. - "W swym nieszczęściu, mówiąc Idę do domu, mówiłem o czymś nieistniejącym, o czymś, czego nigdy nie miałem". + +W ciągu kilku lat po rozwodzie rodziców azylem stał się dla niego dom dziadków ze strony ojca. Gdy miał około dziesięciu lat, dziadkowie zmarli - jedno wkrótce po drugim. Był to dla niego wielki cios. "Uciekałem tam, do miejsca, gdzie znajdowałem spokój i gdzie mnie kochano" - wspomina. - "Przed pójściem do college'u było to jedyne moje miejsce na świecie". + +Matka uważa śmierć dziadków za drugie traumatyczne zdarzenie, które spotkało syna. "Bardzo się tym przejął" - twierdzi. "Był do nich bardzo przywiązany. Do czasu ich śmierci był bardzo otwarty, przewodził paczce rówieśników. Potem zamknął się w sobie, stał się wyobcowany". + +Z perspektywy samego Stallmana emocjonalna izolacja była jedynie próbą poradzenia sobie z końcem okresu dojrzewania. Nazywa swoje młodzieńcze lata "czystym horrorem" i twierdzi, że często czuł się jak głuchy wśród tłumu dyskutującego o muzyce. + +"Często wydawało mi się, że nie jestem w stanie pojąć, co inni mówią" - wspomina, uważając, że emocjonalna zasłona odgrodziła go od świata rówieśników i dorosłych. "Pojmowałem słowa, ale coś tkwiącego głębiej nie pozwalało mi złożyć ich w zrozumiałą całość. Nie mogłem pojąć, dlaczego jedni są zainteresowani tym, co mówią inni." + +Kończący się okres dojrzewania wzmocnił jego poczucie indywidualizmu. Gdy większość jego rówieśników zapuszczała wówczas długie włosy, on strzygł się krótko. Gdy całe pokolenie słuchało rocka, on wolał muzykę klasyczną. Zawołany miłośnik science-fiction, magazynu "Mad"13 i późnonocnych programów telewizyjnych, kultywował swą odrębność hodowaną na gruncie niezrozumienia rodziców i rówieśników. + +"A te kalambury" - matka Richarda wspomina z przerażeniem okres, gdy był nastolatkiem - "przy stole nie można było słowa powiedzieć, bo wszystko przekręcał w jakiś kalambur zwrócony przeciw mówiącemu". + +Zapamiętywał dowcipy i zabawy słowne, by poza domem opowiadać je dorosłym, którzy byli skłonni pobłażać utalentowanemu dzieciakowi. Pierwszym był instruktor na obozie letnim, który wręczył dwunastolatkowi drukowaną instrukcję obsługi komputera IBM 7094. Dla chłopaka zafascynowanego liczbami i nauką był to dar niebios14. Przed końcem lata potrafił już pisać na papierze programy zgodne ze specyfikacjami wewnętrznymi 7094, zakładając, że znajdzie okazję do ich uruchomienia. + +Pierwszy komputer osobisty miał się pojawić dopiero po dekadzie, więc wszystko wskazywało na to, że przyjdzie mu długo czekać na ziszczenie pragnień. Okazja trafiła się, gdy był w pierwszej klasie junior high school. Po rozdaniu świadectw zaczął pracę w obecnie już nieistniejącym IBM New York Scientific Center w centrum Manhattanu. Spędził tam lato, pisząc swój pierwszy program: preprocesor dla 7094 w języku PL/I. "Najpierw pisałem w PL/I, by potem przejść na asembler, gdy okazało się, że program w PL/I jest za duży do uruchomienia na tym komputerze" - wspomina. + +Po opuszczeniu IBM Scientific Center zatrudnił się jako asystent laboratoryjny na wydziale biologii Rockefeller University. Choć jego zainteresowania już wyraźnie zaczęły się skupiać na matematyce i fizyce, jego analityczny sposób myślenia wywarł wrażenie na dyrektorze laboratorium, który w kilka lat później niespodzianie zadzwonił do matki Richarda. "Chciał się dowiedzieć, co Richard robi. Był zdumiony, że zajmuje się komputerami, bowiem przypuszczał, że wyrośnie z niego doskonały biolog". + +Jego zdolności analitycznego myślenia wzbudzały podziw także na zajęciach Columbia Science Honors Program, nawet wówczas gdy zachowywał się irytująco. "Zwykle raz lub dwa w ciągu godziny znajdował jakiś błąd w wykładzie" - wspomina Breidbart "i nie brakowało mu śmiałości do natychmiastowego wytknięcia go wykładowcy. Dzięki temu cieszył się wielkim respektem, ale znacznie mniejszą popularnością". + +Przypomnienie przytoczonej przez Breidbarta anegdoty wywołuje krzywy uśmiech na twarzy Stallmana. "Może czasem się ich czepiałem" - twierdzi, - "ale właśnie wśród nauczycieli znajdowałem bratnie dusze, bo w przeciwieństwie do uczniów chcieli się uczyć. Szczeniaki w większości nie miały na to ochoty, przynajmniej nie w tym samym stopniu". + +Sobotnie przebywanie wśród uzdolnionej młodzieży niewątpliwie zwiększyło jego pewność siebie i chęć kontaktowania się z rówieśnikami. W miarę zbliżania się czasu studiów jego zainteresowania, tak samo jak większości kolegów z Columbia Science Honors Program, stawały się coraz bardziej ukierunkowane, co powodowało zawężanie możliwości wyboru uczelni. W końcu pozostały tylko dwie: Harvard i MIT. Słysząc, że syn wybiera się na uczelnię należącą do Ivy League15, Alice Lippman poważnie zainteresowała się tą sprawą. Jako piętnastoletni uczeń junior high school Stallman wciąż miewał starcia z nauczycielami i administracją szkoły, wciąż z nimi polemizował. W poprzednim roku otrzymał ocenę A z historii Ameryki, chemii, francuskiego i algebry, ale te osiągnięcia przyćmiewało F16 z angielskiego, co było wynikiem bojkotowania przez niego wszelkich wypracowań. Coś takiego mogło być przełknięte przez MIT, ale nigdy przez Harvard. + +W czasie nauki w junior school matka zwróciła się o pomoc do terapeuty, który polecił skupić się na niechęci do pisania wypracowań i na wymądrzaniu się przy nauczycielach. Syn miał predyspozycje intelektualne do studiowania na Harvardzie, ale nie było pewne, czy starczy mu cierpliwości, by tak jak inni koledzy pisać na czas okresowe prace. Terapeuta zaproponował zrobienie próby. Jeżeli Richard przebrnie rok nauki w nowojorskiej szkole publicznej, w której jest wymagane pisanie prac okresowych z angielskiego, prawdopodobnie da sobie radę również na Harvardzie. Po zakończeniu nauki w junior high school Stallman zapisał się na letnie zajęcia prowadzone w Louis D. Bradeis High School na 84-tej ulicy i zaczął się uczyć trudnej sztuki pisania obowiązkowych prac klasowych, czego unikał w swojej dotychczasowej karierze szkolnej. + +Jesienią powrócił w szeregi zwykłych uczniów szkoły. Ciężko mu przychodziło cierpliwe przesiadywanie na lekcjach, które, w porównaniu z sobotnimi zajęciami w Columbia University, wydawały mu się pokutą, ale matka wspomina z dumą, że zdołał się podporządkować. + +"Do pewnego stopnia czuł się upokorzony, ale dał radę" - wspomina. "Graniczyło z cudem, że tylko raz wezwano mnie do szkoły. Nauczyciel matematyki narzekał, że Richard wciąż przerywa lekcje. Spytałam, w jaki sposób. Oskarża mnie, że źle przeprowadzam dowody. Ma rację, ale właściwych rozwiązań nikt, prócz niego, by nie zrozumiał". + +Na koniec pierwszego semestru w Brandeis wszystko się ułożyło. Ocena A 96 z angielskiego wymazała piętno wcześniejszych niepowodzeń i 60 punktów otrzymanych 2 lata temu. Podtrzymał dobrą opinię świetnymi ocenami z historii amerykańskiej, matematyki i mikrobiologii. Ukoronowaniem osiągnięć było 100 punktów z fizyki. Choć nadal stronił od innych, 11 miesięcy nauki w Brandeis zakończył 4. lokatą wśród 789 rówieśników. + + +Kopia świadectwa Stallmana z Louis D. Brandeis High School z listopada 1969. Należy zwrócić uwagę na doskonałą ocenę z angielskiego. "Do pewnego stopnia czuł się upokorzony, ale dał radę" - wspomina matka. + +Poza szkołą uczył się z jeszcze większą niż dotychczas pilnością, wykonując swe obowiązki asystenta laboratoryjnego w Rockefeller University i uczęszczając na sobotnie zajęcia w Columbia University, gdzie po drodze musiał mijać protestujących przeciw wojnie w Wietnamie. Wszyscy biorący udział w Science Honors Program od dawna dyskutowali nad wyborem uczelni, aż wreszcie przyszedł moment, gdy i on musiał się zdecydować. + +Breidbart wspomina: "Większość z nas wybierała się, oczywiście, na Harvard lub MIT, choć było kilku decydujących się na inne uczelnie Ivy League. Z rozmów wynikało, że Richard jeszcze nie pisnął słowa, gdzie zamierza studiować. Nie wiem, kto wreszcie zdobył się na odwagę, by spytać go o to". + +Trzydzieści lat później Breidbart dokładnie pamięta ten moment. Po oświadczeniu Stallmana, że również wybiera się na Harvard, w sali zapadła krępująca cisza. Wargi Richarda z wolna wgięły się w pełnym samozadowolenia uśmiechu. + +To było jego milczące stwierdzenie: "Tak... jeszcze się mnie nie pozbyliście". + + +Rozdział 4. +Impeach God1 + +Choć stosunki między nimi były napięte, Richard odziedziczył po matce istotną i wartą odnotowania cechę: pełne pasji zainteresowanie polityką. + +Jednakże cecha ta objawiła się w pełni dopiero po dziesięcioleciach. Kilka pierwszych lat życia spędził, jak teraz przyznaje, w "politycznej próżni"2. Jak większość Amerykanów w czasach Eisenhowera, rodzina Stallmanów starała się w latach pięćdziesiątych powrócić do normalnego życia utraconego w wojennych czasach lat czterdziestych. + +"Ojciec Richarda i ja należeliśmy do partii demokratycznej i to nam wystarczało" - mówi Alice Stallman, wspominając lata spędzone w Queens. - "Nie angażowaliśmy się ani w politykę lokalną, ani państwową". + +Zaczęło się to zmieniać w późnych latach pięćdziesiątych, po rozwodzie Alice i Daniela Stallmanów. Powrót na Manhattan był czymś więcej niż zwykłą zmianą adresu, była to również zmiana dotychczasowego stylu życia i wytrącenie z błogiego spokoju. + +"Myślę, że moje spotkanie z polityką zaczęło się od wizyty w bibliotece publicznej, gdzie znalazłam tylko jedną książkę na temat rozwodów" - wspomina Alice. - "Biblioteka była ściśle nadzorowana przez Kościół katolicki, przynajmniej w Elmhurst, gdzie mieszkaliśmy. Myślę, że wówczas po raz pierwszy uświadomiłam sobie istnienie sił, które nieśpiesznie i z ukrycia sterują naszym życiem". + +Wracając na manhattański Upper West Side, w okolice znane z dzieciństwa, była zaskoczona zmianami, które zaszły tam od czasu, gdy przed piętnastu laty opuściła Hunter College. Powojenny głód mieszkaniowy zamienił okolicę w arenę walk politycznych. Z jednej strony byli prorozwojowi politycy z rady miejskiej dążący do przebudowy i rozbudowy kwartałów miasta i zasiedlenia ich tłumem napływających do miasta urzędników. Po drugiej stronie stała biedota irlandzkich i portorykańskich dzierżawców i podnajemców, która w okolicy znalazła nędzną przystań. + +Na początku Alice Lippman nie wiedziała, po której stronie ma stanąć. Jako świeżo zamieszkała w tej okolicy rozumiała, czym jest chęć posiadania mieszkania. Jako samotna matka z minimalnymi dochodami podzielała punkt widzenia biedaków zaniepokojonych planami budownictwa przeznaczonego dla bogatych. Oburzenie skłoniło ją do szukania sposobów walki z machiną polityczną dążącą do zamiany sąsiedztwa w kopię Upper East Side. + +Wspomina swą pierwszą wizytę w lokalnej siedzibie Partii Demokratycznej w roku 1958. Szukała instytucji, gdzie idąc do pracy, mogłaby pozostawiać syna, ale przeraziły ją warunki panujące w jednym z utrzymywanych przez miasto ośrodków pomocy dla ubogiej ludności. "Wszystko, co pamiętam, to stęchły zapach skwaśniałego mleka, ciemne zakamarki i ogólny niedostatek. Byłam nauczycielką w prywatnej szkole opiekunek do dzieci. Kontrast był tak wielki, że po zajrzeniu do środka uciekłam. Bardzo mnie to wzburzyło". + +Wizyta w lokalnej siedzibie partii, którą zapamiętała jako "pomieszczenie przesiąknięte zapachem tytoniowego dymu" przyniosła rozczarowanie. Jak wspomina, po tej wizycie uświadomiła sobie, że korupcja w partii może być rzeczywistą przyczyną wrogości miasta wobec ubogich. Nie zajrzała więcej do siedziby władz partyjnych, gdyż uznała, że lepiej przyłączyć się do jednego z klubów działających na rzecz zreformowania machiny partyjnej demokratów i usunięcia z niej wpływów Tammany Hall3. Zapisała się do klubu, który szedł w ślady Woodrow Wilson4/FDR5 Reform Democratic Club i wraz z innymi członkami zaczęła bywać na różnych zebraniach dotyczących planów zagospodarowania miasta oraz na zebraniach rady miejskiej, domagając się większej jawności działań. + +"Naszym podstawowym celem była walka z Tammany Hall, Carminem DeSapio6 i jego pachołkiem" - wspomina. "Reprezentowałam klub w radzie miejskiej i brałam aktywny udział w przygotowaniu realnych planów zagospodarowania trenów miasta, które byłyby czymś więcej niż planem budowy kolejnych domów dla zamożnej ludności". + +Ta działalność zaowocowała nasileniem działalności politycznej w latach sześćdziesiątych. W roku 1965 otwarcie wspierała kandydatów do władz politycznych z ramienia Partii Demokratycznej, wśród nich wybranego do Kongresu Williama Fittsa Ryana, który jako pierwszy z reprezentantów wypowiedział się przeciw wojnie w Wietnamie. + +Wkrótce ona sama stała się jawną kontestatorką polityki USA w Indochinach. "Byłam przeciwniczką wojny w Wietnamie od czasu, gdy Kennedy posłał tam nasze wojska" - mówi. - "Czytałam informacje prasowe i historie opisywane przez dziennikarzy we wczesnych fazach konfliktu. Uwierzyłam ich zapowiedziom, że pakujemy się w bagno". + +Takie opinie przenikały do domu. W roku 1967 matka Richarda ponownie wyszła za mąż. Nowy mąż, Maurice Lippman, szef Air National Guard7, zrezygnował ze stanowiska dla zademonstrowania postawy antywojennej. Jej pasierb, Andrew Lippman, studiował na MIT i korzystał ze studenckiego odroczenia służby, ale wisiała nad nim groźba powołania w przypadku eskalacji działań i sięgnięcia USA po kolejne zasoby ludzkie. Był wreszcie Richard, przed którym stanęła perspektywa wyjazdu do Wietnamu lub Kanady, gdyby wojna miała się przeciągnąć na lata 1970. + +"Wietnam stał się głównym problemem naszego domu" - wspomina Alice Lippman. - "Rozmawialiśmy o tym bez ustanku: co poczniemy, jeżeli wojna będzie się przeciągać, co powinien zrobić Richard lub jego przyrodni brat w przypadku zaciągu. Byliśmy wszyscy przeciwnikami wojny i poboru. Uważaliśmy to za niemoralne". + +Dla Stallmana wojna wietnamska była przyczyną wielu sprzecznych i złożonych uczuć: zakłopotania, przerażenia i głębokiej politycznej bezradności. Jako chłopak, który ledwo potrafił znaleźć swoje miejsce w autorytarnej rzeczywistości szkoły prywatnej, odczuwał dreszcz przerażenia na samą myśl o wdzianiu munduru. + +"Strach mnie paraliżował i nie wiedziałem, co począć, a jednocześnie nie mogłem się zdobyć na wzięcie udziału w demonstracjach antywojennych" - wspomina, jak na swoje, przypadające w marcu, 18 urodziny otrzymał przerażająco niski numer w loterii poborowej, gdy rząd w roku 1971 ostatecznie skasował odroczenia studenckie. "Nie mogłem sobie wyobrazić wyjazdu do Kanady lub Szwecji. W jaki sposób miałem się stąd zabrać i wyjechać? Nie wiedziałem, jak można żyć, polegając jedynie na sobie. Nie należałem do osób, dla których takie rzeczy są proste i oczywiste". + +Przypomina sobie, że był jednocześnie podbudowany i zawstydzony postawą członków rodziny. Poczynając od przyklejonej przez ojca nalepki na zderzaku, która porównywała masakrę w My Lai do podobnych okropności z czasów II wojny światowej. Był bardzo podekscytowany tym aktem odwagi ojca. "Podziwiałem to, co zrobił, i jednocześnie zdawałem sobie sprawę, że mnie nie byłoby na to stać. Obawiałem się, że porażający strachem potwór poboru dosięgnie mnie i zniszczy". + +Choć w opisach niechęci do wypowiadania własnych przekonań tkwi nuta zawstydzenia, od udziału w manifestacjach studenckich odstręczał Stallmana ton i kierunek ruchu antywojennego. Podobnie jak inni członkowie Science Honors Program postrzegał sobotnie manifestacje w Columbia University raczej jako zabawny spektakl8. Nie bez znaczenia był fakt, że irracjonalne siły kierujące ruchem antywojennym trudno było oddzielić od irracjonalnych podstaw kultury młodzieżowej. Wśród dziewcząt w wieku Stallmana uwielbienie dla Beatlesów przerodziło się w uwielbienie dla przywódców rewolty w rodzaju Abbiego Hoffmana i Jerry'ego Rubina. Chłopakowi usiłującemu zrozumieć swych rówieśników eskapistyczne slogany w rodzaju make love not war9 wydawały się mocno naciągane. Do Stallmana, krótko wystrzyżonego outsidera, nienawidzącego rocka i narkotyków, omijającego wszelkie odbywające się w campusach demonstracje, nie przemawiało nie tylko polityczne, lecz równie seksualne znaczenie hasła. + +"Nigdy zbytnio nie lubiłem kontrkultury" - przyznaje. - "Nie lubiłem muzyki. Nie lubiłem narkotyków. Do narkotyków miałem uraz. Nie lubiłem postawy antyintelektualnej ani uprzedzeń do technologii. Ponad wszystko kochałem komputery. Nie cierpiałem również bezmyślnego antyamerykanizmu, z którym często się spotykałem. Wielu ludzi myślało w sposób tak uproszczony, że uważali, iż każda dezaprobata dla poczynań amerykańskich w Wietnamie musi pociągać za sobą wspieranie Wietnamczyków z północy. Nie mogli sobie wyobrazić bardziej złożonego punktu widzenia". + +Takie komentarze łagodzą wrażenie nieśmiałości. Podkreślają również cechę, która stanie się kluczem do zrozumienia późniejszego politycznego dojrzewania Stallmana. Jego polityczna pewność siebie była wprost proporcjonalna do osobistej. Przed rokiem 1970 niewiele do niego docierało spoza świata matematyki i nauk ścisłych. Jednakże znajomość matematyki okazała się być solidnym fundamentem pozwalającym na ocenę ruchu antywojennego za pomocą rozważań logicznych. Czyniąc to, zauważył brak logiki działań. Choć sprzeciwiał się wojnie w Wietnamie, nie widział żadnej przyczyny, która dezawuowałaby wojnę jako środek obrony wolności lub przestrzegania sprawiedliwości. Nie zmniejszało to dystansu oddzielającego go od rówieśników, a nawet go powiększało, postanowił więc wyniki swych przemyśleń zachowywać wyłącznie dla siebie. + +W roku 1970, rozpoczynając studia w Harvardzie, pozostawił za sobą wieczorne rozmowy przy kolacji o polityce i wojnie w Wietnamie. Patrząc wstecz, to przejście z matczynego domu do akademika w Cambridge nazywa "ucieczką". Rówieśnicy, którzy byli świadkami tej "ucieczki", nie zauważyli u niego żadnych oznak świadczących o wyzwoleniu. + +"Na początku pobytu w Harvardzie wyglądał bardzo mizernie" - twierdzi Dan Chess, jeden z kolegów z Science Honors Program, który też znalazł się na tej samej uczelni. - "Kontakty z innymi istotami ludzkimi sprawiały mu wyraźne trudności, a w Harvardzie nie mógł ich uniknąć. Panowała tam wyjątkowo towarzyska atmosfera". + +Aby łatwiej znieść odmianę życia, Stallman zagłębił się w matematyce i naukach ścisłych. Jak większość kolegów z Science Honors Program z łatwością zaliczył egzamin kwalifikacyjny na Math 55, legendarny kurs startowy dla żądnych wiedzy początkujących matematyków. "My, koledzy z SHP, stworzyliśmy trwały związek, rodzaj matematycznej mafii" - śmieje się Chess, twierdząc, że "Harvard był drobnostką w porównaniu z SHP". + +Łatwe zaliczenie Math 55 dla Stallmana, Chessa i innych absolwentów SHP mogło być powodem do dumy. Wiedza matematyczna, rozkładana zwykle na 4 lata nauki, została tu skondensowana w dwusemestrowym kursie, który znieść mogli tylko najlepsi zakochani w tym przedmiocie. "Była to zdumiewająca grupa" - wspomina David Harbater, wówczas jeden z członków "mafii", a dzisiaj profesor matematyki w Pennsylvania University. "Można prawdopodobnie stwierdzić, że w historii tej uczelni nie było nigdy grupy początkujących studentów studiujących z takim zapałem i tak zaawansowanych. "Ludzie robili okrągłe oczy, gdy mówiłem, że przed końcem drugiego semestru dyskutowaliśmy między innymi o geometrii rozmaitości różniczkowych Banacha. Zwykle na wykładach nie wspomina się o tym przed końcem drugiego roku studiów". + +Kurs rozpoczynało 75 studentów, którzy rychło poczęli się wykruszać, aż pozostało ledwo 20, z czego, jak twierdzi Harber "może 10 wiedziało dokładnie, co robi. Z tych dziesięciu ośmiu zostało w przyszłości profesorami matematyki, jeden zajął się nauczaniem fizyki, a ostatni to Richard Stallman". + +Jak wspomina Seth Breidbart, jeden z kursantów Math 55, Stallman wyróżniał się nawet w tym gronie. + +"W pewien swoisty sposób ściślej od innych przestrzegał procedur i dyscypliny działania" - mówi Breidbart. - "Istnieje w matematyce standardowa technika, zwykle błędnie przez wszystkich stosowana. Jest to nadużywanie notacji funkcji podczas jej definiowania. Najpierw funkcję definiujemy, a potem sprawdzamy, czy definicja jest właściwa. On zrobił tak tylko za pierwszym razem. Potem definiował relację i sprawdzał, że jest ona funkcją. Przebieg dowodu był, oczywiście, taki sam, ale używał właściwej terminologii. Był właśnie taki". + +Od czasu Math 55 zaczęła się utrwalać renoma jego błyskotliwości. Zgadza się z tym Breidbert, zaś Chess u którego wyczuwa się wspomnienie współzawodnictwa, uważa, że Stallman został uznany za najlepszego matematyka dopiero na następnym roku. "Stało się to w czasie wykładów z analizy funkcji rzeczywistych, które mieliśmy na drugim roku" - twierdzi Chess, obecnie profesor matematyki w Hunter College. - "Pamiętam złożony dowód dotyczący miar zespolonych, o którym Richard powiedział, że jest to w zasadzie analogia do rachunku wariacyjnego. Wtedy po raz pierwszy zobaczyłem kogoś, kto potrafi rozwiązać problem w sposób naprawdę oryginalny i błyskotliwy". + +Chess nie ma wątpliwości: rozwiązanie, które Stallman napisał na tablicy, robiło wielkie wrażenie. Dla chłopaka, który przywykł, że zawsze uważano go za najlepszego matematyka w klasie, to, co zobaczył, wyglądało jak wyrok. Wiele lat później powoli zdobył markę świetnego profesjonalnego matematyka, ale pamięta, że tamten dowód Stallmana odczuł jako drwinę z siebie i z innych. + +"W matematyce nie trzeba samemu być najlepszym" - twierdzi, - "by od pierwszego rzutu oka poznać prawdziwy matematyczny talent. Gdyby Richard został matematykiem, byłby matematykiem najwyższego lotu". + +Naukowym sukcesom Stallmana towarzyszył brak sukcesów towarzyskich. Choć inni członkowie matematycznej mafii z Math 55 wspólnie omawiali rozwiązania i problemy, on wolał pracować samotnie. Tak samo było z życiem prywatnym. Składając prośbę o zakwaterowanie w Harvardzie, wyraźnie wypowiedział swoje preferencje. "Powiedziałem, że najlepiej odpowiada mi współlokator, którego nie będzie można ani zobaczyć, ani usłyszeć, ani dotknąć" - wspomina. Harvardzkie biuro kwater wykazało się tu rzadką biurokratyczną przenikliwością, przydzielając mu jedyną jednopokojową kwaterę przeznaczoną dla studentów pierwszego roku. + +Breidbart, jedyny z mafii matematycznej współlokator z pierwszego roku, wspomina że Stallman powoli uczył się kontaktowania się z innymi studentami. Wspomina, jak inni koledzy z internatu, będąc pod wrażeniem logiczności jego rozumowania, coraz chętniej go słuchali podczas intelektualnych debat w stołówce lub innych pomieszczeniach ogólnego użytku. + +"Wiedliśmy mnóstwo nieformalnych dyskusji o możliwościach rozwiązywania światowych problemów i o ewentualnych skutkach tych rozwiązań" - mówi Breidbart. - "Powiedzmy, że ktoś wynalazłby eliksir nieśmiertelności. Co byście zrobili? Jaki miałoby to wpływ na politykę? Gdyby dać go wszystkim, świat uległby przeludnieniu i wszyscy by wyginęli. Gdyby dostęp do eliksiru ograniczyć do wybranej grupy, na przykład udostępnić go obecnie żyjącym, ale dawać go ich dzieciom, nastąpiłoby podzielenie ludzkości na klasę wyższą i niższą. Richard był najlepszy w przewidywaniu ukrytych skutków i okoliczności ewentualnych decyzji." + +Stallman żywo pamięta ówczesne dyskusje. "Zawsze podobała mi się idea nieśmiertelności i zdumiewało mnie, że większości widziała tylko jej złe strony. W jaki sposób inaczej moglibyśmy zobaczyć, jak świat będzie wyglądać za 200 lat?" - pyta. + +Choć był matematykiem i dyskutantem najwyższej klasy, konsekwentnie unikał otwartego współzawodnictwa, które mogłoby utwierdzić jego wybitną pozycję. Pod koniec pierwszego roku w Harvardzie jawnie uchylił się od zdawania egzaminu Putnama, prestiżowego sprawdzianu otwartego dla wszystkich studentów matematyki w USA i w Kanadzie. Oprócz możliwości porównania własnych umiejętności z rówieśnikami egzamin Putnama10 jest istotnym narzędziem rekrutacji najlepszych. Zwyczajowo zdobywca największej liczby punktów ma otwartą drogę na dalsze studia na dowolnie wybranej uczelni, łącznie z Harvardem. + +Egzamin Putnama, podobnie jak Math 55, jest trudnym testem merytorycznym. Wydaje się, że pytania, na które trzeba odpowiedzieć w ciągu sześciu godzin podzielonych na dwie trzygodzinne sesje, są obmyślone tak, by skutecznie odsiać ziarno od plew. Breidbart, mający za sobą również Math 55, wspomina go jako najtrudniejszy egzamin, jaki kiedykolwiek przyszło mu zdawać. "Abyście mieli pojęcie, jakie to trudne" - mówi - "powiem tylko, że na możliwych 120 punktów dostałem trzydzieści parę, co wystarczyło do zajęcia 102 miejsca w kraju". + +Breidbart zdziwiony nieprzystąpieniem do egzaminu Stallmana, uznawanego za najlepszego matematyka na roku, wraz z innym kolegą przyparł go do muru, żądając wyjaśnienia. "Powiedział, że obawiał się, że nie pójdzie mu dobrze". Twierdzą, że gdy napisali z pamięci zadania egzaminacyjne, Stallman rozwiązał wszystkie. "Przypuszczam, że przez "nie pójdzie dobrze" Stallman rozumiał zrobienie jakiegoś błędu i zajęcie drugiego miejsca" - twierdzi Breidbart. + +Stallman pamięta ten epizod nieco inaczej. Mówi: "Przypominam sobie, że przynieśli mi pytania i być może odpowiedziałem na część z nich, ale na pewno nie na wszystkie". Ale zgadza się z opinią Breidbarta, że strach był główną przyczyną nieprzystąpienia do egzaminu. Mimo iż często wykazywał intelektualną niedoskonałość rówieśników i wykładowców, nie cierpiał stawania do otwartej rywalizacji. + +"Z tego samego powodu nie lubiłem szachów" - twierdzi. - "Gdy tylko przystępowałem do gry, przede wszystkim się bałem, że zrobię głupi ruch na samym początku. I, oczywiście, stawało się to samospełniającą się przepowiednią". + +Jest rzeczą dyskusyjną, czy ten strach powstrzymał Stallmana przed zrobieniem kariery matematycznej. Pod koniec pierwszego roku studiów zainteresował się zagadnieniami z innych dziedzin. Programowanie komputerowe, fascynacja z ostatnich klas szkoły średniej, zaczynało powoli stawać się jego główną pasją. Podczas gdy inni studenci matematyki szukali intelektualnego oddechu na wykładach z historii i sztuk pięknych, on znajdował go w laboratorium komputerowym. + +Pierwsze zetknięcie z prawdziwym programowaniem w IBM New York Scientific Center pobudziło chęć pogłębiania wiedzy. "Pod koniec pierwszego roku studiów nabrałem wystarczająco dużo odwagi, by odwiedzać laboratoria komputerowe i patrzeć, co mają do zaoferowania. Pytałem, czy mają dodatkowe egzemplarze podręczników i dokumentacji, które mógłbym spokojnie przeczytać w domu". + +Studiując je, poznawał specyfikacje komputerów, porównywał z już znanymi i przygotowywał programy próbne, które zanosił do laboratorium wraz ze zwracanymi podręcznikami. Choć niektóre laboratoria wzdragały się przed zaakceptowaniem dziwacznego chłopaka zjawiającego się z prosto ulicy i z dopuszczeniem go do pracy z maszyną, część rozpoznała i uznała jego kompetencje i pozwalała uruchamiać napisane programy. + +Pewnego dnia, gdzieś pod koniec pierwszego roku studiów, usłyszał o specjalnym laboratorium w pobliżu MIT. Znajdowało się ono na dziewiątym piętrze nienależącego do campusu budynku na Tech Square - nowo zbudowanego specjalnie dla badań nad zaawansowanymi technologiami. Wedle krążących pogłosek, laboratorium to zajmowało się sztuczną inteligencją - wówczas najnowszą dziedziną badań komputerowych i programistycznych. + +Zaintrygowany, postanowił złożyć tam wizytę. + +Podróż nie była długa, wszystkiego dwie mile spacerem lub 10 minut pociągiem, ale jak się przekonał, MIT i Harvard znajdowały się na przeciwnych biegunach tej samej planety. Labirynt splątanych budynków campusu MIT stanowił yin dla yang11 harwardzkiego przestronnego stylu kolonialnego. To samo można było powiedzieć o studentach, dziwacznym skupisku odmieńców niegdyś niedopasowanych do wymagań szkół średnich, znanych bardziej z predylekcji do wygłupów niż poważnych zainteresowań politycznych. + +Ta yin-yangowa zależność rozciągała się także na AI Lab - laboratorium zajmujące się zagadnieniami sztucznej inteligencji. W przeciwieństwie do tego, do czego Stallman był przyzwyczajony w Harvardzie, nie było tu żadnego stopniowania dostępu studentów do komputera, żadnych list z wyznaczonymi terminami dostępu i nawet śladu atmosfery w stylu "patrz i nie dotykaj". Zamiast tego wszystkiego zobaczył jedynie rząd terminali i modeli ramion, zapewne artefakty z jakiegoś niedawnego doświadczenia prowadzonego przez AI Lab. + +Choć było widoczne, że każdy może usiąść przy jednym ze stojących terminali, Stallman postanowił trzymać się powziętego planu. Gdy spotkał pracownika laboratorium, spytał, czy mają zapasowe instrukcje i podręczniki, które mógłby pożyczyć jako dociekliwy student. "Coś tam mieli, ale wiele rzeczy nie miało jeszcze żadnej dokumentacji" - wspomina. "Oni byli przede wszystkim hakerami". + +Znalazł tam coś lepszego od podręczników - pracę. Choć nie pamięta, czego dotyczył pierwszy projekt, pamięta, że w następnym tygodniu zjawił się ponownie w AI Lab, zasiadł przy terminalu i zaczął pisać program. + +Patrząc wstecz, nie widzi nic dziwnego w chęci zaakceptowania widzianego po raz pierwszy, nieznanego osobnika z zewnątrz. "Tak wówczas postępowano" - mówi. - "Tak również postępuje się teraz. Przyjmuję kogoś do pracy, jeżeli widzę, że jest dobry. Po co mam czekać? Tylko sztywniacy naciskają na przestrzeganie reguł administracyjnych w każdym punkcie. Jeżeli ktoś jest dobry, nie trzeba go zmuszać do przechodzenia przez całą żmudną i nudną procedurę przyjmowania do pracy; należy go posadzić przy komputerze i niech się zabiera do roboty". + +Aby posmakować "biurokratycznego sztywniactwa", wystarczyło odwiedzić któreś z laboratoriów komputerowych Harvardu. Dostęp do komputerów był ustalany zgodnie z pozycją akademicką delikwenta. Jako student pierwszego roku Stallman musiał zwykle wpisywać się na listę oczekujących lub czekać do północy, gdy profesorowie i studenci zrobią, co mieli zrobić, i pójdą spać. Czekanie nie było trudne ale frustrujące. Oczekiwanie na dostęp do publicznego terminala w tym samym czasie, gdy połowa terminali umieszczonych w gabinetach profesorów stała bezczynnie, wydawało mu się rzeczą pozbawioną wszelkiej logiki. Choć od czasu do czasu odwiedzał laboratoria komputerowe w Harvardzie, wolał egalitarną atmosferę AI Lab. "Był to powiew świeżego powietrza" - mówi. - " W AI Lab bardziej zwracano uwagę na pracę niż na rangi". + +Wkrótce przekonał się, że zasada "pierwszy ten, kto pierwszy przyszedł" jest zasługą kilku osób czujnie pilnujących jej przestrzegania. Wielu z nich przeszło do AI Lab z projektu MAC12, finansowanego przez Departament Obrony projektu badawczego, który doprowadził do powstania pierwszego systemu operacyjnego z podziałem czasu. Kilku z nich było już legendą w świecie komputerowym, np. Richard Greenblatt, ekspert od Lispa13 i autor MackHacka, programu do gry w szachy, który upokorzył Huberta Dreyfusa, krytyka sztucznej inteligencji. Był też Gerard Sussman, autor oryginalnego programu HACKER sterującego robotem układającym klocki14, oraz Bill Gosper, szczególnie uzdolniony matematyk już od 18 miesięcy tkwiący w hakerskich zagadnieniach wywodzących się z filozoficznych implikacji komputerowej gry LIFE15. + +Członkowie tej ścisłej grupy nazywali siebie hakerami. Po pewnym czasie objęli tym określeniem również Stallmana. Najpierw jednak wpoili mu zasady "hakerskiej etyki". Bycie hakerem to coś więcej niż pisanie programów, to pisanie możliwie najlepszych programów, to przesiadywanie bez przerwy przy monitorze przez 36 godzin tylko po to, aby napisany program był możliwie najlepszy, to również posiadanie dostępu do możliwie najlepszych maszyn i informacji. Hakerzy mówią otwarcie o zmienianiu świata za pomocą oprogramowania i, jak nauczyli Stallmana, pogardzają wszystkim, co staje na drodze do zrealizowania tego wzniosłego celu. Przeszkodami stającymi na ich drodze są między innymi byle jakie programy, biurokracja i samolubne zachowanie części programistów. + +Nauczono go także, w jaki sposób należy twórczo obchodzić te przeszkody. Nauczono go otwierania zamków, sztuki potrzebnej do dostawania się do zamkniętych gabinetów profesorów i "uwalniania" stojących tam bezużytecznie terminali. W przeciwieństwie do swoich rozpieszczonych odpowiedników z Harvardu, kadra naukowa MIT wiedziała, że nie należy terminali traktować jak prywatnej własności. Jeżeli któryś z nich o tym zapomniał, hakerzy rychło korygowali ten błąd. Jeżeli "błąd" miał tendencję do powtarzania się, wysyłano dość ostrą reprymendę. "Widziałem wózek z ciężkim metalowym cylindrem użyty do otwarcia drzwi jednego upartego profesora" - twierdzi Stallman16. + +Takie pozbawione subtelności metody osiągały cel. Choć profesorowie i administratorzy przewyższali liczbą hakerów w stosunku dwa do jednego, w AI Lab kierowano się hakerską etyką. W czasie przybycia Stallmana obie grupy żyły w symbiozie. W zamian za utrzymywanie w ruchu komputerów i usuwanie wszelkich usterek oprogramowania hakerzy uzyskali pozycję uprzywilejowanych pupilów pracujących nad najlepszymi projektami. Często prowadziło to do istotnych ulepszeń sprzętu i oprogramowania. Jak nastolatki cieszące się przebudową i rozbudową samochodów ze złomowiska, hakerzy klecili i "wiązali drutem" komputery, bawiąc się tym jak dzieci. + +Nigdzie to naprawianie drobiazgów nie było tak widoczne jak w systemie operacyjnym pracującym w AI Lab na głównym minikomputerze PDP-6. System ITS (skrót od Incompatible Time Sharing - niezgodne dzielenie czasu), miał w swoją architekturę wbudowane cechy wynikające z hakerskiej etyki. Hakerzy zbudowali go jako protest przeciw oficjalnemu systemowi CTSS (Compatible Time Sharing System - system zgodnego dzielenia czasu) stworzonemu w ramach projektu MAC i odpowiednio go nazwali. W owym czasie hakerom wydawało się, że system CTSS jest zbytnio restryktywny i ogranicza programistom możliwości poprawiania jego architektury według potrzeb. Zgodnie z rozpowszechnianą przez hakerów legendą, decyzja o budowie ITS miała swoje polityczne podłoże. W przeciwieństwie do CTSS zaprojektowanego dla IBM 7094, ITS został zbudowany z myślą o PDP-6. Zezwolenie hakerom na zbudowanie własnego systemu oznaczało, że tylko oni będą mogli swobodnie korzystać z PDP-6. I rzeczywiście, gambit działał. Chociaż maszyna była współwłasnością kilku wydziałów, ludzie z A. I. mieli ją wkrótce dla siebie17. + +System ITS miał funkcje, na które systemy komercyjne musiały czekać jeszcze przez lata, np. wielozadaniowość, debugging i możliwości edycji pełnoekranowej. Używając go jako głównego systemu PDP-6, AI Lab mogło korzystać z pełnej niezależności od projektu MAC już przed przybyciem tam Stallmana. + +Jako rasowy adept hakerski Stallman wkrótce zakochał się w ITS. Zakazany dla większości nowicjuszy system zawierał wiele wbudowanych cech będących doskonałą szkołą dla terminatorów hakerskich w rodzaju Stallmana. + +"ITS miał bardzo elegancki mechanizm wewnętrzny pozwalający na badanie jednego programu przez inny." - twierdzi Stallman - "Można było analizować wszystkie stany programu w bardzo specyficzny ale przejrzysty sposób". + +Korzystając z tego, mógł śledzić, w jaki sposób pisane przez hakerów instrukcje są wykonywane. Drugą wspaniałą cechą była możliwość "zamrożenia" działania programu między poszczególnymi instrukcjami. W innych systemach operacyjnych takie polecenie prowadziło do ogólnego bałaganu i zawieszenia systemu. W ITS pozwalało to na śledzenie działania programu krok po kroku. + +"Jeżeli wydawałem polecenie zatrzymania, system zawsze zatrzymywał się w trybie użytkownika. Można go było zatrzymać między wykonaniem dwóch kolejnych instrukcji użytkownika i wszystko było ze sobą zgodne i zdatne do prześledzenia" - wspomina. - "Po wydaniu polecenia kontynuacji zadanie było dalej wykonywane bez zakłóceń. Ponadto można było zmieniać status działania tam i z powrotem, i wszystko zgodnie pracowało. Nigdzie nie pojawiały się żadne stany ukryte". + +Przed końcem roku 1970 działalność hakerska w AI Lab stała się stałym elementem tygodniowego planu zajęć Stallmana. Od poniedziałku do czwartku uczęszczał na zajęcia w Harvardzie. W piątek po południu jechał do MIT na weekend. Zwykle czas przybycia dopasowywał do pory wieczornego posiłku i z pięcioma lub sześcioma innymi hakerami pakował się do samochodu, by przejechać przez most harvardzki do sąsiedniego Bostonu i zjeść coś w chińskiej restauracji. Prze dwie lub trzy godziny dyskutowali o wszystkim - od ITS do wewnętrznej logiki języka chińskiego i stosowanego w nim zapisu piktograficznego. Potem wracali do MIT i do świtu pisali hakerskie programy. + +Dla samotnika rzadko potrafiącego się dopasować do swych rówieśników w Harvardzie było to istotne doświadczenie: spotkanie z grupą ludzi podzielających jego zainteresowania komputerami, science-fiction i chińską kuchnią. "Pamiętam wiele świtów, które nas zastawały w drodze powrotnej z Chinatown" - wspominał z nostalgią 15 lat później podczas przemówienia w Szwedzkim Królewskim Instytucie Technologicznym. - "Oglądanie wschodu słońca było rzeczą piękną, dającą spokój przez cały dzień. To wspaniała pora, by pójść spać. Wspaniale jest wracać do domu, gdy ptaki śpiewają. Daje to wspaniałe uczucie łagodnej, pełnej spokoju satysfakcji i zadowolenia z pracy wykonanej nocą18". + +Im dłużej przebywał z hakerami, tym bardziej przesiąkał ich wizją świata. Od dawna przekonany do idei wolności osobistej, zaczął rozważać swe poczynania z punktu widzenia społecznej odpowiedzialności. Szybko zaczął oponować, gdy inni naruszali zasady społecznego współżycia. W rok od swego przybycia był jednym z włamujących się do zamkniętych pokojów, w których stały "zasekwestrowane" terminale będące przecież wspólną własnością całej społeczności. Zgodnie z hakerskim stylem chciał mieć swój udział we włamaniach do zamkniętych gabinetów. Jeden z najbardziej artystycznych sposobów otwierania zamkniętych drzwi, którego wymyślenie zwykle przypisuje się Greenblatowi, polegał na wygięciu twardego drutu na kształt laski i przytwierdzeniu do dłuższego końca pętli z taśmy klejącej. Po wsunięciu drutu pod drzwiami można go było obracać, trzymając za krótszy koniec, aż dłuższy koniec dotknął do gałki zamka. Wówczas, dzięki przytwierdzonej na końcu taśmie klejącej można było kilkoma szybkimi obrotami otworzyć zamek. + +Gdy Stallman spróbował tego tricku, uznał go za dobry ale wymagający kilku ulepszeń. Przytwierdzenie taśmy do końca pręta nie zawsze było łatwe, a obracanie prętem tak, by spowodować otwarcie zamka również wymagało sporej zręczności. Pamiętał, że na suficie korytarza znajdowały się płyty, które można było łatwo odsunąć. Niektórzy hakerzy rzeczywiście korzystali z tej drogi, by dostać się do zamkniętych pomieszczeń, co dawało efekty lecz powodowało pokrycie delikwenta kurzem. + +Stallman pomyślał o rozwiązaniu alternatywnym. Zamiast wsuwania pręta pod drzwiami należy usunąć płytę sufitową nad nimi, by móc spojrzeć na gałkę zamkniętego zamka od góry. + +Wypróbował to. Zamiast drutu przygotował długą pętlę z taśmy magnetycznej w kształcie litery U. Na dole tego U przymocował pętlę z taśmy klejącej. Stojąc nad gałką zamka, tak długo manewrował pętlą, aż udało mu się umieścić ją pod gałką. Wówczas podciągnął pętlę tak, by taśma klejąca przywarła do gałki zamka. Potem pociągnął lewy koniec taśmy magnetycznej, obracając gałkę zgodnie z kierunkiem ruchu wskazówek zegara. Drzwi się, oczywiście, otworzyły. Przyczynił się zatem do rozwinięcia sztuki otwierania zamkniętych drzwi. + +"Czasami po przekręceniu gałki trzeba było popchnąć drzwi" - mówi, wspominając uporczywą trudność towarzyszącą korzystaniu z jego metody. - "Do otwarcia potrzebny był lekki nacisk". + +Te poczynania wskazują na wzrastającą w Stallmanie chęć występowania w obronie przekonań politycznych. Panujący w AI Lab duch bezpośredniego działania pomógł mu przełamać wrodzoną strachliwość paraliżującą go w latach dziecinnych. Włamanie do gabinetu z zamkniętym terminalem komputerowym nie było tym samym co udział w marszu protestacyjnym, ale w przeciwieństwie do wielu marszów przynosiło efekty. Rozwiązywało bieżący problem. + +Przed dotarciem do ostatnich lat na Harvardzie zaczął w życiu uczelnianym stosować dziwaczne i nieakceptowane praktyki poznane w AI Lab. + +"Czy opowiadał o wężu?" - spytała jego matka podczas przeprowadzanego z nią wywiadu. - "On i koledzy z internatu wystawili w wyborach węża. Oczywiście, zdobył sporo głosów". + +Stallman potwierdza opowiadanie o wężowej kandydaturze, dodając kilka uwag. Wąż był kandydatem w wyborach w jego internacie Currier House, a nie w wyborach do rady uczelni. Zdobył sporo głosów, dlatego że tak się nazywał jego właściciel. "Ludzie więc głosowali, myśląc, że chodzi o właściciela" - wspomina - "Na wyborczych plakatach podaliśmy, że wślizguje się do biur, a przed tygodniem wlazł do przewodu wentylacyjnego w ścianie i ukrył się tak, że nikt nie wiedział, gdzie się podziewa". + +Wprowadzenie węża do rady internatu było tylko jednym z żartów. W następnych wyborach wprowadzili do rady internatu syna zarządcy, którego hasłem wyborczym było obowiązkowe przechodzenia na emeryturę w wieku 7 lat. Ale te żarty bladły w porównaniu z kandydaturą kota Woodstocka do rady campusu. Woodstock zdobył wiele głosów, bijąc na głowę wielu ludzkich kontrkandydatów. "Nigdy nie ujawniono, ile głosów padło na Woodstocka. Głosy te unieważniono, ale sądząc z pokaźnej liczby nieważnych głosów w tamtych wyborach, można wnosić, że Woodstock był zwycięzcą". Kilka lat później Woodstock został w podejrzanych okolicznościach przejechany przez samochód. Nikt nie wiedział, czy kierowca pracował dla administracji MIT". Stallman twierdzi, że nie miał nic wspólnego z wystawieniem kandydatury Woodstocka, ale pomysł strasznie mu się podobał19. + +W AI Lab działalność polityczna Stallmana nabrała ostrzejszych tonów. W latach siedemdziesiątych hakerzy byli zmuszeni odpierać ciągły nacisk władz i administracji uczelni, dążących do usunięcia przyjaznego dla hakerów systemu ITS. Jeden z pierwszych ataków przyszedł w połowie dekady, gdy coraz większa liczba kadry naukowej zaczęła się domagać bezpiecznego systemu operacyjnego z wiarygodną ochroną danych. Większość pozostałych laboratoriów komputerowych zainstalowało takie systemy w latach sześćdziesiątych, ale AI Lab pod naciskiem Stallmana i pozostałych hakerów utrzymywało obszar wolnego dostępu. + +Dla Stallmana protest przeciwko zabezpieczeniom miał znaczenie zarówno etyczne, jak i praktyczne. Od strony etycznej wskazywał, że cała sztuka hakerska opiera się na intelektualnej otwartości i zaufaniu. Ze strony praktycznej twierdził, że wewnętrzna struktura ITS była zaprojektowana z myślą o otwartości i wszelkie odstępstwa od tego wymagają generalnej przebudowy. + +"Hakerzy, którzy napisali Incompatible Timesharing System, uznali, że ochrona bezpieczeństwa plików jest potrzebna głównie samolubnym zarządcom systemów, którzy chcą w ten sposób zdobywać władzę nad innymi" - tłumaczył. - "Hakerzy nie chcą takiej władzy, więc nie wyposażyli systemu w narzędzia, które mogłyby jej służyć. W rezultacie, jeżeli tylko w systemie zdarzy się coś złego, można to łatwo naprawić20". + +Taka czujność hakerów pozwoliła na utrzymanie komputerów AI Lab poza systemami zabezpieczeń o wiele dłużej niż w innych laboratoriach MIT, ale w końcu zwyciężyli zwolennicy ochrony danych. W roku 1977 MIT Laboratory for Computer Sciences21 zainstalowało pierwszy system z ochroną danych za pomocą haseł. Stallman ponownie uznał za swoje zadanie napiętnowanie tego, co uważał za odstępstwo od zasad etycznych. Zdobył dostęp do programu nadzorującego system haseł i zainstalował polecenie wysyłające komunikat do każdego, kto usiłował założyć unikalne hasło. Jeżeli użytkownik wpisał hasło np. "rozgwiazda", otrzymywał komunikat takiej mniej więcej treści: + + Widzę, że wpisałeś hasło "rozgwiazda". Proponuję, abyś je zmienił na proste naciśnięcie "Enter". To o wiele prostsze i popierające zasadę nieużywania żadnych haseł.22. + +Użytkownicy, którzy posłuchali rady, czyli nacisnęli Enter, wprowadzali do systemu pusty ciąg znaków, co było równoważne brakowi hasła i udostępnieniu swoich zasobów całemu światu. Niezależnie od tego, jak straszne skutki mogło to przynieść samym użytkownikom, umocniło wśród nich hakerską ideę, że komputery należące do Instytutu, a nawet zapisane na nich pliki są własnością powszechną a nie prywatną. Stallman, wypytywany o to w roku 1984 w wywiadzie związanym z przygotowywaniem książki Hakerzy, z dumą oświadczył, że jedna piąta użytkowników LCS uznała podany argument i wprowadziła puste hasło23. + +Jednakże jego walka o puste hasła okazała się daremna. Do roku 1980 nawet komputery AI Lab korzystały już z systemów używających hasłowego systemu zabezpieczeń. Było to kamieniem milowym na drodze jego osobistego i politycznego dojrzewania. Dla obiektywnego obserwatora jego późniejszej kariery jest to wygodny punkt graniczny oddzielający czas nieśmiałego chłopca obawiającego się wyrażać swoje opinie od czasu dorosłego aktywisty, który wkrótce poświęci całą energię na przekonywanie i nakłanianie innych. + +Sprzeciwiając się wprowadzeniu systemu zabezpieczeń komputerowych, Stallman wykorzystał wiele sił, które kierowały jego postępowaniem w pierwszym okresie życia: głód wiedzy, niechęć do autorytetów i frustrację wywoływaną przez wszelkie ukryte procedury czyniące z wielu ludzi bezideowców. Skorzystał także z koncepcji etycznych, które kierowały jego dorosłym życiem: społecznej odpowiedzialności, zaufania i hakerskiej zasady bezpośredniego działania. W języku komputerowym można powiedzieć, że puste hasło było wersją 1.0 Richarda Stallmana-działacza; wersją jeszcze niekompletną i pełną braków, ale dojrzałą w zarysie. + +Patrząc wstecz, Stallman waha się, czy temu zdarzeniu z okresu hakerskiego można przypisać tak duże znaczenie. "W tym czasie" - mówi - "wielu podzielało moje poglądy. Świadczy o tym znaczna liczba osób, które zaakceptowały propozycję wprowadzenia pustego hasła. Po prostu miałem skłonności do stania się działaczem, obrońcą tej sprawy". + +Przyznaje jednak, że to AI Lab uświadomiło mu, w jaki sposób można wyrażać swoje przekonania. Jako nastolatek obserwował wiele zdarzeń politycznych, ale nie przypuszczał, by pojedynczy osobnik mógł zrobić coś, co miałoby jakiekolwiek znaczenie. Jako dorosły młodzieniec mówił o rzeczach, których był pewien, takich jak projektowanie oprogramowania, odpowiedzialność społeczna i wolność osobista. "Włączyłem się do społeczności, która respektowała wolność każdego członka i w krótkim czasie uświadomiłem sobie, jaka to ważna rzecz. Dopiero po pewnym czasie zrozumiałem, że jest to sprawa natury moralnej" - mówi. + +Hakerstwo w AI Lab nie było jedyną formą działalności pomagającą mu w zdobyciu prestiżu. Na drugim roku przyłączył się do zespołu tanecznego specjalizującego się w tańcach ludowych. To, co miało być jedynie okazją do spotykania kobiet i rozrywką towarzyską, rychło stało się jego drugą obok hakerstwa pasją. Tańcząc przed publicznością w stroju bałkańskiego wieśniaka, tracił wcześniejszą nieporadność dziesięcioletniego chłopca, dla którego nieudane próby gry w piłkę były przyczyną frustracji. Zdobył pewność siebie, sprawność fizyczną i chęć życia. Przez krótką chwilę czuł nawet związek emocjonalny z innymi. Wkrótce przekonał się, że występowanie przed publicznością może być świetną zabawą i wkrótce strona artystyczna przedstawienia zaczęła go interesować na równi ze stroną towarzyską. + +Taniec i hakerstwo nieco poprawiły jego pozycję towarzyską, pomogły pokonać uczucie odmienności, które ciemną chmurą przysłaniało jego przedharvardzkie życie. Zamiast lamentować nad swoją dziwaczną naturą, zaczął ją celebrować. W roku 1977, biorąc udział w zjeździe miłośników science-fiction, natknął się na kobietę sprzedającą guziki robione na zamówienie. Podekscytowany zamówił guzik z napisem Impeach God24. + +Dla niego było to przesłanie o wielu poziomach znaczeniowych. Jako ateista od najwcześniejszego dzieciństwa uznał to przede wszystkim za wezwanie do stworzenia drugiego frontu w toczącej się debacie religijnej. "Dotychczas wszyscy argumentowali za istnieniem lub nieistnieniem Boga" - twierdzi, - "a hasło Impeach God wzywa do spojrzenia na Boga od zupełnie innej strony. Jeżeli Bóg był na tyle potężny, by stworzyć świat, a potem nie zrobił nic, by poprawić swe dzieło, dlaczego mamy go czcić, zamiast postawić w stan oskarżenia? Czy nie lepiej byłoby wytoczyć mu proces?" + +Jednocześnie Impeach God było hasłem satyrycznym uderzającym w Amerykę i jej system polityczny. Skandal polityczny afery Watergate z lat siedemdziesiątych głęboko dotknął Stallmana. Jako dziecko wzrastał w atmosferze niedowierzania autorytetom. W życiu dorosłym ta niewiara została wzmocniona kulturą hakerskiej społeczności AI Lab. Dla hakerów afera Watergate była jedynie jedną z szekspirowskich realizacji codziennych walk, które przychodzi staczać ludziom pozbawionym przywilejów z potęgami świata. Była to wielka przenośnia tego, co się dzieje, gdy ludzie zaprzedają wolność i otwartość dla wygody i bezpieczeństwa. + +Rosnąca pewność siebie skłoniła go do dumnego noszenia owego guzika. Ciekawskim pytającym o znaczenie hasła odpowiadał dobrze spreparowanym oświadczeniem: "Moje imię Jehowa. Mam plan zbawienia wszechświata, ale ze względu na niebiańskie zasady bezpieczeństwa nie mogę więcej powiedzieć. Możecie tylko wierzyć we mnie, ponieważ ja widzę obraz, a wam nie jest to dane. Wierzcie w moją dobroć, ponieważ mówię wam o niej. Jeżeli mi nie uwierzycie, wpiszę was na listę moich wrogów i wrzucę tam, gdzie piekielni poborcy podatkowi rozliczą was ze zobowiązań wobec wieczności". + +Ci, którzy odczytywali to przemówienie jedynie jako parodię informacji o aferze Watergate, chwytali jedynie połowę znaczenia. Według Stallmana dodatkowa informacja zawarta w tych słowach była przeznaczona jedynie dla innych członków hakerskiej społeczności. W sto lat po ostrzeżeniu lorda Actona25, że władza absolutna korumpuje absolutnie, Amerykanie zdają się zapominać o pierwszej części wygłoszonego przez niego truizmu: władza to korupcja. Zamiast zajmować się poszczególnymi przypadkami korupcji Stallman swą nienawiść skierował na system, który potęgę władzy stawiał na pierwszym miejscu. + +"Pytałem, dlaczego mamy się zatrzymać na pomniejszym wyrobniku" - mówi Stallman, wspominając guzik i zapisane na nim przesłanie. - "Skoro uporaliśmy się z Nixonem, dlaczego nie zająć się Najwyższym? Sądzę, że każdy, kto mając władzę, używa jej do poniżenia innych, powinien zostać jej pozbawiony". + + +Rozdział 5. +Niewielkie bajorko wolności + +Spytajcie kogokolwiek, kto spędził choć minutę ze Stallmanem, co najbardziej utkwiło mu w pamięci, a otrzymacie zawsze tę samą odpowiedź. Nie będą to ani długie włosy, ani dziwny sposób zachowania. Jego najbardziej zauważalną cechą jest wyraz oczu. Jedno spojrzenie w zielone oczy Stallmana i jesteście pewni, że macie przed sobą człowieka, który wierzy w to, co robi. + +Intensywność jego wzroku nie podlega dyskusji. Jego oczy na Ciebie nie patrzą, one Cię przenikają na wskroś. Nawet jeżeli przez grzeczność na chwilę odwracasz wzrok, jego oczy nie przestają Cię w skupieniu lustrować, wwiercając się w czaszkę jak dwie wiązki fotonów. + +Być może dlatego większość pisarzy, opisując Stallmana, robi to pod kątem religijnym. W roku 1998 w Salon.com opublikowano artykuł zatytułowany "The Saint of Free Software"1, w którym Andrew Leonard napisał, że "zielone oczy Stallmana promieniują mocą starotestamentowych proroków"2. W roku 1999 magazyn Wired napisał, że broda Stallmana przypomina rasputinowską3, zaś London Guardian opisuje uśmiech Stallmana jako należący do "ucznia spoglądającego na Jezusa4". + +Te analogie robią wrażenie, lecz ostatecznie chybiają celu, dlatego że nie odkrywają słabych punktów Stallmana. Jeżeli dłużej popatrzycie mu w oczy, zauważycie subtelną zmianę. To, co na pierwszy rzut oka wydaje usiłowaniem onieśmielenia i zahipnotyzowania, okazuje się być próbą nawiązania i podtrzymania kontaktu przez osobę sfrustrowaną. Jeżeli osobowość Stallmana, zgodnie z jego własnymi podejrzeniami, jest wynikiem autyzmu lub syndromu Aspergera, jego oczy zdają się potwierdzać tę diagnozę. Nawet wówczas gdy błyszczą najintensywniej, zdają się patrzeć gdzieś w dal, jak oczy zranionego zwierzęcia, które ma wyzionąć ducha. + +Moje pierwsze zetknięcie z legendarnym spojrzeniem Stallmana nastąpiło w marcu roku 1999 na LinuxWorld Convention and Expo5 w San Jose w Kalifornii. Konferencja, dla społeczności związanej z oprogramowaniem linuksowym będąca "wyjściem w świat", Stallmanowi ułatwiała ponowne zaprezentowanie się mediom elektronicznym. Zdecydowany upomnieć się o należną mu część uwagi opinii publicznej, skorzystał z okazji, by poinformować zwiedzających i dziennikarzy o historii projektu GNU i jego politycznych celach. + +Jako reporter posłany do obsługi zdarzenia poszedłem na konferencję Stallmana poświęconą pojawieniu się GNOME 1.0 - graficznego interfejsu użytkownika należącego do wolnego oprogramowania. Zadając pierwsze pytanie, nacisnąłem całą serię "czerwonych guzików", co spowodowało wygłoszenie długiego i wyczerpującego pouczenia. Zapytałem, czy dojrzała wersja GNOME będzie miała wpływ na rynkową popularność systemu operacyjnego Linux. + +"Bardzo proszę nie nazywać systemu operacyjnym Linuksem" - odparł Stallman. - "Linuksowe jądro jest tylko niewielką częścią systemu operacyjnego. Znaczna część programów stanowiących razem system operacyjny, który nazywa pan Linuksem, nie została napisana przez Linusa Torvaldsa. Programy te stworzyli ochotnicy pracujący w ramach projektu GNU i poświęcający na to swój prywatny czas. Dzięki temu mamy wolny system operacyjny w obecnej postaci. Nieuznawanie ich wysiłków jest niegrzeczne i fałszuje fakty historyczne. Dlatego proszę, aby pan, mówiąc o tym systemie operacyjnym, używał jego właściwej nazwy GNU/Linux". + +Notując usłyszane słowa, wsłuchiwałem się w niesamowitą ciszę, która zapadła w zatłoczonej sali. Gdy wreszcie podniosłem wzrok, napotkałem oczy Stallmana wpatrujące się we mnie bez jednego mrugnięcia. Inny reporter nieco bojaźliwie zadał następne pytanie, pilnując się, by używać właściwej nazwy GNU/Linux. Odpowiedział na nie Miguel de Icaza kierujący projektem GNOME. Jednakże dopiero gdy de Icaza był w połowie odpowiedzi, Stallman wreszcie odwrócił wzrok ode mnie. Dopiero wtedy poczułem miły dreszcz wolności przebiegający po krzyżu. Gdy Stallman zaczął pouczać innego reportera na temat błędów jego dykcji, poczułem ulgę. Przynajmniej już na mnie nie patrzy - pomyślałem. + +Takie chwilowe zatrzymywanie na kimś wzroku doskonale służyło celom Stallmana. Przed końcem konferencji LinuxWorld większość dziennikarzy doskonale wiedziała, że w jego obecności lepiej nie używać nazwy Linux, a w wired.com pojawił się artykuł, w którym porównano Stallmana do przedstalinowskiego rewolucjonisty wymazanego z kart historii przez hakerów i przedsiębiorców, którym z powodów politycznych projekt GNU stał ością w gardle6. Autorzy innych artykułów poszli tym śladem i gdy kilku dziennikarzy użyło w druku nazwy GNU/Linux, inni przypomnieli, że Stallman doprowadził do powstania wolnego systemu operacyjnego już 15 lat wcześniej. + +Przez następne 17 miesięcy nie spotkałem Stallmana. W tym czasie ponownie odwiedził Dolinę Krzemową podczas Linux-World Show w sierpniu 1999 r. Choć nie poproszono go o wygłoszenie przemówienia, urządził wszystko w sposób maksymalnie dla siebie korzystny. Przyjmując Linus Torvalds Award for Community Service7, zażartował: "Danie nagrody Linusa Torvaldsa Fundacji Wolnego Oprogramowania to coś jak nagroda Hana Solo dla Przymierza Rebeliantów8". + +Tym razem jednak komentarz przeminął w mediach bez echa. W połowie tygodnia Red Hat, Inc., najważniejszy dostawca GNU/Linux, wszedł na giełdę z ofertą publiczną. Było to potwierdzenie czegoś, czego dziennikarze, łącznie ze mną, spodziewali się od dawna - "Linux" stał się na Wall Street słowem-symbolem, podobnie jak wcześniej e-commerce i dot-com. W miarę zbliżania się przesilenia roku 2000 na giełdzie wszystkie dyskusje na temat wolnego oprogramowania i jego politycznego znaczenia odbijały się od nieprzebytego muru, jak hiperbola od pionowej asymptoty, i opadały bezsilnie u jego podnóża. + +Być może dlatego trzecią z kolei konferencję LinuxWorld w sierpniu 2000 r. Stallman demonstracyjnie zbojkotował. + +Wkrótce potem po raz drugi zetknąłem się z nim i z jego "firmowym" spojrzeniem. Słysząc, że zamierza przyjechać do Krzemowej Doliny, umówiłem się z nim na lunch i wywiad w kalifornijskim Palo Alto. Wybór miejsca zdawał się być ironią losu, nie tylko z powodu ostatniej nieobecności Stallmana na LinuxWorld, lecz także z powodu tła naszego spotkania. Poza Redmond w stanie Washington niewiele jest miast, które byłyby w równym stopniu potwierdzeniem ekonomicznego znaczenia własności oprogramowania. Ciekawie było patrzeć, jak Stallman - człowiek, który spędził znaczną cześć życia na zwalczaniu mentalności opartej na chęci posiadania, zachowa się w mieście, w którym nawet cena bungalowu wielkości połowy garażu sięga 500 tysięcy dolarów. Jechałem na spotkanie z Oakland. + +Kierując się wskazówkami otrzymanymi od Stallmana, dotarłem do siedziby Art.net, niedochodowej "wspólnoty wirtualnych artystów". Kwatera Art.net usytuowana na północnym krańcu miasta, na posesji odgrodzonej od świata żywopłotem, działała odświeżająco. Nagle wizja Stallmana czającego się gdzieś w zakamarkach Krzemowej Doliny wydała się mniej dziwaczna. + +Znalazłem go w zaciemnionym pokoju, "zastukanego" w klawiaturę jego szarego laptopa. Gdy wszedłem, podniósł wzrok i oświetlił mnie pełną mocą swego 200-watowego spojrzenia. Gdy mruknął dość przyjazne "Hello", odwzajemniłem powitanie. Zanim jednak cokolwiek powiedzieliśmy, jego wzrok powrócił na ekran laptopa. + +"Właśnie kończę artykuł poświęcony duchowi hakerstwa" - powiedział, nadal przebiegając palcami po klawiaturze. - "Zobacz". + +Spojrzałem. Światło w pokoju było przyćmione, a tekst był wyświetlony białozielonkawym kolorem na czarnym tle, czyli za pomocą kolorów odwrotnych do zwykle stosowanych w edytorach tekstu, zatem nieco potrwało, zanim mój wzrok zaadaptował się do warunków i mogłem coś odczytać. Zobaczyłem opis ostatniej wizyty Stallmana w restauracji koreańskiej. Przed posiłkiem Stallman dokonał interesującego odkrycia: osoba nakrywająca do stołu pozostawiła 6 pałeczek zamiast potrzebnych dwóch. Większość restauracyjnych gości po prostu zignorowałaby istnieje dodatkowych czterech pałeczek, ale dla niego było to wyzwanie: w jaki sposób użyć jednocześnie wszystkich sześciu. Tak jak w przypadku wielu hakerskich trików, również tutaj rozwiązanie było jednocześnie proste i wymagające inteligencji, więc użył ich tak, jak to zostało pokazane na załączonej ilustracji. + +W trakcie czytania tej historii czułem, że Stallman intensywnie mi się przygląda. Zerknąłem na niego i zauważyłem na twarzy dziecięcy półuśmiech zadowolenia z siebie. Ale gdy pochwaliłem jego esej, mój komentarz wywołał ledwo zauważalne uniesienie brwi. + +"Będę gotowy za moment" - powiedział. + +Wrócił do stukania na laptopie. Był to szary kanciasty laptop, w niczym nie przypominający lśniących, nowoczesnych cacek, które często widywałem w rękach programistów na konferencji LinuxWorld. Nad normalną klawiaturą była przymocowana druga pozwalająca na lżejsze naciskanie klawiszy. Gdy w latach osiemdziesiątych spędzał około 70-80 godzin tygodniowo na pisaniu oprogramowania dla projektu GNU, odczuwał nieznośny ból rąk i był zmuszony wynająć maszynistę. Dlatego teraz korzystał z klawiatury wymagającej o wiele słabszego naciskania na klawisze niż w przypadku klawiatur standardowych. + +Podczas pracy wyłączał się na wszelkie bodźce zewnętrzne. Patrząc na jego oczy skupione na ekranie i palce tańczące po klawiaturze, szybko dochodziło się do wniosku, że tak wygląda współpraca dwóch dobrych przyjaciół. + +Zakończył pisanie kilkoma głośniejszymi uderzeniami klawiszy i zamknął laptopa. + +"Gotów na lunch?" spytał. + +Poszliśmy do mojego samochodu. Tłumacząc się bólem w kostce, szedł wolno, nieco utykając. Twierdził, że to wynik uszkodzenia ścięgna lewej stopy. Kontuzja miała miejsce trzy lata temu i była na tyle poważna, że on, zaprzysięgły fan tańców ludowych, był zmuszony do rezygnacji z nich. "Miłość do tańca to moja cecha wrodzona" - narzekał. - "Niemożność tańczenia to dla mnie tragedia". + +Jego ciało było obrazem tej tragedii. Brak ruchu spowodował nabrzmienie policzków i pojawienie się brzuszka, który przed rokiem był niemal niewidoczny. Widać było, że przybranie na wadze było dla niego dramatem, gdyż idąc odchylał się do tyłu jak kobieta w ciąży starająca się zrównoważyć nienormalny ciężar. + +Dodatkowo spacer stał się jeszcze wolniejszy, gdyż Stallman zatrzymywał się, by wąchać róże. Spotykając wyjątkowo piękny kwiat, łaskotał wewnętrzne płatki swym pokaźnym nosem, wciągał zapach i odchylał się z wyrazem ukontentowania na twarzy. + +"Mmm, rhinophytophilia9" - powiedział, pocierając kark. + +Jazda samochodem do restauracji nie trwała dłużej niż trzy minuty. Zgodnie z zaleceniem Tima Neya, niegdyś dyrektora Fundacji Wolnego Oprogramowania, pozostawiłem Stallmanowi wybór restauracji. Niektórych dziennikarzy zmylił niemal ascetyczny styl życia Stallmana - we wszystkim, co dotyczy jedzenia, jest on hedonistą. Dodatkową korzyścią płynącą z bycia wędrownym misjonarzem głoszącym ideę wolnego oprogramowania jest możliwość próbowania kuchni różnych narodów. "Kiedy Richard przyjeżdża do dowolnego dużego miasta na świecie, z dużą dozą prawdopodobieństwa można założyć, że zna tam najlepsze restauracje" - twierdzi Ney. "Jest również bardzo dumny ze znajomości potraw w menu i z wielką radością składa zamówienia dla wszystkich przy stole." + +Na dzisiejszy posiłek wybrał restaurację dim sum10 w stylu kantońskim, dwie przecznice od University Avenue, głównej ulicy Palo Alto. Wybór był częściowo zainspirowany jego niedawna wizytą w Chinach i wygłoszeniem wykładu w prowincji Guangdong oraz awersją do ostrych przypraw charakteryzujących kuchnię Seczuanu i prowincji Hunan. "Nie jestem zwolennikiem ostrych przypraw" - przyznał. + +Przyjechaliśmy kilka minut po 11 przed południem i już musieliśmy poczekać około 20 minut. Znając hakerską niechęć do tracenia czasu, obawiałem się wybuchu, ale wbrew oczekiwaniom Stallman spokojnie przyjął to do wiadomości. + +"Szkoda, że nie ma nikogo, kto mógłby się do nas przyłączyć" - powiedział. - "Zawsze weselej jeść w większej grupie". + +Czekając, ćwiczył kilka kroków tanecznych. Jego ruchy były niepewne lecz poprawne. Dyskutowaliśmy o sprawach bieżących. Powiedział, że żałuje jedynie, iż na konferencji Linux-World nie mógł uczestniczyć w powołaniu Fundacji GNOME. Fundacja wspierana przez Sun Microsystems i IBM jest w znacznej mierze potwierdzeniem słuszności jego twierdzeń, że wolny rynek i wolne oprogramowanie nie muszą się wzajemnie wykluczać. Był niezadowolony, że ominęła go okazja do wypowiedzenia się. + +"Nie podoba mi się sposób prezentacji. Obie firmy mówiły dużo o Linuksie, nawet nie wspominając o projekcie GNU" - mówił niezadowolony. + +To niedocenianie kontrastuje z coraz lepszymi informacjami napływającymi z innych kontynentów, zwłaszcza z Azji - podkreśla. Krótkie spojrzenie na plan jego podróży w roku 2000 świadczy o niewątpliwym wzroście popularności wolnego oprogramowania na świecie. Pomiędzy ostatnimi wizytami w Indiach, Chinach i Brazylii na 115 dni tylko 12 spędził w USA. Podróże dają mu możliwość sprawdzenia, w jaki sposób koncepcja wolnego oprogramowania jest przyjmowana przez ludzi różnych języków i kultur. + +"W Indiach wiele osób interesuje się wolnym oprogramowaniem, gdyż widzą w nim możliwość budowania własnej infrastruktury informatycznej bez wydawania zbyt wielkich sum pieniędzy" - stwierdził Stallman. - "W Chinach idea wolnego oprogramowanie szerzy się wolniej, co jest związane z brakiem wolności słowa. Trudno przyjmować wolne oprogramowanie tam, gdzie nie ma wolności wypowiedzi. Pomimo to stopień zainteresowania wolnym oprogramowaniem jest znaczny, co zaobserwowałem podczas mojej wizyty". + +Rozmowa zeszła ma Napstera, firmę z San Mateo w Kalifornii, która w ciągu kilku ostatnich miesięcy stała się przedmiotem wielkiego zainteresowania mediów. Dostarcza ona narzędzi pozwalających jednym fanom muzyki przeglądać i kopiować pliki muzyczne należące do innych. Dzięki rosnącej roli internetu ten tzw. program peer-to-peer11 rozrósł się i przekształcił w prawdziwą szafę grającą, dając zwykłym fanom muzyki sposób na słuchanie ulubionych utworów z odgrywanych na komputerze plików MP3 bez płacenia złamanego grosza - ku rozgoryczeniu firm fonograficznych. + +System Napstera, choć korzysta z oprogramowania z prywatnymi prawami własności, czerpie inspirację z głoszonej przez Stallmana idei, że wszystko, co staje się cyfrową rzeczywistością, w której kopiowanie informacji staje się o wiele ważniejsze od kopiowania dźwięków i materii, coraz trudniej podlega jakimkolwiek restrykcjom. Zamiast nakładać kolejne ograniczenia, rządzący Napsterem zdecydowali się czerpać korzyści z naturalnego pędu i tworząc dla słuchaczy muzyki centralny rynek handlu i wymiany plików, postawili na sterowanie ich zainteresowaniami w stronę innych możliwości handlowych. + +Nagły sukces modelu zaproponowanego przez Napstera przeraził tradycyjne firmy fonograficzne. Na kilka dni przed moim spotkaniem ze Stallmanem w Palo Alto Marylin Patel, U. S. District Court Judge12, pozytywnie rozpatrzyła złożone przez Recording Industry Association of America14 żądanie wydania sądowego zakazu działania systemu wymiany plików. Zakaz ten został z kolei zawieszony przez U. S. Ninth District Court of Appeals14. Jednakże na początku 2001 roku również sąd apelacyjny uznał, że firma z San Mateo złamała prawo autorskie, co rzecznik RIAA, Hillary Rosen, ogłosiła jako "wielkie zwycięstwo twórczej społeczności i legalnego rynku internetowego15". + +Dla hakerów takich jak Stallman model biznesowy Napstera jest nie do przyjęcia z kilku powodów. Firma gorliwie korzysta z hakerskich zasad, takich jak otwarte udostępnianie plików i społeczna własność informacji, jednocześnie sprzedając usługi oparte na korzystaniu z oprogramowania z prywatnym prawem własności, co tworzy przedziwną mieszaninę i przekazuje społeczeństwu niejasne przesłanie. Jako osoba, która masę czasu spędziła na ostrożnym formułowaniu informacji przeznaczonych do upublicznienia, Stallman ostrożnie i oszczędnie wyraża swe sądy o Napsterze. Przyznaje, że nauczył się kilku rzeczy dotyczących społecznej strony fenomenu Napstera. + +Mówi: "Przed sprawą Napstera twierdziłem, że jest OK, jeżeli ludzie zajmują się prywatną redystrybucją plików służących rozrywce. Jednakże liczba ludzi, która korzysta z serwisu Napstera, uświadomiła mi, że redystrybucja kopii na wielką skalę jest sprawą o wielkim znaczeniu i nie można jej lekceważyć". + +Gdy Stallman to powiedział, drzwi restauracji otworzyły się i właściciel zaprosił nas do środka. W ciągu kilku sekund zostaliśmy posadzeni w narożniku sali obok wielkiej zwierciadlanej ściany. Menu restauracji było jednocześnie formularzem zamówienia i zanim kelner zdążył przynieść wodę, Stallman szybko zakreślił odpowiednie kwadraciki. "Krewetki smażone na głębokim oleju w cieście z sera sojowego" - przeczytał. - "Ser sojowy ma taką interesującą fakturę. Myślę, że powinniśmy to zamówić". + +Ten komentarz był wstępem do podjętej in promptu rozmowy o kuchni chińskiej i niedawnej wizycie Stallmana w Chinach. "Jedzenie w Chinach jest wspaniałe" - rzekł głosem, w którym po raz pierwszy tego dnia wyczułem emocje. "Tyle różnych rzeczy, których nigdy nie widziałem w USA, miejscowe potrawy z lokalnych grzybów i lokalnych warzyw. Zacząłem nawet prowadzić dziennik posiłków, tylko po to, by nie tracić informacji o cudownościach, które mi podawano". + +Rozmowa przeszła na zagadnienia kuchni koreańskiej. Podczas tej samej azjatyckiej podróży w czerwcu 2000 r. Stallman odwiedził także Koreę Południową. Jego przybycie wywołało miniburzę w lokalnych mediach, a to z powodu ogólnokoreańskiej konferencji oprogramowania, w której w tym czasie brał udział założyciel i prezes zarządu Microsoftu, Bill Gates. Poza ujrzeniem swego zdjęcia bezpośrednio nad zdjęciem Billa Gatesa na pierwszej stronie seulskiej gazety, najlepszym wspomnieniem Stallmana z Korei była tamtejsza kuchnia. "Dostałem miskę naeng myun, czyli makaronu ryżowego. W różnych miejscach do przygotowania naeng myun używa się różnego makaronu ryżowego. Mogę z całą pewnością stwierdzić, że dostałem wówczas najwspanialsze naeng myun, jakie kiedykolwiek jadłem". + +Stallman często używa określenia "wspaniały". Byłem o tym przekonany po kilku minutach słuchania jego hymnu pochwalnego na temat naeng myun. Cały czas czułem jego laserowy wzrok wypalający znamię na moim prawym ramieniu. + +"Co za wspaniała kobieta siedzi za tobą" - usłyszałem. + +Obróciłem się, zerkając na plecy siedzącej tam niewiasty. Była młoda, około 25 lat, ubrana w białą sukienkę z cekinami. Ona i mężczyzna, który jej towarzyszył, właśnie płacili rachunek. Gdy wstali od stołu, by wyjść, nie musiałem nawet patrzeć, gdyż oczy Stallmana wprost przyćmiła intensywność przeżycia. + +"O nie" - powiedział. - "Wyszli i pewnie już nigdy jej nie zobaczę". + +Ale po krótkim westchnieniu powrócił do równowagi. Ta chwila dała mi szansę na skierowanie rozmowy na jego reputację osobnika będącego zaprzeczeniem uczciwego seksu. Była to nieco dyskusyjna opinia. Wielu hakerów wspominało o jego skłonności do całowania kobiet w rękę przy powitaniu16. Salon.com w artykule z 26 maja sportretował Stallmana jako hakerskiego uwodziciela. Dokumentując związek wolnego oprogramowania z wolnym seksem, reporterka Annalee Newitz pokazała Stallmana jako przeciwnika wszelkich tradycyjnych wartości rodzinnych i zwolennika miłości, ale nie monogamii17. + +Gdy poruszyłem ten temat, Stallman nieco odsunął menu. "Tak, większość mężczyzn wydaje się pożądać seksu i wydaje się mieć nieco pogardliwy stosunek do kobiet" - powiedział - "a kobiety zdają się to aprobować, czego zupełnie nie mogę zrozumieć". + +Przypomniałem fragment z wydanej w roku 1999 książki Open Sources, gdzie przyznał się, że feralne jądro GNU chciał nazwać imieniem swojej ówczesnej przyjaciółki. Imię brzmiało Alix i doskonale pasowało do przyjętej w środowisku Uniksa konwencji używania x na końcu nazwy nowego jądra, czego przykładem jest Linux. Ponieważ kobieta była administratorką Uniksa, byłoby to dla niej tym bardziej wzruszające. Niestety, w końcu główny twórca tego jądra nadał mu nazwę HURD18. Choć potem Stallman rozstał się z tą przyjaciółką, historia ta rodzi pytanie, czy zgodnie z opisem mediów jest fanatykiem o dzikim spojrzeniu, czy beznadziejnym romantykiem, wędrującym Don Kichotem walczącym z wiatrakami wielkich korporacji w nadziei zrobienia wrażenia na jeszcze nieokreślonej Dulcynei? + +"Nie próbowałem być romantyczny" - mówi, wspominając historię Alix. - "Była to raczej chęć podroczenia się. Było to romantyczne, lecz również nieco złośliwe. Rozumiesz? Mogłaby to być zachwycająca niespodzianka". + +Uśmiechnął się po raz pierwszy tego przedpołudnia. Podniosłem rękę, całując ją. "Tak, robię to" - potwierdził. - "Uznałem, że jest to sposób wyrażenia uczucia akceptowany przez wiele kobiet. Daje to szansę pokazania uczucia i uzyskania jego akceptacji". + +Uczucie jest nicią przewijającą się przez całe życie Richarda Stallmana i pytany o to jest szczery aż do bólu. "W przeciwieństwie do myśli, w moim rzeczywistości życiu nie było wiele uczucia" - mówi. Rozmowa staje się niezręczna. Po kilku następnych słowach Stallman znów podnosi do oczu menu, kończąc tym ten wątek. + +"A co powiesz na nieco shimai?" - pyta. + +Gdy przyniesiono potrawy, rozmowa zaczęła przeskakiwać z tematu na temat. Rozmawialiśmy o częstym wśród hakerów umiłowaniu chińskiej kuchni, cotygodniowych obiadach w bostońskiej chińskiej dzielnicy w czasach, gdy Stallman był programistą w AI Lab, oraz o wewnętrznej logice języka chińskiego i wynikającym z tego systemie zapisu. Każde moje stwierdzenie spotykało się z błyskotliwą odpowiedzią Stallmana. + +"Podczas ostatniego pobytu w Chinach słyszałem kilka osób mówiących w dialekcie szanghajskim." - powiedział. - Warto było posłuchać. Brzmiało to całkiem odmiennie (od mandaryńskiego). Musiałem ich poprosić, aby powiedzieli kilka słów w obu odmianach języka. Czasami widać podobieństwo, a interesowało mnie, czy dźwięki są podobne. Zwykle nie są. Interesuje mnie to, gdyż istnieje teoria, że wszystkie wmawiane słowa ewoluowały przez utratę dodatkowych sylab, gubionych i zastępowanych. Efektem jest brzmienie języka. Jeżeli to prawda, a widziałem prace, w których dowodzono, że proces ten odbywał się w czasach już historycznych, dialekty przed procesem tracenia sylab powinny mieć jeden wspólny rdzeń. + +Podano pierwsze danie, talerz smażonych na patelni naleśników z rzepy. Zamilkliśmy na chwilę, aby wykroić sobie po sporym prostokątnym kawałku, którego zapach przypominał gotowaną kapustę, lecz smak raczej placki ziemniaczane podsmażone na bekonie. + +Postanowiłem powrócić do rozmowy na zasadnicze tematy. Byłem ciekaw, czy jego życie nastolatka przygotowało go do podejmowania kontrowersyjnych poczynań. Myślałem głównie o jego trwającej od roku 1994 batalii o zastąpienie nazwy Linux przez GNU/Linux. + +"Wierzę, że to mi pomogło" - odparł, przeżuwając. - "Nigdy nie rozumiałem, co oznacza presja wywierana przez rówieśników. Myślę, że byłem na tyle odrzucony przez innych, że nie spodziewałem się niczego zyskać, postępując zgodnie z aktualną modą. Nic by mi to nie dało. Nadal pozostałbym tak samo na uboczu". + +Wskazał na swój gust muzyczny jako odbicie tendencji do pozostawania w opozycji. Gdy większość kolegów z ogólniaka słuchała Motown i rocka, on wolał muzykę klasyczną. Pamięta, że w szkole średniej prowadziło to do zabawnych zdarzeń. W roku 1964 po występie Beatlesów w programie "Ed Sullivan Show"19 większość kolegów ruszyła do sklepów, wykupując ostatni album i single tego zespołu. Stallman zaś postanowił zbojkotować słynną czwórkę. + +"Lubiłem część przedbeatlesowej muzyki popularnej" - mówi Stallman, - "ale nie lubiłem Beatlesów. Zwłaszcza nie podobała mi się dzika reakcja ludzi na ich koncerty. Wszyscy zabiegali o ich występy, aby się przed nimi płaszczyć". + +Gdy bojkot Beatlesów pozostał niezauważony, poszukał innych metod, by wytknąć rówieśnikom mentalność stada. Przez chwilę zastanawiał się nad założeniem zespołu rockowego, którego zadaniem byłoby parodiowanie grupy z Liverpoolu. + +"Chciałem ten zespół nazwać Tokyo Rose and Japanese Beetles20". + +Ponieważ wiadomo, że lubi muzykę ludową różnych krajów, spytałem, czy równie podoba mu się Bob Dylan i inni wykonawcy muzyki ludowej z wczesnych lat sześćdziesiątych. Potrząsnął głową i powiedział: - "Lubiłem Petera, Paula i Mary. Przypominali mi wielki filk". + +Gdy spytałem, co znaczy "filk", wyjaśnił, że to popularna pieśń lub piosenka, w której liryka została zastąpiona przez parodię liryki. Taki proces przerabiania to "filking" i jest to popularne zajęcie hakerów i miłośników science fiction. Przykłady to "On Top of Spaghetti" - przeróbka "On Top of Old Smokey" oraz filmowy majstersztyk "Weirda" Ala Yankovica21 -"Yoda", wykonywana w stylu "Gwiezdnych wojen" przeróbka "Loli" zespołu The Kinks. + +Zapytał mnie, czy mam ochotę na wysłuchanie ludowego filku. Gdy tylko zdążyłem odpowiedzieć twierdząco, zaczął śpiewać niespodziewanie czystym głosem: + + How much wood a woodchuck chuck, + If a woodchuck could chuck wood? + How many ples could a polak lock, + If a polak could could lock poles? + How many knees could a negro grow, + If a negro could grow knees? + The answer, my dear, is stick it in your ear. + The answer is to stick it in your ear. + +Śpiew dobiegł końca i na ustach Stallmana pojawił się kolejny niemal dziecinny półuśmiech. Rozejrzałem się po stolikach dookoła. Azjatycka rodzina ciesząca się niedzielnym lunchem prawie nie zwróciła uwagi na brodacza w średnim wieku śpiewającego altem22. Po chwili wahania roześmiałem się również. + +"Czy masz ochotę na ostatniego cornballa23?" - spytał Stallman i zanim zdążyłem odpowiedzieć, schwycił pałeczkami inkrustowaną ziarnem kulkę. Unosząc ją dumnie, powiedział: "Jednak to ja będę tym, który to dostanie". + +Skończyliśmy jedzenie i rozmowa przybrała formę normalnego wywiadu. Stallman usadowił się w pozycji półleżącej z filiżanką herbaty w dłoniach. Wróciliśmy do sprawy Napstera i jej związków z ruchem wolnego oprogramowania. Spytałem, czy zasady wolnego oprogramowania powinny być rozciągnięte na podobne obszary, na przykład utwory muzyczne. + +"Przenoszenie rozwiązań z jednej dziedziny na inną jest błędem" - powiedział Stallman, odróżniając nagrania muzyczne od oprogramowaniu. - "Na każdy rodzaj pracy trzeba patrzeć inaczej i wyciągać odpowiednie wnioski". + +Mówiąc o prawach autorskich, wyróżnił trzy kategorie. Pierwsza to produkty "funkcjonalne", np. oprogramowanie, słowniki i książki. Druga obejmuje prace, które można uznać za oświadczenia lub opisy zdarzeń, np. prace i dokumenty historyczne. Wszelkie zmiany wprowadzane przez kolejnych czytelników mogłyby całkowicie zniweczyć cel tych prac i sens ich tworzenia. Wreszcie ostatnia kategoria to dzieła osobiste, np. dzienniki, wspomnienia i autobiografie. Modyfikowanie takich dokumentów oznaczałoby zmianę osobistych wspomnień lub punktów widzenia autorów, co Stallman uznał za etycznie niedopuszczalne. + +Tylko pierwsza z trzech wyliczonych kategorii daje użytkownikowi nieograniczone prawo wprowadzania zmian, zaś w kategorii drugiej i trzeciej zmiany mogą być wprowadzane jedynie za zgodą autora oryginału. Jednakże, twierdził uparcie, wolność kopiowania i niekomercyjnej redystrybucji powinna pozostać nienaruszona w przypadku wszystkich trzech wymienionych kategorii. Oznacza to danie użytkownikom internetu prawa do generowania setek kopii artykułów, obrazów, piosenek lub książek i rozsyłania ich pocztą elektroniczną. "Jest oczywiste, że prywatna, okazjonalna redystrybucja nie powinna być zabroniona, gdyż zakazywana jest jedynie w państwach policyjnych. Wtrącanie się między znajomych i przyjaciół to działanie aspołeczne. Napster przekonał mnie, że potrzebne jest także zezwolenie na niekomercyjną redystrybucję rozrywki. Po prostu dlatego, że jest to potrzebne tak wielu ludziom i tak wielu ludziom przynosi to pożytek". + +Gdy spytałem, czy sądy podzielą tak permisywną opinię, przerwał mi w pół zdania. + +"To źle postawione pytanie" - powiedział. - "Teraz zmieniłeś przedmiot rozważań, przechodząc od zagadnień etycznych do sposobu interpretacji przepisów prawa. A to są dwa zupełnie różne spojrzenia na tę samą kwestię. Bez sensu jest skakać z jednego pola na drugie. Sądy zwykle surowo interpretują istniejące przepisy prawa, gdyż taka interpretacja jest kupiona przez wydawców". + +Ten komentarz pozwala zajrzeć w głąb politycznej filozofii Stallmana: to, że legalna władza wspiera skłonność biznesu do traktowania praw autorskich oprogramowania tak samo jak prawa własności gruntu, nie oznacza, że użytkownicy komputerów mają się temu podporządkować. Wolność to sprawa etyki, a nie prawa. "Patrzę nie na to jakie jest istniejące prawo, ale jakie powinno być. Staram się naszkicować jego zarys. Myślę, jak prawo powinno działać. Uważam, że prawo zabraniające udostępnienia przyjacielowi kopii jest moralnym odpowiednikiem prawa Jima Crowa24. Trudno takie prawo darzyć szacunkiem". + +Przywołanie Jima Crowa rodzi kolejne pytanie. Jak dalece na Stallmana mają wpływ liderzy polityczni z przeszłości? Na podobieństwo ruchu praw obywatelskich z lat pięćdziesiątych i sześćdziesiątych również jego wysiłki kierowania zmianami społecznymi pozostają pod wpływem zawsze atrakcyjnych haseł wolności, sprawiedliwości i postępowania fair play. + +Stallman słuchał, dzieląc uwagę między wypowiadaną przeze mnie analogię i szczególnie splątany kosmyk włosów. Gdy dotarłem do porównania go do doktora Martina Luthera Kinga, przygryzł koniec kosmyka i przerwał mój wywód. + +"Nie jestem z tej drużyny, ale gram w tę samą grę" - powiedział, żując. + +Zaproponowałem Malcoma X25 jako inny punkt odniesienia. Analogicznie do byłego rzecznika Nation of Islam26 Stallman zdobył sobie opinię osoby kontrowersyjnej, odgradzającej się od potencjalnych sojuszników i wynoszącej samowystarczalność ponad integrację kulturową. + +Przeżuwając koniec innego kosmyka długich włosów, odrzucił i to porównanie. "Moje przesłanie jest bliższe temu, co głosił Martin Luther King" - powiedział. "Jest to przesłanie uniwersalne głoszące potępienie pewnych praktyk znęcania się nad innymi. Nie głoszę nienawiści do nikogo i nie zwracam się do żadnej wybranej, wąskiej grupy. Wzywam wszystkich do docenienia wolności i jej zachowania". + +Jednakże skłonność do podejrzliwego traktowania wszelkich politycznych aliansów jest fundamentalną cechą jego charakteru. Można zrozumieć jego niechęć do terminu "otwarty kod źródłowy" (ang. open source) i do udziału w ostatnich projektach koalicyjnych. Przez dwie dekady wbijał ludziom do głowy ideę wolnego oprogramowania i to określenie jest jego kapitałem politycznym. Niemniej jego komentarze w rodzaju dowcipu o Hanie Solo na LinuxWorld w roku 1999 jedynie umacniają w przemyśle oprogramowania jego opinię rozczarowanego odludka odcinającego się od politycznych i gospodarczych trendów. + +"Lubię i szanuję Richarda za to, czego dokonał" - mówi Robert Young, prezes zarządu Red Hat, - "ale mam do niego żal za to, że często przyjaciół traktuje gorzej od wrogów". + +Jego niechęć do szukania sojuszników jest równie niezrozumiała, gdy rozważamy dziedziny zainteresowań politycznych niezwiązanych z ruchem wolnego oprogramowania. Krótka wizyta w jego biurze w MIT przywodzi na myśl biuro wymiany artykułów prasowych i komunikatów agencyjnych na temat gwałcenia praw ludzkich jak świat długi i szeroki. Na jego stronie internetowej znajdziemy diatryby na temat Digital Millenium Copyright Act27, wojny narkotykowej i Światowej Organizacji Handlu. + +Widząc jego skłonności działacza politycznego, spytałem, dlaczego nie stara się mówić donośniejszym głosem. Dlaczego swej pozycji w świecie hakerskim nie stara się wykorzystać jako platformy do rozszerzania swych wpływów, zamiast usuwać się w cień. + +Pozwolił opaść zmierzwionemu kosmykowi włosów i przed udzieleniem odpowiedzi zamyślił się na chwilę. + +"Obawiam się, by nie przesadzać z ważnością tego bajorka wolności" - powiada. - "Jest tak wiele dobrze znanych tradycyjnych obszarów walki o wolność i lepsze społeczeństwo i są one tak ważne, że nie mogę głosić, że sprawa wolnego oprogramowania jest równie ważna. To odpowiedzialność, która na mnie spadła i której staram się podołać. Sądzę, że mogę tu coś zrobić. Ale na przykład zwalczenie brutalności policji, zakończenie wojny narkotykowej, zniszczenie rasizmu i zapewnienie każdemu godziwego, wygodnego życia, zapewnienie prawa do aborcji, ochronienie nas przed teokracją - to działania strasznie ważne, o wiele ważniejsze od tego, co ja robię. Chciałbym wiedzieć, w jaki sposób mogę je wesprzeć". + +Po raz kolejny Stallman pokazał, że jego działalność polityczna wypływa z głębokiego osobistego przekonania. Wiele czasu zabrało mu stworzenie i rozwinięcie ruchu wolnego oprogramowania oraz dopracowanie szczegółów jego zasadniczych reguł. Dlatego waha się przed udziałem w każdym ruchu, który mógłby go wynieść poza znane granice na ziemię, której nie ma na żadnej mapie. + +"Chciałbym wiedzieć, w jaki sposób można rozwiązać te wielkie problemy. Byłbym z tego bardzo dumny, ale są to rzeczy tak trudne, że wielu lepszych ode mnie i pracujących nad tym od lat posunęło sprawy naprzód jedynie o kilka kroków lub wcale" - mówi. - "Ale gdy inni są zajęci wielkimi sprawami i walczą z wielkimi zagrożeniami, ja dostrzegłem jeszcze coś, co nam grozi, i występuję przeciwko tej groźbie. Być może nie jest to wielkie zagrożenie, ale ja jestem sam na polu walki". + +Żując koniuszek kosmyka, zaproponował zapłacenie rachunku. Zanim kelner zdołał zainkasować zapłatę i odejść, Stallman wyciągnął białawy banknot dolarowy i dorzucił go do kupki już leżących na stole. Z daleka było widać, że jest fałszywy. Nie mogłem się powstrzymać, by go nie obejrzeć. Zamiast portretu George'a Washingtona lub Abrahama Lincolna zobaczyłem rysunek świnki. Napis United States of America został zastąpiony przez United Swines of Avarice28. Na banknocie podano wartość zero dolarów. Gdy kelner zbierał banknoty, Stallman pociągnął go za rękaw. + +"Jako ekstranapiwek dodałem jedno zero" - oświadczył z półuśmiechem na ustach. + +Ogłupiały i nic nierozumiejący kelner zabrał banknoty ze stołu i z uśmiechem pośpiesznie się oddalił. + +"Myślę, że możemy już iść" - powiedział Stallman. + + +Rozdział 6. +Wspólnota Emacs + +W latach siedemdziesiątych AI Lab było miejscem ze wszech miar szczególnym. Specjaliści najwyższej klasy, pracujący nad projektami dotyczącymi najnowszych technologii, zapewniali mu znaczącą pozycję w świecie nauk komputerowych. Jednakże wewnętrzna kultura hakerska i towarzysząca jej anarchia prowadziły do buntowniczego mistycyzmu. Później, gdy większość naukowców i gwiazd programowania odeszło gdzie indziej, hakerzy mogli swobodnie urzeczywistnić efemeryczny świat, który wcześniej zasiedlili. + +W artykule opublikowanym w "Forbes" w roku 1998 przytoczono słowa Stallmana wspominającego laboratorium z tego okresu i panujący tam etos wzajemnego udostępniania sobie oprogramowania. Jak wspomina Stallman - "Przypominało to ogród rajski. Nawet nie przychodziło nam do głowy, że można ze sobą nie współpracować"1. + +To biblijne porównanie, choć może przesadzone, podkreśla bardzo istotny fakt. Dla wielu dziewięciopiętrowy budynek przy Tech Square 545 był czymś więcej niż tylko miejscem pracy. Dla hakerów w rodzaju Stallmana był domem. + +Słowo "dom" ma swoje szczególne miejsce w słowniku Stallmana. Z uwagi na krytyczny stosunek do rodziców Stallman wzbrania się nazwać domem jakiekolwiek miejsce pobytu aż do zamieszkania w harvardzkim internacie Currier House. Opuszczenie go opisuje w sposób tragikomiczny. Z lat spędzonych w Harvadzie żałuje jedynie wygnania z akademika. Dopiero pytanie o powód wcześniejszego opuszczenia internatu uświadamia mi, że otrzymam klasyczną odpowiedź w stallmanowskim stylu. + +"W Harvardzie prowadzili taką politykę, by pozbywać się tych, którzy zaliczyli zbyt wiele kursów". + +Nie mając miejsca w internacie i chęci do powrotu do Nowego Jorku, postąpił tak jak przed nim wielu innych hakerów, między innymi Greenblatt, Gosper i Sussman. Przyjęty do MIT na studia magisterskie2, wynajął mieszkanie w pobliżu Cambridge, by wkrótce przekonać się, że AI Lab jest jego faktycznym domem. Przemawiając w roku 1986, następująco opisał czas spędzony tamże: + + Mogłem pracować nieco więcej od innych, gdyż każdego roku z takich lub innych powodów przez kilka miesięcy nie miałem mieszkania i po kilka miesięcy spędzałem w laboratorium. Było tam zawsze bardzo wygodnie, a latem na dodatek chłodno. Ale nie było to nic niezwykłego i często można się było tam natknąć na śpiących, gdzie popadło. Siedziało się tam, dopóki można było hakować, i nie chcąc przerywać zajęcia, trwało przy komputerze aż do zupełnego opadnięcia z sił. Wtedy szukało się dowolnej płaskiej i miękkiej powierzchni, by się położyć i usnąć. Atmosfera była całkiem nieformalna3. + +Czasami domowa atmosfera w laboratorium sprawiała problemy. To, co dla jednych było wygodnym miejscem do przespania się, inni uważali za norę przepełnioną dymem "elektronicznego opium". W roku 1976 w książce Computer Power and Human Reason4 naukowiec z MIT, Joseph Weizenbaum, skrytykował komputerowych łapserdaków-pomyleńców (ang. computer bums5). W ten sposób Weizenbaum nazwał hakerów zasiedlających komputerowe pokoje w AI Lab. Pisał: "Ich zmięte ubrania, niegolone twarze oraz niemyte i nieczesane włosy świadczą o zatraceniu świadomości istnienia własnych ciał i świata, w którym te ciała funkcjonują. Istnieją tylko po to, by korzystać z komputerów i komputerom służyć"6. + +Niemal ćwierć wieku po opublikowaniu tej opinii Stallman nadal jeży się na jej wspomnienie. Podejmując polemikę, używa czasu teraźniejszego, jak gdyby Weizenbaum stał w pobliżu, w tym samym pokoju. "On chce, by ludzie byli tylko zawodowcami, pracującymi wyłącznie dla pieniędzy i zapominającymi o tym, co robią, tak szybko, jak to tylko możliwe - mówi. - To, co on uważa za normalny bieg rzeczy, ja uważam za tragedię". + +Jednakże życie hakera nie było wolne od takich tragedii. Stallman ocenia swoje przeistoczenie się z weekendowego hakera w naturalizowanego "mieszkańca" AI Lab jako zbieg bolesnych niepowodzeń, których przetrwanie ułatwiała mu jedynie euforia działalności hakerskiej. Pierwszym niepowodzeniem było ukończenie studiów na Harvardzie. Chcąc dalej studiować fizykę, zapisał się na studia magisterskie na MIT. Wybór uczelni był oczywisty i naturalny. Dawał mu szansę pójścia w ślady wielkich poprzedników, absolwentów tej uczelni: Wiliama Shockeya (1936)7, Richarda P. Feynmanna (1939)8 i Murraya Gel-Manna (1951)9 oraz o dwie mile skracał odległość do AI Lab i nowego komputera PDP-10. "Moje zainteresowania coraz bardziej biegły ku programowaniu, ale przez pewien czas myślałem, że dam radę zajmować się i jednym, i drugim" - wspomina. + +Trudząc się nad zdobyciem stopnia naukowego w dzień, a w nocy programując w AI Lab, pracował jak mnich, który przez narzucenie sobie ścisłej dyscypliny dąży do idealnej równowagi. Punktem podparcia dźwigni utrzymującej tę równowagę był taniec ludowy. Raz na tydzień uczestniczył w występach grupy tanecznej, co dawało mu odrobinę rozrywki i kontaktu z płcią odmienną. Jednakże pod koniec pierwszego roku na MIT zdarzyło się nieszczęście. Uszkodzenie kolana zmusiło go do porzucenia grupy tanecznej. Z początku wydawało mu się, że to nic wielkiego, że z czasem minie, i nawet więcej wolnego czasu niż poprzednio poświęcał tańczeniu, ograniczając nieco pracę w AI Lab. Jednakże z końcem lata, gdy ból kolana nie ustępował, a zajęcia miały się ponownie rozpocząć, zaczął się niepokoić. "Z kolanem nie było ani ciut lepiej - wspomina, - co oznaczało, że muszę skończyć z tańczeniem. Byłem załamany". + +Bez mieszkania i bez tańczenia jego życie towarzyskie skurczyło się, właściwie zanikło. Poczuł, że jego zdolność interakcji z niehakerami, a zwłaszcza z niehakerami płci żeńskiej uległa znacznej atrofii. Po 16 tygodniach w AI Lab wyparowała z niego cała pewność siebie, którą zdążył zmagazynować przez cztery lata w Harvardzie. + +"Czułem, że utraciłem całą energię - wspomina. Nie chciało mi się robić niczego, co nie było w danej chwili potrzebne. Energia potrzebna do zrobienia czegoś więcej zniknęła. Ogarnęła mnie czarna rozpacz". + +Zatopiony bez reszty w pracy w AI Lab, wycofał się zupełnie ze świata. Przed październikiem 1975 porzucił MIT i nigdy tam nie powrócił. Hakerstwo, niegdyś jedynie hobby, stało się jego powołaniem. + +Patrząc wstecz, uważa, że jego przeistoczenie się ze studenta studiów dziennych w pełnoetatowego hakera było nieuniknione. Prędzej czy później głos przeznaczenia skłoniłby go do tej decyzji, tłumiąc zainteresowanie innymi zawodowymi poczynaniami. "Do fizyki i matematyki nigdy nie wniósłbym nic poważnego - wspomina swoje wysiłki z czasów przed uszkodzeniem kolana. - Mógłbym być nawet dumny, że coś tam zrobiłem w jednej lub drugiej dziedzinie, ale właściwie nie wiedziałem, do czego to ma prowadzić. Nie wiedziałem, od czego mam zacząć. W przypadku oprogramowania widziałem, co powinienem robić i jak działać, by napisać coś, co działa i jest pożyteczne. Przynosiło mi to satysfakcję popychającą do dalszego działania." + +Stallman nie był pierwszym, dla którego hakerstwo było przyjemnością. Wielu hakerów z AI Lab chlubiło się tym samym i również przerwało studia. Większość miała jakieś stopnie naukowe z matematyki lub inżynierii elektrycznej, które z trudem zdobyła, podporządkowując się wymogom akademickiej kariery i zawodowych ambicji. Przyszli do AI Lab dla czystej przyjemności rozwiązywania problemów, którymi jeszcze nikt się nie zajmował. Na podobieństwo świętego Tomasza z Akwinu, którego długie i intensywne rozważania teologiczne prowadziły do wizji nadprzyrodzonych, hakerzy osiągali wewnętrzne stany transcendentalne przez bardzo silne skupienie myśli i wyczerpanie fizyczne. Choć Stallman, jak inni hakerzy, unikał narkotyków, lubił "haj", który nadchodził pod koniec 20-godzinnego programowania w transie. + +Ale najwięcej radosnych emocji niosło uczucie samorealizacji. Hakerstwo było dla Stallmana rzeczą naturalną. Przyzwyczajony od dziecka do długiego nocnego ślęczenia nad książkami, bez trudu znosił wielogodzinną pracę prawie bez snu. Będąc społecznym wyrzutkiem już w wieku 10 lat, nie miał kłopotów z pracą w samotności. Jako matematyk z wrodzoną zdolnością logicznego myślenia i przewidywania posiadł doskonałą umiejętność rozwiązywania problemów, w których grzęzły myśli innych hakerów. + +"Był niezwykły - wspomina Gerald Sussman, wykładowca w MIT, niegdyś prowadzący badania w AI Lab. - Myślał jasno i jasno przedstawiał zamierzenia". To właśnie Sussman zatrudnił Stallmana na stanowisku asystenta naukowego w roku 1975. Projekt był złożony i AI Lab miało przygotować program analizujący diagramy obwodów. Wymagał nie tylko doskonałej znajomości poleceń Lispu, języka zbudowanego specjalnie dla potrzeb AI Lab, lecz również rozumienia i przewidywania, w jaki sposób różni ludzie mogą podchodzić do tego samego zagadnienia. + +Jeżeli praca przy wykonywaniu oficjalnych projektów, w rodzaju programu Sussmana do automatycznego analizowania obwodów, pozostawiała nieco wolnego czasu, zajmował się programowaniem dla przyjemności. Hakerską ambicją było ulepszanie oprogramowania wykorzystywanego w AI Lab, a największym zrobionym dla przyjemności projektem Stallmana był używany w tym czasie w laboratorium program edycyjny TECO. + +Historia jego pracy nad TECO w roku 1970 jest nierozerwalnie związana z późniejszym przywództwem ruchu wolnego oprogramowania. Był to historyczny etap komputerowej ewolucji, więc trzeba go omówić, choćby w zarysie. W latach pięćdziesiątych i sześćdziesiątych, gdy komputery zaczęły pojawiać się na uniwersytetach, programowanie było działaniem niezwykle abstrakcyjnym. Aby skomunikować się z maszyną, programista przygotowywał plik kart dziurkowanych, z których każda reprezentowała jakieś polecenie. Potem przygotowany plik oddawało się administratorowi centralnego systemu, który według kolejności umieszczał go w czytniku maszyny. W odpowiedzi komputer wypluwał nowy plik kart dziurkowanych, które programista musiał potem odcyfrować. Taki sposób działania, nazywany "procesem wsadowym", był niewygodny i czasochłonny. Był także denerwujący ze względów ambicjonalnych. Jedną z przyczyn wrodzonej hakerskiej awersji do centralizacji była władza dzierżona przez administratorów systemu, którzy decydowali o kolejności wykonywania jobów10. + +W roku 1962 naukowcy i hakerzy z MIT rozpoczęli realizację mającego zaradzić tej frustracji, projektu MAC11, z którego potem wyrosło AI Lab. Dzielenie czasu, z początku nazywane "kradzieżą czasu", pozwoliło wielu programistom jednocześnie korzystać z możliwości operacyjnych komputera. Interfejsy dalekopisowe pozwoliły na komunikowanie się z komputerem przez wpisywanie zwykłego tekstu, zamiast karmienia go stosem dziurkowanych kart. Programista mógł teraz wpisywać kolejne wiersze poleceń i odczytywać odpowiedzi generowane przez maszynę. + +W późnych latach sześćdziesiątych projektowanie interfejsów znacznie się rozwinęło. W słynnym wykładzie z roku 1968 Doug Engelbart, naukowiec ze Stanford Research Institute12, pokazał prototyp nowoczesnego interfejsu graficznego. Łącząc kablem telewizor z komputerem i przyczepiając dodatkowe narzędzie wskazujące, które nazwał myszą, stworzył system nawet bardziej interaktywny od opracowanego w MIT systemu dzielenia czasu. Traktując ekran wyświetlający jako rodzaj szybkiej drukarki, system Engelbarta pozwalał użytkownikowi na przesuwanie kursora po ekranie i uaktualnianie jego pozycji przez komputer w czasie rzeczywistym. + +Takie innowacje potrzebowały kolejnych dwóch dekad, by przeniknąć na rynek. W latach siedemdziesiątych rozpoczął się proces zastępowania dalekopisów przez terminale wyposażone w monitory, co dawało potencjalne możliwości korzystania wyświetlania obrazu na całym ekranie zamiast dotychczas stosowanej edycji linia po linii. + +Jednym z pierwszych programów, który korzystał z możliwości pełnoekranowego wyświetlania informacji, był TECO stworzony przez AI Lab w MIT. TECO (skrót od Text Editor and Corrector) był dokonaną przez hakerów adaptacją programu dalekopisowego działającego w systemie linia po linii na PDP-6. + +TECO stanowił istotny postęp w stosunku do edytorów starego typu, lecz nadal nie był wolny od wielu ich wad. Aby stworzyć i edytować dokument, programista musiał napisać szereg poleceń definiujących każdą zmianę edycyjną. Był to proces abstrakcyjny. W przeciwieństwie do współczesnych edytorów, uaktualniających tekst po każdym uderzeniu klawisza, aby coś zmienić, należało wpisać rozszerzony ciąg poleceń edytujących zakończonych dodatkowym ciągiem znaków oznaczającym "koniec polecenia". Z upływem czasu hakerzy nabrali wystarczającej wprawy, aby za pomocą tego narzędzia pisać całe dokumenty, ale Stallman przyznał później, że działanie to wymagało specjalnych uzdolnień i sprawności przypominających umiejętność gry w szachy z zawiązanymi oczami13. + +Aby ułatwić sobie pracę, hakerzy z AI Lab zbudowali system pozwalający na wyświetlanie tekstu w trybie "źródłowym" i "wynikowym" na dwóch częściach podzielonego ekranu. Innowacja była pożyteczna, ale kłopot sprawiało przełączanie się między trybami. + +W tym czasie TECO nie był jedynym pełnoekranowym monitorem. Podczas wizyty w Stanford Artificial Intelligence Lab14 w roku 1976 Stallman zobaczył edytor o nazwie E, którego cechą naturalną było uaktualnianie obrazu po każdym naciśnięciu klawisza. Zgodnie z nazewnictwem obowiązującym w roku 1970, był to jeden z pierwszych rudymentarnych edytorów typu WYSIWYG. Jest to skrót od "what you see is what you get15" i oznacza, że użytkownik może manipulować plikiem, przesuwając tekst do tyłu i do przodu, zupełnie inaczej niż w przypadku edytora, w którym wynik można zobaczyć dopiero na końcu16. + +Stallman był pod wrażeniem tego hakerskiego osiągnięcia i zastanawiał się, w jaki sposób po powrocie do MIT podobną funkcjonalność nadać TECO. Znalazł TECO wzbogacone o funkcję Ctrl-R napisaną przez Carla Mikkelsona i nazwaną tak od dwuklawiszowej kombinacji uruchamiającej, pozwalającej na przełączanie TECO z abstrakcyjnego trybu wykonywania poleceń w bardziej intuicyjny tryb reakcji na każde uderzenie klawisza. Stallman w subtelny ale znaczący sposób przekształcił tę funkcję. Umożliwił uruchamianie za pomocą kombinacji klawiszy innych poleceń tekstowych lub "makr". Trik Stallmana pozwalał na zapamiętanie raz napisanego polecenia i wielokrotne jego uruchamianie za pomocą kombinacji klawiszy. Rozwiązanie Mikkelsona podnosiło TECO na poziom WYSIWYG, a rozwiązanie Stallmana szło o jeden krok dalej, czyniąc z TECO programowalny edytor WYSIWYG. "To był przełom" - mówi Guy Steele, jeden z ówczesnych hakerów z AI Lab. + +Stallman pamięta, że wprowadzenie makr wywołało eksplozję następnych innowacji. "Każdy pisał własny zbiór ulepszonych poleceń edytora, dodając polecenia wykonania wszelkich czynności, które wydawały mu się potrzebne". Wspomina, że "ludzie puszczali je w obieg, by każdy mógł coś dodać lub ulepszyć, dzięki czemu polecenia te stawały się coraz potężniejsze i miały coraz większy zakres działania. Zbiór przedefiniowanych poleceń stawał się z wolna kolekcją programów tworzących cały system". + +Wprowadzenie makr okazało się bardzo przydatną innowacją. Tak wiele osób zaczęło wbudowywać makra do swych wersji TECO, że wkrótce w wyniku tej makromanii sam edytor stał się rzeczą mniejszej wagi. "Zaczęliśmy o nim myśleć raczej jak o języku programowania niż o edytorze" - mówi Stallman. Doświadczeni użytkownicy dla własnej przyjemności dopracowywali szczegóły i zgłaszali nowe pomysły. + +W dwa lata po tej eksplozji szybkość wprowadzania zmian zaczęła przynosić efekty uboczne. Skutkiem gwałtownego rozwoju było wiele zmian zwiększających wartość i funkcjonalność edytora, lecz także komplikujących go nadmiernie. "Mieliśmy do czynienia z efektem wieży Babel" - twierdzi Guy Steele. + +Jak twierdzi, groziło to zniszczeniem zamysłu leżącego u podstaw przedsięwzięcia. Zaprojektowany przez hakerów ITS17 ułatwiał dzielenie się wiedzą i wzajemne poprawianie tworzonych programów. Można było usiąść przy czyimś terminalu, otworzyć plik, nad którym pracował, i bezpośrednio w programie robić zmiany i komentarze. "Czasami, aby pokazać komuś, jak należy coś zaprogramować lub debuggować, najwygodniej było zrobić to bezpośrednio na jego terminalu" - tłumaczy Steele. + +Możliwość wprowadzania makr w drugim roku istnienia zaczęła przytłaczać edytor, czyniąc go nieprzydatnym. W swej gorliwości dodawania nowych cech pełnoekranowych hakerzy tak dalece przekształcali własne wersje TECO, że zasiadłszy do czyjegoś terminala trzeba było poświęcić około godziny na zorientowanie się, które makropolecenia do czego służą. + +Sfrustrowany Steele podjął się rozwiązania tego problemu. Zebrał razem cztery różne zbiory makr i zaczął kreślić schemat dokumentujący znaczenie najczęściej używanych makropoleceń. Przystępując do implementacji udokumentowanych cech, zainteresował przedsięwzięciem Stallmana. + +"Najpierw zaglądał mi przez ramię, pytając, co robię" - wspomina Steele. + +Dla Steele'a, spokojnego hakera, który rzadko bezpośrednio rozmawiał ze Stallmanem, wspomnienie tej rozmowy nadal jest żywe. Podglądanie przez ramię, co kto robi, było w AI Lab przyjętym zwyczajem. Stallman, główny opiekun TECO, uznał pracę Steele'a za interesującą i szybko przystąpił do jej skompletowania. + +"Jak już wielokrotnie mówiłem, wykonałem 0,001 procenta implementacji, a resztę wykonał Stallman" - wspomina Steele ze śmiechem. + +Nowa nazwa projektu, Emacs, była kurtuazyjnym gestem Stallmana, skrótem od ang. editing macros18, mającym przypominać ewolucyjny, transcendentny proces tworzenia makr w ciągu dwóch lat od eksplozji zainteresowania tym narzędziem. Było to również zapełnienie słownikowej luki, gdyż dotychczas nazwa żadnego programu pracującego w systemie ITS nie rozpoczynała się na literę "E". Wybierając Emacs, Stallman sądził, że pozwoli to na odwoływanie się do programu przez podawanie jedynie pierwszej litery nazwy. Po raz kolejny dała o sobie znać hakerska żądza maksymalnej efektywności. + +Rozwijając system standardowych makropoleceń, Stallman i Steele musieli wykonać polityczną akrobację na linie. Tworząc standardowy program, Stallman gwałcił fundamentalną hakerską zasadę "popieraj decentralizację". Musiał także wziąć w karby nieograniczoną dostępność czynienia wszelkich zmian, co było główną siłą napędową rozwoju TECO. + +"Z jednej strony staraliśmy się zbudować jednolity system poleceń, a z drugiej - nie zamykać drogi do wprowadzania innowacji, ponieważ programowalność była rzeczą bardzo ważną" - wspomina Stallman. + +Aby rozwiązać problem, Stallman, Steele i ich koledzy hakerzy David Moon i Dan Weinreib ograniczyli standaryzację jedynie do poleceń WYSIWYG, czyli sterujących sposobem wyświetlania tekstu na ekranie. Resztę wysiłku poświęcono na zachowanie tinkertoyowego19 stylu Emacsa, pozwalającego na rozszerzanie funkcjonalności programu. + +Przed Stallmanem stanął nowy trudny do rozwiązania problem: jeżeli użytkownicy będą dokonywać zmian, nie informując o tym innych, znów pojawi się efekt wieży Babel. Wracając do hakerskiej idei dzielenia się wszelkimi informacjami, umieścił w kodzie źródłowym oświadczenie określające zasady używania Emacsa. Każdy użytkownik mógł w programie dokonywać dowolnych zmian pod warunkiem udostępnienia reszcie społeczności wszystkich dokonanych rozszerzeń. Nazwał to "wspólnotą Emacs20". Tak jak TECO było czymś więcej niż edytorem, tak Emacs stał się czymś więcej niż programem. Dla Stallmana była to umowa społeczna. We wspomnieniu dokumentującym wczesną fazę projektu wyliczył zasady tego kontraktu. "EMACS był rozpowszechniany na podstawie zobowiązania do społecznego dzielenia się informacją, co oznaczało, że należało przesyłać informację o każdym wprowadzonym ulepszeniu, aby można je było włączyć do programu ku powszechnemu pożytkowi"21. + +Nie wszyscy akceptowali te warunki kontraktu. Gwałtowny rozwój trwał przez następną dekadę, co doprowadziło do powstania wielu emacsopodobnych programów o różnym stopniu zgodności z oryginałem. W kilku pochodzenie od stallmanowskiego oryginału zaznaczono w dowcipny sposób za pomocą nazw rekursywnych, np. Sine (Sine is not Emacs)22, Eine (Eine is not Emacs) i Zwei (Zwei was Eine initially)23. Jako przysięgły wyznawca hakerskiej etyki Stallman nie widział żadnego powodu, by za pomocą środków prawnych powstrzymywać to twórcze zamieszanie. Fakt, że niektórzy potrafią użyć czyjegoś programu, nieco go ulepszyć i udostępniać pod inną nazwą, uważał za zdumiewające nieprzestrzeganie dobrych obyczajów. + +Kolejny przykry incydent zakłócił rozwój hakerskiej społeczności. W roku 1979 Brian Reid zdecydował się na umieszczenie "bomby z opóźnionym zapłonem" w kodzie programu Scribe, umożliwiając firmie Unilogic ograniczanie dostępu do oprogramowania tym użytkownikom, którzy nie uiścili stosownej opłaty. Dla Stallmana była to złowieszcza zapowiedź przyszłych zdarzeń. "Uznał to za postępowanie w stylu nazistowskim, najgorsze, z jakim się spotkał" - wspomina Reid. Późniejsze zdobycie sławy współtwórcy internetowego Usenetu24 nie zmyło z Reida, przynajmniej w oczach Stallmana, hańby tamtej decyzji. "On twierdzi, że całe oprogramowanie powinno być wolne, a pomysł pobierania za nie opłaty jest zbrodnią przeciw ludzkości"25. + +Choć Stallman był bezsilny wobec prowadzonej przez Reida sprzedaży, udało mu się jednak ukrócić inne poczynania sprzeczne z hakerskim etosem. Jako główny depozytariusz kodu źródłowego wspólnoty Emacs zaczął politycznie wykorzystywać płynące stąd możliwości. Na ostatnich etapach konfliktu z administracją Laboratory for Computer Science w sprawie zabezpieczenia dostępu do systemu przez wprowadzenie haseł rozpoczął strajk polegający na odmowie przesyłania tym osobom najnowszych wersji Emacsa do czasu, aż zrezygnują z wprowadzenia zabezpieczeń. Ruch ten tylko trochę przyczynił się do utrwalenia jego reputacji ekstremisty, ale dał istotny efekt pośredni: wzniecił w społeczności dyskusję o podstawowych wartościach hakerskiej etyki. + +"Wiele osób wściekało się na mnie, twierdząc, że jestem do nich wrogo nastawiony lub że ich szantażuję, co w pewnym sensie było prawdą - Stallman opowiadał później Stevenowi Levy'emu. - Działałem przeciw nim siłą, ponieważ uważałem, że to, co robią, jest gwałtem zadawanym każdemu z nas26". + +Z upływem czasu Emacs stał się probierzem hakerskiej etyki. Zapewniona przez Stallmana elastyczność tego oprogramowania zachęcała do współpracy, nawet jej żądała. Użytkownicy, którzy nie nadążali za rozwojem Emacsa lub nie zgłaszali Stallmanowi wprowadzonych przez siebie poprawek, ryzykowali pominięcie przy informowaniu o kolejnym przełomie. A informacji przełomowych było dużo. Dwadzieścia lat później użytkownicy zmodyfikowali Emacsa na tak wiele sposobów, że bywa używany jako arkusz kalkulacyjny, kalkulator, baza danych i przeglądarka internetowa. To tylko fragment istnego potopu różnych zastosowań, świadczący o wielkiej wszechstronności tego oprogramowania. "To właśnie było naszym celem - twierdzi Stallman. - Wszystko, co zostało w tym zawarte, jest jednocześnie cudowne i straszne". + +Ocena innych ówczesnych współpracowników Stallmana z AI Lab jest znacznie łaskawsza. Hal Abelson, który jako student przed dyplomem współpracował ze Stallmanem w latach siedemdziesiątych, a potem wspierał go jako członek zarządu Fundacji Wolnego Oprogramowania, opisuje Emacs jako "twór błyskotliwy i doskonały". Twierdzi, że Stallman, dając możliwość dodawania własnych bibliotek i narzędzi bez wprowadzania bałaganu w ogólnej konstrukcji systemu, wytyczył drogę dalszego rozwoju projektów programistycznych opartych na prowadzonej na wielką skalę współpracy. "Jego struktura była wystarczająco krzepka, by wytrzymać ciężar luźnej współpracy ludzi z całego świata, wnoszących własne pomysły - powiada Abelson. - Nie sądzę, aby ktoś wcześniej dokonał czegoś podobnego"27. + +Guy Steele w podobny sposób wyraża uznanie. Obecny pracownik naukowy Sun Microsystems, pamięta Stallmana przede wszystkim jako "błyskotliwego programistę zdolnego do produkowanie olbrzymiej objętości bezbłędnych kodów". Choć ich osobowości niezbyt do siebie pasowały, współpracowali wystarczająco długo, by Steele wyrobił sobie zdanie o stallmanowskim intensywnym stylu programowania. Wspomina znaczący epizod z końca lat siedemdziesiątych, gdy postanowili wspólnie napisać funkcję "pięknego drukowania". Ta wymyślona przez Steele'a funkcja, uruchamiana za pomocą skrótu klawiszowego, powodowała przeformatowanie kodu źródłowego Emacsa, tak że stawał się czytelniejszy i zajmował mniej miejsca, co było rozszerzeniem możliwości WYSIWYG edytora. Była to funkcja o znaczeniu na tyle ważnym, by przyciągnąć uwagę Stallmana i wkrótce po napisaniu przez Steele'a wersji pierwotnej obaj postanowili zasiąść razem, by napisać wersję poprawioną. + +"Zaczęliśmy pracę pewnego ranka - wspomina Steele. - Ja przy klawiaturze, a on obok mnie. Ustąpił mi miejsca przy klawiaturze, ale koniecznie chciał dyktować, co mam pisać." + +Sesja trwała 10 godzin. Przez cały czas, jak twierdzi Steele, żaden z nich nie oderwał się od pracy ani na moment. Pod koniec "hak" był gotowy i nie przekraczał 100 linii kodu. "Przez cały czas moje palce były na klawiaturze - wspomina Steele, - ale wydawało się, że pomysły nas obu sprawnie spływały na ekran. On mówił, co mam pisać, a ja pisałem". + +To, jak długo trwała ta sesja, Steele uświadomił sobie dopiero, gdy w końcu opuścił AI Lab. Stając przed budynkiem na Tech Square 545 ze zdumieniem zobaczył, że otaczają go nocne ciemności. Był przyzwyczajony do programistycznych maratonów, ale w tej sesji było coś niezwykłego. Praca ze Stallmanem zmusiła go do odcięcia się od wszystkich bodźców zewnętrznych i skupienia całej mentalnej energii na wykonywanym zadaniu. Patrząc wstecz, uważa, że Stallman stapiał w jedno myśli swoje i partnera, napawając go jednocześnie radością i przerażeniem. "Gdy to się skończyło, pomyślałem, że choć było to wspaniałe doświadczenie, nie chciałbym go przeżywać ponownie." + + +Rozdział 7. +Trudny wybór moralny + +27 września 1983 roku programiści logujący się do usenetowej1 grupy net.unix-wizards natykali się na niezwykły komunikat. Wysłany tuż po północy, a ściślej o 00:30, sygnowany przez rms@mit-oz, w wierszu tematu zawierał zwięzłą lecz przyciągającą uwagę informację: "New UNIX implementation" (nowa implementacja Uniksa). Jednakże nie było to wprowadzenie do nowej wersji Uniksa - otwierający wiadomość akapit zawierał komunikat: + + Poczynając od Thanksgiving2, zamierzam rozpocząć pisanie pełnego, zgodnego z Uniksem systemu operacyjnego GNU (od Gnu's Not Unix), by udostępnić go wszystkim chętnym za darmo. Pilnie potrzebne jest wsparcie w postaci poświęconego czasu, pieniędzy, oprogramowania i sprzętu3. + +Dla doświadczonych twórców Uniksa brzmiało to jak mieszanina idealizmu i arogancji. Autor nie tylko przyrzekał zbudowanie od nowa w pełni funkcjonalnego systemu uniksowego, lecz również ulepszenie go w wielu miejscach. Zgodnie z zapowiedzią autora, nowy system GNU miał zawierać wszystkie zwyczajowe elementy - edytor tekstowy, program powłoki umożliwiający uruchamianie zgodnych z Uniksem aplikacji, kompilator i "parę innych rzeczy". Dodatkowo miał być wyposażony w kilka pożądanych elementów, których inne systemy uniksowe jeszcze wówczas nie oferowały: graficzny interfejs użytkownika, zaprogramowany w języku Lisp, odporny na załamania system plików i protokół sieciowy zbudowany zgodnie z wewnętrznym systemem sieciowym MIT. + +"GNU będzie pozwalał na uruchamianie programów uniksowych, ale nie będzie identyczny z Uniksem - pisał autor. - Na podstawie naszych doświadczeń z innymi systemami operacyjnymi dokonamy wszystkich przydatnych poprawek." + +Przewidując sceptycyzm części adresatów komunikatu, autor obok opisu systemu operacyjnego umieścił własną notę biograficzną zatytułowaną "Kim jestem?" + + Nazywam się Richard Stallman i jestem pomysłodawcą oryginalnego i często imitowanego edytora EMACS. Obecnie pracuję w Laboratorium Sztucznej Inteligencji w MIT. Brałem aktywny udział w pracach nad kompilatorami, edytorami, debuggerami, interpretatorami poleceń, a także systemem ITS (ang. Incompatible Timesharing System4) oraz systemem operacyjnym maszyn LISP5. Byłem jednym z pionierów tworzenia, niezależnych od terminali programów obsługi wyświetlania informacji w systemie ITS, a także wykonałem implementacje odpornego na załamania systemu plików oraz dwóch systemów okienkowych na maszynach lispowych. + +Jak było do przewidzenia, podana przez Stallmana nazbyt optymistyczna data rozpoczęcia projektu GNU nie została dotrzymana. Jednakże do stycznia 1984 roku Stallman rzeczywiście zaczął wypełniać daną obietnicę i stał się osobą znaczącą w środowisku twórców oprogramowania dla systemów uniksowych. Dla architekta oprogramowania, który wyrósł na systemie ITS, było to jak projektowanie sklepiku przez projektanta pałaców mauretańskich. Pomimo to budowanie systemu operacyjnego podobnego do Uniksa przynosiło ukryte korzyści. ITS był systemem potężnym, lecz miał swoją piętą achillesową: hakerzy z MIT zaprojektowali go, wykorzystując wiele cech charakterystycznych dla budowanych przez firmę DEC6 komputerów PDP. Gdy na początku lat osiemdziesiątych zarządzający AI LAB zdecydowali o usunięciu potężnego komputera PDP-10, stworzony przez hakerów system operacyjny w jednej chwili stał reliktem minionej epoki. Unix przeciwnie, został zaprojektowany z myślą o znacznej mobilności, miał przed sobą perspektywę o wiele dłuższego życia. W wersji pierwotnej stworzony przez młodych naukowców z AT&T7, wymknął się spod firmowej kontroli i zadomowił na dobre w zawsze biednym świecie komputerowych sieci akademickich. Dysponujący mniejszymi środkami niż ich koledzy z MIT, twórcy Uniksa przystosowali system do używania na przeróżnym sprzęcie: od 16-bitowych PDP-11 używanych w AI Lab do wykonywania pomniejszych zadań, po duże 32-bitowe komputery typu mainframe8, jak VAX 11/780. Przed rokiem 1983 kilka firm, łącznie z zasłużoną Sun Microsystems, przymierzało się do stworzenia nowej generacji mikrokomputerów zwanych stacjami roboczymi, które miały wykorzystywać możliwości nowego coraz bardziej powszechnego systemu. + +Aby ułatwić sobie zadanie, projektanci zasadniczej części Uniksa, nadający ogólny kierunek pracom, stworzyli między maszyną i systemem dodatkową abstrakcyjną warstwę. Hakerzy z AI Lab, tworząc system ITS maksymalnie wykorzystali możliwości sprzętu, zaś twórcy Uniksa zrezygnowali z przykrawania systemu operacyjnego do zasobów sprzętowych i wykorzystywania płynących stąd pożytków. Wszechstronność systemu przełożyli nad doraźne korzyści. Skupiając się bardziej na wprowadzeniu standardów i specyfikacji łączących różne elementy systemu niż na tworzeniu samych komponentów, stworzyli system, który mógł być szybko zmodyfikowany i dostosowany do "gustu" dowolnej maszyny. Jeżeli użytkownik miał kłopoty z jakąś częścią systemu, można ją było usunąć, naprawić albo wymienić na inną. Choć z tego powodu cierpiała estetyka systemu, zwiększało to jego elastyczność i opłacalność, gdyż łatwo było przystosować go do nowych wymagań9. + +Koniec ITS-a, wychuchanego i tak długo hołubionego przez hakerów z AI Lab, przyczynił się do podjęcia przez Stallmana decyzji o budowie nowego systemu GNU. Głęboko przeżył rozstanie z ITS-em. Po epizodzie z drukarką laserową Xeroksa był to kolejny dowód na to, że hakerska kultura AI Lab traci swą odporność na zewnętrzne działanie świata biznesu. + +Wraz z kodem tworzącym ITS zamarły korzenie, z których ten system wyrósł. W latach po zakończeniu wojny wietnamskiej znacznie zmniejszyły się wydatki na obronę, będące źródłem finansowania głównej części komputerowych prac badawczych. Desperacko poszukując nowych funduszy, laboratoria i uniwersytety zwróciły się do sektora prywatnego. W przypadku AI Lab pozyskanie prywatnych inwestorów nie było trudne. Gniazdo, w którym wykluło się wiele ambitnych powojennych projektów komputerowych, rychło stało się wylęgarnią nowych technologii. Zanim nastał rok 1980, wielu hakerów z AI Lab zaczęło dzielić czas między prace badawcze w instytucie i projekty komercyjne. + +To, co zdawało się dawać równe korzyści obu stronom, umożliwiając hakerom udział w najlepszych projektach i dostęp do najnowszych technologii, wkrótce okazało się diabelskim pomysłem. Im więcej czasu hakerzy poświęcali na awangardowe komercyjne projekty, tym mniej mogli go przeznaczać na utrzymanie wyrafinowanego oprogramowania samego AI Lab. Wkrótce firmy zaczęły bezpośrednio angażować hakerów, aby w pełni dysponować ich czasem i bez reszty skupić ich uwagę na interesujących je zagadnieniach. Z powodu zmniejszającej się liczby hakerów wszelkie zmiany i naprawy oprogramowania w laboratorium trwały coraz dłużej. Co gorsze, Stallman stwierdził, że nastąpiła zmiana pokoleniowa. Hakerzy, który dotychczas stanowili w AI Lab decydującą mniejszość, zaczęli się wykruszać, a liczba "profesorów i studentów nie pałających zbytnią miłością do PDP-10 pozostawała niezmieniona"10. + +Punktem przełomowym był rok 1982. Wtedy to administracja uczelni zdecydowała o wymianie PDP-10 na komputer nowej generacji. Firma Digital, dostawca PDP-10, zaprzestała produkcji komputerów z tej serii, ale zaoferowała potężny komputer mainframe o nazwie KL-10. Jednakże nowa maszyna wymagała poważnych przeróbek systemu ITS, gdyby hakerzy zdecydowali się na dalsze korzystanie z niego. Rzeczą straszną była utrata przez AI Lab intelektualnej masy krytycznej. Ubyło talentów programistycznych, a członkowie rady wydziału naciskali na zakup Twenexu, komercyjnego systemu operacyjnego stworzonego przez Digital. Nieliczni pozostali hakerzy musieli się dostosować. + +Rada wydziału orzekła, że "brak hakerów mogących utrzymać własny system może doprowadzić do nieszczęścia, więc koniecznie należy zakupić system komercyjny". Jak po latach wspomina Stallman, uznano, że "firma zapewni jego działanie". Potem okazało się, że nie mieli racji, ale było już za późno. + +Z początku hakerzy uznali Twenex za kolejny symbol autorytaryzmu, który aż się prosi o obalenie. Samo nazwanie systemu Twenexem było protestem przeciw niemu. Przez DEC nazywany oficjalnie TOPS-20, był następcą TOPS-10, komercyjnego systemu opracowanego dla komputerów PDP-10. Najpierw w firmie Bolt, Beranek & Newman11 powstała nowa, ulepszona wersja nazwana Tenex i na jej podstawie powstał TOPS-2012. "Temu systemowi było daleko do szczytów13, więc żadną miarą nie zamierzałem go tak nazywać, więc zdecydowałem wstawić "w" do nazwy Tenex i nazwać system Twenexem" - wspomina Stallman, który wymyślił nową nazwę. + +Maszyna, na której działał Twenex/TOPS-20, miała własne szydercze przezwisko: Oz, które wzięło się stąd, że jej terminale nie działały samodzielnie i każdy musiał być wsparty przez małe PDP-11. Jak podaje jedna z hakerskich legend, pewien haker, zobaczywszy po raz pierwszy to sprzężenie KL-10 z PDP-11, skojarzył informację wstępną wyświetlaną na ekranie z napuszonym oświadczeniem Czarnoksiężnika z Krainy Oz i zaczął nucić: "Jam jest wielki i potężny Oz. Nie zwracaj uwagi na małe PDP-11 ukryte za konsolą"14. + +Jeżeli hakerów rozbawiło pierwsze zetknięcie z KL-10, to miny im zrzedły po ujrzeniu systemu Twenex. Nie tylko wbudowano weń system zabezpieczeń, także wszystkie narzędzia i aplikacje zaprojektowano z myślą o zabezpieczeniach. Poprzednia zabawa w kotka i myszkę z hasłami wprowadzanymi przez Laboratorium Bezpieczeństwa Komputerowego teraz przekształciła się w totalną wojnę z systemem zarządzania. Administratorzy systemu argumentowali, że bez zabezpieczeń system Oz byłby narażony na częstsze załamania. Hakerzy twierdzili, że przed załamaniami systemu najlepiej można się zabezpieczyć przez gruntowne przejrzenie i poprawienie kodu. Niestety, liczba hakerów chętnych i zdolnych do wykonania tego zadania zmalała tak znacznie, że zwycięstwo administratorów stało się oczywiste. + +Zdobywając różnymi sposobami hasła i rozmyślnie doprowadzając do załamań systemu, by wśród szczątków poszukiwać dowodów, Stallman z powodzeniem udaremniał zapędy administratorów do przejęcia kontroli nad sprzętem. Po jednym udaremnionym coup d'etat wystosował ostrzeżenie do wszystkich pracowników AI Lab: + +"Została podjęta kolejna próba przejęcia władzy - pisał. - Na razie siły magnatów zostały pokonane". Aby ukryć swą tożsamość, ostrzeżenie podpisał "Radio wolny OZ". + +Niewielu to zmyliło. Do roku 1982 awersja Stallmana do haseł i tajności stała się powszechnie znana również poza AI Lab i ludzie z zewnątrz używali jego konta jako punktu wejścia do ARPANET-u, badawczej sieci komputerowej, która stała się fundamentem przyszłego Internetu. Jednym z takich "turystów" we wczesnych latach osiemdziesiątych był Don Hopkins, programista z Kalifornii. Uczył się on, czerpiąc obficie ze skarbnicy wiedzy, jaką był wychwalany system ITS, do którego można było wejść z zewnątrz, wpisując jako login inicjały RMS, a następnie te same trzy litery jako hasło. + +"Jestem dozgonnie wdzięczny MIT za to, że mogłem wraz z wieloma innymi korzystać za darmo z ich komputerów - mówi Hopkins. - Dla wielu ludzi miało to wielkie znaczenie." + +Była to tak zwana polityka "turystyczna" otwarcie tolerowana przez władze MIT w czasach systemu ITS15. Skończyła się, gdy Oz stał się głównym wejściem laboratorium do sieci ARPANET. Na początku Stallman nadal używał swego loginu również jako hasła, aby użytkownicy zewnętrzni mogli łatwo robić to samo. Jednakże z upływem czasu kruchość systemu Oz skłoniła administratorów systemu do zatamowania dostępu dla użytkowników z zewnątrz. Obawiano się, że przez czysty przypadek lub przez czyjąś złośliwość może dojść do pełnego załamania systemu. Gdy zażądano, by Stallman przestał podawać swoje hasło do publicznej wiadomości, on, powołując się na wyznawane przez siebie zasady etyczne, odmówił i zrezygnował z korzystania z komputera Oz. + +"Gdy hasła po raz pierwszy pojawiły się w AI Lab, nie zmieniłem zdania i nadal nie widziałem potrzeby ich stosowania - twierdził Stallman. - Ponieważ nie wierzę w konieczność chronienia zasobów komputera, nie mogłem wspierać wprowadzenia reżimu bezpieczeństwa". + +Jego odmowa dostosowania się do wymagań Oz była odzwierciedleniem, narastającego w ciągu lat osiemdziesiątych, napięcia między grupą hakerów i administracją AI Lab. Było to jednak niczym w porównaniu z konfliktem, który wybuchł wewnątrz samej społeczności hakerskiej. Jeszcze przed przybyciem KL-10 podzieliła się ona na dwa obozy. Pierwszy skupił się wokół firmy programistycznej Symbolics, Inc., drugi - wokół rywalizującej z nią Lisp Machines, Inc. (LMI). Obie firmy dążyły do wprowadzenia na rynek maszyny lispowej, narzędzia mającego służyć do pełnego wykorzystania pożytków płynących ze stosowania języka programowania Lisp. + +Stworzony przez Johna McCarthy'ego, pioniera badań nad sztuczną inteligencją, pracownika naukowego MIT w latach pięćdziesiątych, Lisp jest językiem programowania świetnie przystosowanym do wykonywania zadań wymagających skomplikowanego sortowania. Nazwa jest skrótem od LISt Processing16. Po odejściu McCarthy'ego do Stanford Artificial Intelligence Laboratory hakerzy z MIT dopracowali język, przekształcając go w lokalny dialekt MACLISP. "MAC" pochodziło od finansowanego przez DARPA17 projektu badawczego MAC18, z którego wyrosło AI Lab i Laboratory for Computer Science. Programiści z AI Lab pod kierownictwem arcyhakera Richarda Greenblatta, używając jedynie języka Lisp, zbudowali w latach siedemdziesiątych pełny system operacyjny, który nazwali Lisp Machine Operating System19. Do roku 1980 z projektu Lisp Machine powstały dwie firmy komercyjne: Symbolics kierowana przez Russela Noftskera, niegdyś administratora AI Lab, oraz Lisp Machines, Inc. z Greenblattem na czele. + +Oprogramowanie Lisp Machine zostało stworzone na zasadach hakerskich, co oznacza, że choć jego właścicielem pozostawało MIT, zgodnie z hakerskim obyczajem, mogło być swobodnie kopiowane. Taki system ograniczał korzyści rynkowe, które firmy miały nadzieję osiągnąć, uzyskując licencję od MIT i usiłując wprowadzić to oprogramowanie na rynek jako unikalne. Aby zarabiać, firmy dążyły do uzupełnienia systemu Lisp Machine dodatkowymi elementami, które mogły okazać się atrakcyjne dla użytkowników. Do tworzenia tych dodatków, powstających poza MIT, zatrudniały hakerów z AI Lab. + +Szczególnie agresywnie działała firma Symbolics. Do końca roku 1980 już 14 hakerów z AI Lab było tam zatrudnionych w roli konsultantów na części etatu, pracując nad rozwojem własnej wersji Lisp Machine. Reszta, za wyjątkiem Stallmana, wpierała LMI20. + +Z początku Stallman zaakceptował dążenie obu firm do komercjalizacji Lisp Machine, nawet gdyby miało to oznaczać więcej pracy dla niego. Obie firmy korzystały z licencji i kodu źródłowego Lisp Machine OS MIT i jego zadaniem było modyfikowanie tego kodu, aby dotrzymać kroku wszystkim zmianom wprowadzanym w firmach. Choć umowa Symbolics z MIT dawała mu prawo do przeglądania, ale nie do kopiowania kodu źródłowego, nadal "pożyczał" atrakcyjne wyimki na zasadzie "gentleman's agreement" i tradycyjnych zasad hakerskiego postępowania. + +Jednakże 16 marca 1982 roku - zapamiętał tę datę dokładnie, gdyż były to jego urodziny - zarząd Symbolics zerwał dżentelmeńską umowę. Był to ruch strategiczny. LMI, główny rywal na rynku maszyn lispowych, w znacznej mierze opierał działanie na kopii kodu źródłowego AI Lab Lisp Machine. Zamiast wspierać rywala, zarząd Symbolics zdecydował się na ściślejsze przestrzeganie zasad zapisanych w umowie. Jeżeli AI Lab chciało korzystać z osiągnięć Symbolics, powinno zainstalować system tej firmy i odciąć dostęp LMI do kodu źródłowego. + +Rozdrażniło to Stallmana jako osobę odpowiedzialną za uaktualnianie laboratoryjnego kodu Lisp Machine. Traktując to oświadczenie jako "ultimatum", zemścił się, odłączając mikrofalowe połączenie Symbolics z AI Lab. Przysiągł sobie nigdy nie dotykać kodu Symbolics i pozostać wierny współpracy z LMI. "Uważałem, że AI Lab jest tu krajem neutralnym, jak Belgia podczas I wojny światowej - twierdzi. - Jeżeli ktoś dokonuje inwazji na Belgię, jej rząd jest zmuszony ogłosić stan wojny z napastnikiem i sprzymierzyć się z Wielką Brytanią i Francją". + +Przebieg tej wojny "symbolicznej" ("Symbolics" War), trwającej w latach 1982-1983, zależy od źródła danych, czyli od tego, kto o niej opowiada. Gdy zarząd Symbolics zauważył, że zmiany wprowadzone przez jego firmę wciąż ukazują się w aktualizacjach AI Lab Lisp Machine, zdecydował się na zainstalowanie "szpiega" na terminalu Stallmana. Stallman twierdził, że wszystkie funkcje pisał od nowa, korzystając ze zgodnego z umową prawa przeglądania kodu i znosząc dodatkowe uciążliwości związane z koniecznością uczynienia kodu jak najmniej podobnym do oryginału. Zarząd Symbolics twierdził co innego i skierował zażalenie do administracji MIT. Zgodnie z wydaną w roku 1994 książką Harveya Newquista The Brain Makers: Genius, Ego, and Greed, and the Quest for Machines That Think21, administracja ostrzegła Stallmana, by "trzymał się z daleka" od projektu Lisp Machine22. Stallman twierdzi, że administracja go wsparła. "Niczym mnie nie straszono - mówi. - Robiłem zmiany jak dawniej. Aby się dodatkowo zabezpieczyć, przestałem czytać ich kod źródłowy. Czytałem tylko dokumentację i na jej podstawie wprowadzałem zmiany". + +Niezależnie od wyniku kłótnia utwierdziła Stallmana w jego postanowieniu. Bez kodu źródłowego uzupełniał braki systemu zgodnie z własnymi przekonaniami i smakiem oraz nakłonił innych w AI Lab do informowania go o wszelkich niedociągnięciach i błędach maszyny lispowej. Programistom z LMI zapewnił bezpośredni dostęp do wszystkich wprowadzanych zmian. "Zamierzałem ukarać Symbolics, nawet gdyby to miała być ostatnia rzecz, jaką zrobiłem" - twierdzi. + +To ważne stwierdzenie. Nie tylko rzuca światło na niepokorną naturę Stallmana, lecz również ujawnia poziom emocji, które towarzyszyły tej "wojnie". Zgodnie z inną historią opowiedzianą przez Newquista, Stallman był w pewnym momencie tak zirytowany, że wysłał e-mail: "Owinę się pasem z dynamitem i złożę wizytę w biurze Symbolics23". Choć Stallman twierdzi, że nie pamięta tego e-maila i że opowiadanie o nim jest jedynie zjadliwą złośliwością, przyznaje, że takie myśli krążyły mu po głowie. "Pamiętam fantastyczne pomysły zniszczenia siedziby Symbolics i legnięcia pod jej gruzami. Na szczęście moje życie było dla mnie ważniejsze"24. + +Jego rozpacz była wielka, gdyż jednocześnie obserwował zniszczenie tego, co uważał za "swój dom" - zwartej hakerskiej subkultury AI Lab. W e-mailowym wywiadzie udzielonym później Levy'emu ukazał siebie jako postać podobną do historycznego Ishi, ostatniego żyjącego członka Yahi, plemienia indiańskiego z północno-zachodniego wybrzeża Pacyfiku, które zostało wygubione podczas walk z Indianami w latach sześćdziesiątych i siedemdziesiątych XIX w. Ta analogia pozwalała opisywać jego przetrwanie w epickiej, niemal mitologicznej formie. W rzeczywistości był to jedynie przypisek do historii napięć powstających między nim i resztą hakerskiej społeczności AI Lab tuż przed rozłamem Symbolics-LMI. Wielu z jego kolegów widziało Symbolics nie jako złowieszczą siłę niszczącą, lecz raczej jako zbyt późno pojawiającą się alternatywną ofertę. Firma komercjalizująca Lisp Machine wygnała projektowanie oprogramowania z bezpiecznej izolacji, jaką było AI Lab, na otwarty komercyjny rynek, gdzie menadżerowie ustanawiali własne prawa. Niektórzy uważali Stallmana nie za bojownika trwającego na ważnym posterunku, lecz za przeżytek minionej epoki. + +Stallman nie wdaje się w dyskusje na temat alternatywnego widzenia tamtych zdarzeń. Jak twierdzi, była to kolejna, po postawieniu "ultimatum", przyczyna nasilająca jego wrogość do Symbolics. Wspomina, że jeszcze przed zatrudnieniem przez Symbolics większości hakerów z AI Lab ci, którzy później tam przeszli, unikali go. "Już mnie nie zapraszano do Chinatown - wspomina. - Zgodnie ze zwyczajem wprowadzonym przez Greenblatta, jeżeli ktoś wybierał się na obiad gdzieś na zewnątrz, puszczał o tym informację, szukając chętnych do towarzystwa. Gdzieś w latach 1980-1981 przestano mnie zapraszać. Nie tylko mnie nie zapraszano, lecz jak mi później ktoś opowiedział, na niego i innych wywierano nacisk, by kłamali i ukrywali przede mną, że inni wybierają się do restauracji". + +Czuł złość do hakerów zabawiających się tymi dziecinnymi postaciami ostracyzmu, zaś spór z Symbolics wywołał w nim wściekłość innego rodzaju, wściekłość tracącego dom na jego burzyciela. Gdy Symbolics wstrzymało wysyłanie zmian wprowadzanych w kodach, odpowiedział niemal ciągłym przesiadywaniem w AI Lab i tworzeniem kodów zmienianych funkcji od zera, jedynie na podstawie opisów. Jego frustracja zapewniła użytkownikom zewnętrznym Lisp Machine pełny otwarty dostęp do wszystkich zmian wprowadzanych przez Symbolics. + +Utrwaliło to także wewnątrz hakerskiej społeczności legendę Stallmana. Znany już z pracy nad Emacsem, teraz pokazał, że potrafi dotrzymać kroku całemu zespołowi programistów pracujących w Symbolics, a w grupie tej znajdowało się kilku hakerów o legendarnej sławie. Było to jedno z największych jednostkowych osiągnięć Wieku Informacji, a może innych wieków również. Steven Levy nazwał to "hakerskim majstersztykiem", a samego Stallaman określił jako "wirtualnego Johna Henry'ego". W swoich uwagach zapisał, że członkowie rywalizującej z nim grupy pracującej dla Symbolics, mogli mieć pretensję do swego byłego kompana, ale musieli czuć dla niego respekt. Levy cytuje Billa Gospera, hakera, który pracował dla Symbolics w oddziale w Palo Alto. Wypowiedź jest pełna podziwu dla pracy wykonywanej w tym czasie przez Stallmana: + + Gdy w tym, co zrobił Stallman, znajdowałem coś, co mogłem uznać za źle wykonane (a właściwie ktoś inny usilnie mnie przekonywał, że jest to źle wykonane), mogłem zawsze powiedzieć: "Poczekaj, on pracując po nocach, nie ma z kim tego omówić. Pracuje samotnie! To niemożliwe, aby taką pracę wykonywał jeden człowiek!"25 + +Dla Stallmana miesiące spędzone na dotrzymywaniu kroku zespołowi Symbolics są źródłem dumy i goryczy. Jako zdeklarowany liberał, którego ojciec walczył w II wojnie światowej, Stallman nie jest pacyfistą. Pod wieloma względami wojna z Symbolics stała się rytualnym przejściem tam, dokąd zmierzał od czasu przyłączenia się do grupy zespołu AI Lab przed dziesięcioma laty. Niestety, zbiegło się to z bolesnym rozpadem hakerskiej subkultury, która kształtowała jego naturę od wieku młodzieńczego. Pewnego dnia, gdy oderwał się od pisania kodu i przechodził przez biuro, natknął się na stojącą w kącie, już nieużywaną maszynę PDP-10. Było to dla niego traumatyczne przeżycie. Patrzenie na zamarłe lampki, które niegdyś błyskaniem informowały o stanie wewnętrznego oprogramowania, było dla niego przeżyciem podobnym do oglądania dobrze zakonserwowanych zwłok ukochanej osoby. + +"Widząc tę maszynę martwą, zacząłem płakać - wspomina. - Stojąca w kącie i przez wszystkich zapomniana, uświadomiła mi, jak dalece nasza społeczność została zniszczona". + +Miał niewiele okazji do narzekania. Lisp Machine, pomimo całej wrzawy i wściekłości, jakie wywołała, pomimo wysiłku, jakiego wymagało jej stworzenie, istniała jedynie gdzieś na skraju pola walki nowych rynkowych technologii. Niepowstrzymany bieg ku miniaturyzacji niósł nowe potężne mikroprocesory, a ich użycie stworzyło nowy świat sprzętu komputerowego i oprogramowania, który zaczął pochłaniać rozwiązania starszej generacji, jak rozrastająca się metropolia pochłania stare pustoszejące wioseczki rozsiane w jej okolicy. + +Na szczycie tej mikroprocesorowej fali napłynęły setki i tysiące nowych komercyjnych programów, z których każdy miał przypiętą metkę informującą o ograniczeniach licencyjnych uniemożliwiających hakerom przeglądanie, zmienianie i przekazywanie sobie kodów źródłowych. Na początku licencje były "grubo ciosane" i źle napisane, ale do roku 1983 zostały tak poprawione, że zaspokajały wymagania sądów i odstraszały potencjalnych intruzów. Oprogramowanie, które koncerny elektroniczne niegdyś uważały jedynie za dodatek do wytwarzanego przez nie kosztownego sprzętu, za dodatkową atrakcję, rodzaj deseru mającego przyciągnąć klientów, stało się teraz daniem głównym. Żądni nowych gier i funkcji użytkownicy wyzbyli się dawnego obyczaju analizowania przepisu po spożyciu posiłku. + +Nigdzie nie było to bardziej widoczne niż w dziedzinie systemów operacyjnych komputerów osobistych; Apple Computer i Commodore zarabiały miliony, sprzedając maszyny z wbudowanymi systemami operacyjnymi. Większość użytkowników nie protestowała, nie otrzymując przy zakupie plików z kodami źródłowymi, gdyż nie zdawała sobie sprawy z zasad hakerskiej kultury i niechęci tego środowiska do oprogramowania sprzedawanego wyłącznie w postaci binarnej. Niewielu anarchistycznych zwolenników hakerskiej etyki starało się ją upowszechniać w nowym rynkowym świecie, ale większość z tego zrezygnowała, gdyż rynek wynagradzał tych, którzy szybko pisali nowe programy i wykazywali zmysł handlowy nakazujący opatrywanie wyników pracy klauzulami ochrony praw autorskich. + +Prym w tej dziedzinie wiódł Bill Gates, o dwa lata młodszy od Stallmana absolwent Harvardu. Stallman, wysyłając swoje przesłanie do grupy dyskusyjnej net.unix-wizards, nie wiedział, że przed siedmiu laty Gates, wówczas początkujący przedsiębiorca i główny udziałowiec założonej w Albuquerque firmy programistycznej Micro-Soft, później zmienione na Microsoft, wystosował swoją własną odezwę do posiadaczy komputerów osobistych. Była to odpowiedź skierowana do użytkowników PC-tów kopiujących oprogramowanie tworzone przez Micro-Soft. List otwarty do hobbystów Gatesa odzierał ze złudzeń społeczny ruch twórców oprogramowania. + +"Kto w pocie czoła zechce wykonywać profesjonalną pracę za nic? - pytał Gates. - Jaki hobbysta poświęci trzy lata na programowanie, wynajdywanie błędów, tworzenie dokumentacji po to, by rezultat oddać innym za darmo?26" + +Niewielu hakerów z AI Lab czytało przesłanie Gatesa z 1976 roku, ale i bez tego byli świadomi odmiennego nastawienia do oprogramowania firm komercyjnych i nastawionych komercyjnie twórców oprogramowania. Dlaczego traktować oprogramowanie jako coś, co nic nie kosztuje, skoro rynek mówi inaczej? Lata siedemdziesiąte były wstępem do lat osiemdziesiątych i sprzedaż oprogramowania stawała się coraz częściej czymś więcej niż zwykłe odzyskiwanie poniesionych kosztów; zaczęła się przeradzać w manifest polityczny. W czasach, gdy administracja Reagana przystąpiła do demontażu federalnych regulacji prawnych i programów wsparcia finansowego - będących spadkiem jeszcze po czasach wielkiego kryzysu - część hakerów uznała wyzute z konkurencyjności zasady hakerskiej etyki za antyamerykańskie. W najlepszym razie zaczęto je traktować jako antykorporacyjny balast z epoki późnych lat sześćdziesiątych i lat siedemdziesiątych. Jak bankier z Wall Street, znajdujący w szafie z dwurzędowymi garniturami starą koszulę w ciapki i bez kołnierzyka, wstydliwie ukrytą wśród nowych koszul z kołnierzykami i francuskimi mankietami, tak wielu programistów z zakłopotaniem wspominało zasady hakerskiej etyki jako echo dawnej idealistycznej epoki. + +Dla człowieka, który przez całą dekadę lat sześćdziesiątych stanowił kłopotliwe wspomnienie lat pięćdziesiątych, nie miało znaczenia niedotrzymywanie kroku rówieśnikom. Jako programista przywykły do pracy na najlepszym sprzęcie i oprogramowaniu, stanął przed "trudnym wyborem moralnym": albo porzuci swoje ideowe zastrzeżenia dotyczące oprogramowania "własnościowego", jak on i jego koledzy-hakerzy określali wszelkie oprogramowanie opatrzone klauzulą prywatnych praw autorskich lub ograniczającą prawo kopiowania i modyfikowania kodu licencją końcowego użytkownika, albo poświęci się budowaniu alternatywnego systemu operacyjnego i oprogramowania użytkowego rozpowszechnianego bez ograniczających praw własności. Po ostatnich miesiącach bolesnych doświadczeń walki z Symbolics miał większą ochotę na drugie rozwiązanie. "Zakładam, że mógłbym w ogóle przestać zajmować się komputerami i pomimo braku zdolności w tym kierunku, zostać kelnerem. Może nie w modnej restauracji, ale gdzieś by mnie chyba zatrudnili." + +Zostanie kelnerem i porzucenie na stałe programowania, które przyniosło mu tyle przyjemności, mogło dla niego oznaczać rezygnację z wszelkiej aktywności. Patrząc wstecz na swe życie od czasu przeprowadzki do Cambridge, mógł łatwo rozpoznać długie okresy, w których pisanie programów było czystą przyjemnością. Zatem zamiast je porzucać postanowił zająć się nim jeszcze intensywniej. + +Jako ateista odrzucał takie pojęcia jak los, dharma27 i wezwanie Opatrzności do podjęcia zadania. Pomimo to nie sądził, aby decyzja odrzucenia oprogramowania z prawami własności i budowania systemu operacyjnego tylko w celu ułatwienia życia innym była czymś normalnym. To połączenie własnego uporu, zdolności przewidywania i mistrzostwa w pisaniu programów pchało go na ścieżką zbaczającą z głównej drogi, ścieżkę, której istnienia inni nawet nie zauważali. W roku 1999 w rozdziale książki Open Sources28, wyjaśniając motywy decyzji, powołuje się na słowa żydowskiego mędrca Hillela: + + Jeżeli nie istnieję dla samego siebie, któż istnieć będzie dla mnie? + Jeżeli istnieję tylko dla siebie, kimże jestem? + Jeżeli nie teraz, to kiedy?29 + + If I am not for myself, who will be for me? + If I am only for myself, what am I? + If not now, when?30 + +Przemawiając publicznie, unika odwołań religijnych i wyjaśnia swą decyzję w sposób bardziej pragmatyczny. "Spytałem siebie: w jaki sposób ja, twórca systemów operacyjnych, mogę poprawić sytuację? Po rozważaniu sprawy doszedłem do wniosku, że właśnie ktoś tworzący systemy operacyjne jest osobą najbardziej pożądaną do rozwiązania tego problemu". + +Gdy ostatecznie podjął decyzję, wszystko inne znalazło swe właściwe miejsce. Mógł powstrzymać się od korzystania z programów, które zmuszały go do kompromisów etycznych, i poświęcić życie tworzeniu oprogramowania, które miało ułatwić innym pójście w jego ślady. Przyrzekłszy, że stworzy ogólnodostępny system operacyjny lub, oczywiście w późnym wieku, "umrze pracując nad nim", w styczniu 1984 roku zrezygnował z pracy w MIT i przystąpił do tworzenia GNU. + +Rezygnacja pozbawiła go wsparcia MIT, ale wciąż miał wystarczającą liczbę przyjaciół w AI Lab, by zapewnić sobie wolny dostęp do pracowni uczelni. Mógł także liczyć na czasowe zatrudnienie w roli zewnętrznego konsultanta, co stanowiło wsparcie we wczesnym okresie projektu GNU. Rezygnacja z pracy w MIT zakończyła wszystkie dyskusje na temat konfliktu interesów i praw własności tworzonego oprogramowania. Człowiek, którego strach przed społeczną izolacją w okresie dorastania wciskał coraz głębiej w środowisko AI Lab, teraz postanowił odciąć się od niego murem. + +Przez kilka pierwszych miesięcy pracy odizolował się także od społeczności uniksowej, choć jego obwieszczenie wysłane do grupy net.unix-wizards wywołało sympatyczny odzew i kilku wolontariuszy zgłosiło chęć udziału w krucjacie już we wczesnym jej stadium. + +"Reakcja społeczności była dość jednolita - wspomina Rich Morin, w tym czasie lider grupy użytkowników Unixa. - Ludzie mówili: To wspaniały pomysł. Pokaż nam kod. Pokaż, że to można zrobić" + +Jako rasowy haker Stallman zaczął od poszukiwań istniejących programów i narzędzi, które nadawałyby się do przekształceniu w programy i narzędzia GNU. Na samym początku zwrócił uwagę na kompilator o nazwie VUCK, przekształcający programy napisane w języku C w kod czytelny dla maszyny. W tłumaczeniu z holenderskiego akronim nazwy oznaczał Free University Compiler Kit31. Pełen optymizmu zapytał autora programu, czy zestaw jest wolnym oprogramowaniem. Został poinformowany, że "Free University" oznacza Vrije Universiteit in Amsterdam, co bardzo go rozgoryczyło. + +"Odpowiedział szyderczo, że uniwersytet jest wolny, ale jego oprogramowanie nie - wspomina Stallman. - Tak więc zdecydowałem, że pierwszym programem, który napiszę dla projektu GNU, będzie wielojęzyczny i działający na wielu platformach kompilator". + +Ostatecznie znalazł kompilator języka Pastel napisany przez programistów z Lawrance Livermore National Lab. Zgodnie z jego ówczesną wiedzą, kompilator był oprogramowaniem wolnym i mógł być swobodnie kopiowany i modyfikowany. Niestety, miał jedną istotną wadę: każdy program w całości zapamiętywał w pamięci operacyjnej, zmniejszając obszar dostępny dla innych działań. To co dla wielkich komputerów mainframe było dopuszczalne, dla Uniksa stało się paraliżującą barierą, gdyż maszyny sterowane tym systemem były za małe i miały za małą pamięć do całościowej obsługi generowanych plików. Istotnym postępem było dobudowanie przez niego nakładki/interfejsu zgodnego z językiem C. Jednakże przed nadejściem lata zdecydował się na napisanie nowego kompilatora od podstaw. + +We wrześniu 1984 roku uznał napisanie kompilatora za zadanie do wykonania w najbliższym czasie i rozpoczął poszukiwania narzędzi niskiego poziomu. Zaczął także rozwijać wersję GNU Emacsa, programu, którego rozwój nadzorował przez dekadę. Była to decyzja strategiczna. Społeczność uniksowa używała w tym czasie dwóch edytorów; jednym był vi napisany przez Sun Microsystems wraz Billem Joyem, a drugim ed, stworzony przez pracującego dla Bell Labs naukowca Kena Thompsona (współtwórcę Uniksa). Oba były przydatne i popularne, ale żaden nie miał rozszerzalnej w nieskończoność natury Emacsa. Przygotowując Emacsa dla użytkowników Uniksa, Stallman miał doskonałą okazję do pokazania swej programistycznej biegłości. Była to także okazja przystosowania użytkowników Emacsa do stallmanowskiego sposobu myślenia. + +Patrząc wstecz, twierdzi że wówczas nie widział strategicznych aspektów swojej decyzji. "Chciałem mieć Emacsa i była po temu doskonała okazja" - powiada. + +Było to częściowo ponowne "odkrywanie Ameryki", przynajmniej tak to odczuwała jego hakerska wrażliwość. Pisząc uniksową wersję Emacsa, wkrótce wkroczył na ścieżkę, którą przed nim wydeptał James Gosling, student starszych lat w Cernegie Mellon, autor opartej na języku C wersji Emacsa, nazwanej GOSMACS. Wersja Goslinga zawierała interpreter korzystający z uproszczonej wersji języka Lisp, zwanej MOCKLISP. Zdecydowany na zbudowanie GNU Emacsa na podobnych lispowych podstawach, Stallman korzystał obficie z innowacji Goslinga. Gosling opatrzył GOSMACS-a klauzulą copyrightu i sprzedał prawa prywatnej firmie UniPress, ale Stallman cytował współtwórcę programu, który twierdził, że Gosling, jeszcze jako doktorant w Carnegie Mellon, zapewniał współpracowników, że ich praca pozostanie dostępna dla wszystkich. Jednakże UniPress, dowiedziawszy się o projekcie Stallmana, zaczął straszyć egzekwowaniem copyrightu. Stallman ponownie stanął przed koniecznością pisania wszystkiego od podstaw. + +Stosując inżynierię wstecz32, mógł na podstawie interpretatora Goslinga stworzyć w pełni funkcjonalny interpreter Lispu i ominąć sporny punkt używania interpretera Goslinga. Niemniej jednak rozjątrzył go bardzo sam pomysł sprzedaży przez twórców oprogramowania praw do niego. Podczas przemówienia w Szwedzkim Królewskim Instytucie Technologicznym w roku 1986 przytaczał zdarzenie z UniPressem jako jeszcze jeden przykład niebezpieczeństw dotyczących oprogramowania z ograniczonymi prawami własności. + +"Czasami myślę, że najlepszą rzeczą, jakiej mógłbym w życiu dokonać, byłoby zebranie w jeden stos całego oprogramowania z prywatnymi prawami własności i zawartymi tam tajemnicami handlowymi i rozdawanie kopii na rogu ulicy wszystkim chętnym. W ten sposób tajemnice przestałyby być tajemnicami - twierdzi. - Być może byłby to o wiele efektywniejszy sposób udostępnienia ludziom wolnego oprogramowania niż pisanie go od podstaw; ale wszyscy jesteśmy na to zbyt tchórzliwi". + +Pomimo stresu, jaki wywoływała, dysputa na temat innowacji Goslinga miała towarzyszyć Stallmanowi i ruchowi wolnego oprogramowania przez dłuższy czas. Zmusiła Stallmana do rozpoznania słabości społeczności Emacs i systemu wzajemnego zaufania, który zezwalał na powstawanie odgałęzień o problematycznej wartości. Skłoniła go także do wyraźniejszego sformułowania celów politycznych ruchu wolnego oprogramowania. Po udostępnieniu GNU Emacsa w roku 1995 wydał Manifest GNU (GNU Manifesto) będący rozszerzeniem oryginalnego przesłania z września 1983 roku. Włączył do dokumentu długi rozdział, w którym wyliczył argumenty przytaczane przez komercyjnych i akademickich programistów na usprawiedliwienie rozpowszechniania oprogramowania z prywatnymi prawami własności. Jeden argument: "Czyż programistom nie należy się nagroda za ich kreatywność" wywołał jego wściekłość spowodowaną ostatnim epizodem z goslingową wersją Emacsa: + +"Jeżeli cokolwiek wymaga nagrody, to tylko działanie dla dobra ogółu - odpowiadał. - Może nim być również kreatywność, ale tylko wtedy (sic!), gdy społeczeństwo może swobodnie korzystać z jej owoców. Jeżeli programiści żądają nagrody za tworzenie innowacyjnych programów, powinni też żądać nakładania kar za ograniczanie możliwości korzystania z rezultatów swej pracy"33. + +Pojawienie się GNU Emacs oznaczało, że projekt GNU ma wreszcie do pokazania jakiś kod. Towarzyszyły temu zwykłe trudności związane z przedsięwzięciem programistycznym. W miarę jak uniksowi twórcy zaczęli się interesować i zajmować nowym programem, zaczęły napływać pieniądze, podarunki i prośby o przesłanie taśm. Do zajmowania się biznesową stroną projektu GNU Stallman wciągnął kilku kolegów i stworzył Fundację Wolnego Oprogramowania (ang. Free Software Foundation - FSF), organizację pozarządową, której celem miało być wspieranie projektu i umożliwianie mu szybszego osiągania celów. Ze Stallmanem jako prezesem i grupą hakerów w roli członków zarządu fundacja stała się oficjalnym przedstawicielem projektu GNU. + +Robert Chassell, pracujący wówczas w Lisp Machines, Inc., w wyniku rozmowy ze Stallmanem podczas obiadu został jednym z pięciu członków zarządu. Został także skarbnikiem organizacji, która to rola, z początku niewielka, zaczęła szybko nabierać większego znaczenia. + +Wspomina: "W roku 1985 nasze całkowite przychody i wydatki zamykały się w kwocie 23 000 dolarów. Richard miał swoje biuro, z którego my również korzystaliśmy. Wszystkie nasze dobra, a zwłaszcza taśmy upychałem pod biurkiem. Tak było do czasu, aż LMI użyczyło nam na kredyt pewnej przestrzeni do magazynowania tego, co posiadaliśmy, łącznie z taśmami." + +Fundacja Wolnego Oprogramowania poza rolą oficjalnego przedstawicielstwa projektu zaczęła również stanowić punkt przyciągający wszystkich rozczarowanych programistów. Rynek uniksowy, choć w początkowym okresie projektu GNU jeszcze dość otwarty, zaczynał się już stawać coraz bardziej konkurencyjny. Starając się zwiększyć uzależnienie klientów, firmy zaczynały ograniczać ich dostęp do kodów źródłowych, co z kolei przyspieszało liczbę poszukujących oprogramowania dostarczanego przez projekt GNU. Wielcy magowie Uniksa, którzy niegdyś uważali Stallmana za krzykliwego przygłupa, ogłosili go teraz programistyczną Kasandrą. + +"Wielu ludzi, póki im się to nie przytrafiło, nie uświadamiało sobie, jak frustrujące może być odebranie programu, nad którym się pracowało latami - mówi Chassell, podsumowując odczucia i opinie wielu piszących w ciągu lat do Fundacji Wolnego Oprogramowania. - Gdy się to stanie, zaczynasz mówić do siebie Zaraz, zaraz, poczekajcie". + +Do decyzji Chassella o udziale w ruchu wolnego oprogramowania przyczyniła się osobista strata. Przed zatrudnieniem się w LMI jako wynajęty pracownik napisał książkę wprowadzającą do Unixa dla Cadmus, Inc., firmy programistycznej z Cambridge. Gdy firma upadła, grzebiąc wraz z sobą prawa autorskie do książki, Chassell chciał te prawa odkupić, ale bez rezultatu. + +"Ta książka wciąż tkwi na jakiejś półce, bezużyteczna, niedostępna do skopiowania, pochłonięta przez system - mówi Chassell. - O ile jestem w stanie ocenić własną pracę, mogę powiedzieć, że jest to całkiem niezły wstęp. Przez jakieś trzy lub cztery miesiące można by było go przekształcić we wprowadzenie do dzisiejszego GNU/Linuksa. Całe zdobyte doświadczenie, oprócz tego, co pozostało w mojej pamięci, zostało stracone". + +Zmuszony do oglądania swej pracy ginącej bez śladu, gdy jego poprzedni pracodawca walczył ze zbliżającym się bankructwem, Chassell odczuł na własnej skórze, że wściekłość mogła doprowadzić Stallmana niemal do apopleksji. "Stało się dla mnie jasne, że jeżeli chcę przyzwoicie przeżyć życie, nie mogę pozwalać na przetrzymywanie żadnej jego cząstki w zamknięciu - mówi Chassell. - Rzecz w tym, by zachować wolność wprowadzania zmian i poprawek, gdy chcemy to robić. Daje to poczucie radości, że coś, co tworzyliśmy przez kilka lat życia, ma jakąś wartość. Bez tego mamy wrażenie, że coś zostało nam odebrane i wyrzucone, a przynajmniej, że nie mamy już z tym żadnego kontaktu. Jest to utrata cząstki życia". + + +Rozdział 8. +Św. IGNUcy + +Maui High Performance Computing Center1 mieści się w jednopiętrowym budynku na zapylonych czerwonawych wzgórzach nad miastem Kihei. Otoczone przez warte miliony dolarów krajobrazy i ekskluzywną posiadłość Silversword Golf Course2, centrum wygląda na ośrodek naukowy zbudowany tu jedynie w celu marnotrawienia pieniędzy. Dalekie od pudełkowej i sterylnej ciasnoty Tech Square, a nawet rozciągniętych szeroko naukowych metropolii Argonne3 w Illinois i Los Alamos4 w Nowym Meksyku - MHPCC wygląda jak miejsce, w którym naukowcy więcej czasu poświęcają na opalanie się niż na swoje postdoktoranckie projekty badawcze. + +Jest to prawdą tylko w połowie. Choć naukowcy z MHPCC rzeczywiście korzystają z możliwości rekreacji, pracę swą traktują poważnie. Według serwisu internetowego Top500.org śledzącego działanie najpotężniejszych superkomputerów na świecie, superkomputer IBM SP Power3, działający w MHPCC i wykonujący 837 miliardów operacji zmiennoprzecinkowych na sekundę, jest jednym z 25 najpotężniejszych komputerów na świecie. Jako wspólna własność University of Hawaii i U.S. Air Force dzieli swoje cykle pracy między rozgryzanie wojskowych problemów obliczeniowych sił lotniczych i wyliczenia związane z pracami badawczymi w dziedzinie fizyki wysokich energii. + +MHPCC jest miejscem, gdzie wysoka kultura badań naukowych i inżynierii w spokojnej równowadze współistnieje z kulturą wysp hawajskich. Slogan ze strony internetowej z roku 2000 określił to jako "Obliczenia komputerowe w raju". + +Nie jest to miejsce, w którym moglibyśmy spodziewać się znaleźć Richarda Stallmana, człowieka, który spoglądając przez biurowe okno na przepiękny Maui Channel, mruczał cierpko: "Za dużo słońca". Jednakże przybył tu jako emisariusz mający przekazać przesłanie z innego komputerowego raju, musiał więc pogodzić się z wystawieniem na tropikalne słońce swej bladej skóry hakera. + +Gdy przyjechałem tam, aby wysłuchać przemówienia Stallmana, sala konferencyjna już przed czasem była wypełniona. Podział audytorium według płci był nieco, choć niewiele, lepszy niż w Nowym Jorku: 85% mężczyzn i 15% kobiet, z czego około połowa ubrana w spodnie koloru khaki i koszulki z golfowym logo. Resztę stanowili miejscowi z twarzami w ciemnym kolorze ochry, odziani w krzykliwie kwieciste koszule, tak popularne w tej części świata. Jedynym resztkowym wskaźnikiem ich statusu komputerowców były gadżety: telefony komórkowe Nokia, Palm Piloty5 i laptopy Sony VAIO. + +Nie trzeba dodawać, że Stallman stojący przed słuchaczami w niebieskim, jednobarwnym T-shircie, luźnych, brązowych poliestrowych spodniach i białych skarpetkach, odróżniał się od nich jak kciuk od reszty palców. Fluorescencyjne światła sali konferencyjnej podkreślały niezdrowy kolor jego nieprzywykłej do słońca skóry. Jego broda i długie włosy wywołałyby krople potu na najchłodniejszym hawajskim karku. Nawet wytatułowanie sobie na czole napisu "mainlander6" nie wyróżniałoby go bardziej wśród zebranych. + +Gdy Stallman bezczynnie przechadzał się na przodzie sali, kilku słuchaczy, ubranych w T-shirty z logo Manui FreeBSD Users Group7 (MFUG), śpiesznie ustawiało kamerę i sprzęt audiowizualny. FreeBSD to wolne oprogramowanie będące odgałęzieniem Berkeley Software Distribution, poważanej w latach siedemdziesiątych akademickiej wersji Uniksa. Pod względem technicznym jest konkurentem systemu operacyjnego GNU/Linux. Nadal w hakerskim świecie wszystkie wystąpienia Stallmana są rejestrowane z zapałem archiwistów-amatorów Grateful Dead8. Członkowie MFUG kierującego lokalnym ruchem wolnego oprogramowania otrzymali zadanie utrwalenia wszystkich złotych okruchów mądrości RMS9 i przekazania ich braci programistycznej w Hamburgu, Bombaju i Nowosybirsku. + +Analogia z Grateful Dead jest właściwa. Często opisując poczynania biznesowe zgodne z modelem wolnego oprogramowania, Stallman podaje jako przykład Grateful Dead. Rezygnując z ograniczania możliwości nagrywania przez fanów koncertów na żywo, zespół ten stał się czymś więcej niż tylko grupą rockową. Stał się ośrodkiem odrębnej społeczności, wspólnoty wyznawców jego muzyki. Z upływem czasu wspólnota ta stała się tak wielka i tak oddana, że grupa zaczęła unikać kontraktów nagraniowych i poświęciła się jedynie objazdom i koncertom na żywo. W czasie ostatniego turnee w roku 1994 za bilety zebrano sumę 52 milionów dolarów. + +Z tym sukcesem mogłoby się mierzyć kilka firm programistycznych, ale wspólnotowy aspekt społeczności wolnego oprogramowania spowodował, że w drugiej połowie lat dziewięćdziesiątych część z nich zaczęła przyznawać, że publikowanie kodu źródłowego może być dobrym pomysłem. Mając nadzieję na stworzenie rzeszy lojalnych użytkowników, takie firmy jak IBM, Sun Microsystems i Hewlett Packard zaczęły przestrzegać formy, jeżeli nie ducha, stallmanowskiego przesłania. Uznając GPL10 za Magna Carta11 technologii przemysłu informatycznego, redaktor kolumny programistycznej w ZDNet12, Evan Leibovitch, opisał rosnący wpływ GNU i uznał, że to coś więcej niż okresowy trend. "Ten ruch społeczny pozwala użytkownikom ponownie decydować o przyszłych poczynaniach - pisze Leibovitch. - Tak jak Magna Carta dała prawa poddanym brytyjskim, tak GPL wzmacnia prawa i wolność konsumentów za pomocą oprogramowania udostępnianego użytkownikom"13. + +Wspólnotowo-plemienny aspekt społeczności wolnego oprogramowania pomaga wyjaśnić, dlaczego 40 dziwaków programistów przybyło na konferencję, by posłuchać Stallmana, zamiast pracować nad swymi projektami z dziedziny fizyki lub surfować po sieci, tworząc znaczące raporty. + +Inaczej niż w trakcie przemówienia w Nowym Jorku, tym razem Stallman zaczął bez wstępu i bez przedstawienia się. Gdy członkowie FreeBSD wreszcie uporali się ze sprzętem, po prostu zrobił kilka kroków do przodu i zaczął mówić, tłumiąc inne głosy w sali. + +"W większości przypadków w rozważaniach, jakie prawa powinny rządzić używaniem oprogramowania, uczestniczą ludzie z firm programistycznych, którzy rozważają problem z dogodnego dla nich punktu widzenia - powiedział, rozpoczynając wystąpienie. - Rozmyślają, jakie zasady należy narzucić wszystkim, by płacili im masę pieniędzy. Dobry los pozwolił mi w latach siedemdziesiątych należeć do społeczności programistów, która wspólnie korzystała z oprogramowania i użyczała go innym. I dlatego zawsze spoglądam na to samo zagadnienie z innej strony i pytam: jaki rodzaj praw może umożliwić stworzenie dobrego społeczeństwa, dobrego dla ludzi, którzy je stanowią? Z tego powodu dochodzę do zupełnie innych odpowiedzi." + +Jak zawsze, przytoczył swą opowieść o drukarce laserowej, we właściwym momencie uzupełniając wypowiedź gestem wyciągniętej ręki wskazującej w tłum słuchaczy. Poświęcił także chwilę na wyjaśnienie nazwy GNU/Linux. + +"Niektórzy pytają mnie Po co tyle starań o zdobycie zaufania do tego systemu? Najważniejsze, że robota została zrobiona, a nie to, czy ludzie się o tym dowiedzą. Rada byłaby dobra, gdyby była prawdziwa, ale zadaniem nie było samo zbudowanie systemu, lecz jego rozpowszechnienie wśród użytkowników komputerów. Aby to było możliwe, musimy zrobić wszystko, aby wszelkie działania na komputerze można było wykonać za darmo, tzn. aby oprogramowanie było wolne.14 i 15" + +"Jest jeszcze wiele do zrobienia" - dodał. + +Dla niektórych słuchaczy były to informacje dobrze znane, dla innych trąciły wiedzą tajemną. Gdy jeden ze słuchaczy w koszulkach golfowych zaczął przysypiać, Stallman zamilkł i poprosił, by ktoś przebudził usypiającego. + +"Ktoś kiedyś powiedział, że mój głos jest tak kojący, że mógłbym zostać uzdrowicielem - powiedział, powodując krótki wybuch śmiechu. - Zgaduję, że oznacza to, iż mogę wam pomóc zapaść w błogi, dający odprężenie sen. Zapewne niektórzy z was tego potrzebują, więc nie powinienem wam w tym przeszkadzać. Jeżeli potrzeba wam snu, śpijcie". + +Wystąpienie skończyło się dyskusją na temat patentów oprogramowania, tematu o coraz większym znaczeniu dla obu stron: firm programistycznych i społeczności wolnego oprogramowania. Koncepcja patentów, wymyślona i napisana dla świata realnego, okazała się nieporęczna i niedostosowana do kruchego świata technologii informatycznych, tak jak nie pasowała do działalności Napstera. Różnica między ochroną programu za pomocą copyrightu i praw patentowych jest subtelna ale znacząca. W przypadku copyrightu twórca programu może ograniczać kopiowanie kodu źródłowego, ale nie powielanie idei i funkcji programu. Inny twórca oprogramowania, jeżeli nie ma ochoty na używanie programu zgodnie z narzuconymi warunkami, może dokonać inżynierii wstecznej, tzn. skopiować funkcjonalność, pisząc kod od nowa. Takie powielanie pomysłów jest powszechnie stosowane w przemyśle programistycznym, gdzie firmy izolują grupy zajmujące się inżynierią wsteczną, aby zabezpieczyć się przed oskarżeniami o szpiegostwo przemysłowe i nieuczciwe hokus-pokus. W żargonie informatycznym takie postępowanie jest określane jako clean room engineering16. + +Ochrona patentowa działa odmiennie. Według Biura Patentowego Stanów Zjednoczonych (U.S. Patent Office) firmy i osoby indywidualne mogą za pomocą patentów chronić innowacyjne algorytmy i zgłaszać swe skargi do publicznego rozpatrzenia. Teoretycznie pozwala to właścicielom patentów czerpać korzyści z udostępniania chronionej informacji, a ich prawa wyłączności obowiązują w okresie ograniczonym zwykle do 20 lat. Praktyczna wartość tej ochrony jest dość problematyczna, gdyż często działanie programu ujawnia tajemnicę pomysłu. W przeciwieństwie do copyrightu, patent umożliwia jego właścicielowi tamowanie niezależnego tworzenia oprogramowania opartego na tym samym pomyśle lub o takiej samej funkcjonalności. + +W przemyśle informatycznym, gdzie okres dwudziestoletni to cała rynkowa epoka, patenty mają znaczenie strategiczne. Tam gdzie takie firmy jak Microsoft i Apple niegdyś toczyły boje o copyright oraz "wygląd i odczucie" (ang. look and feel) różnych technologii, dzisiejsze firmy internetowe starają się otaczać patentowym płotem pojedyncze aplikacje i modele biznesowe, czego najlepszym przykładem jest próba Amazon.com, która w roku 2000 usiłowała opatentować proces dokonywania zakupu jednym kliknięciem (ang. one-click online shopping process). Jednakże dla większości firm patenty chroniące oprogramowanie są bronią defensywną, której użycie w licencjach wzajemnych, umowach "krzyżowych" itp. służy wyrównaniu sił i międzyfirmowemu odprężeniu, złagodzeniu wzajemnych napięć. Jednakże nadal w kilku istotnych przypadkach algorytmów komputerowego szyfrowania i tworzenia obrazów graficznych dostawcy oprogramowania z powodzeniem tłumią poczynania rywali. + +Według Stallmana, praktyka chronienia oprogramowania za pomocą patentów dramatycznie wzmaga potrzebę zwiększenia hakerskiej czujności i uwydatnia polityczne korzyści, jakie niesie istnienie konkurencyjnego wolnego oprogramowania. Wskazuje, że patenty programistyczne czynią niedostępnymi pewne regiony rynku i twierdzi, że dzięki konkurencyjnej wydajności i cenie wolne oprogramowanie, takie jak GNU/Linux i FreeBSD, zaczęło już zdobywać swoje miejsce, wypierając z rynku oprogramowanie z prywatnymi prawami własności. Niestety, wydajność i cena są dla ludzi ważniejsze niż podstawowa kwestia wolności użytkowników i twórców oprogramowania17. + +"To nie brak zdolności nie pozwala nam tworzyć lepszego oprogramowania - mówił Stallman. - Nie możemy tego robić, bo nie mamy do tego prawa. Ktoś zakazał nam działać dla dobra społeczeństwa. Co się dzieje, gdy użytkownicy odkrywają spowodowane tym luki w wolnym oprogramowaniu? Jeżeli z tego, co głosi ruch zwolenników oprogramowania open source utkwiła im w pamięci obietnica tworzenia programów wydajnych i godnych zaufania, powiedzą: Nie daliście takiego produktu, jaki obiecywaliście. Ten program nie jest tak funkcjonalny, ani tak niezawodny, jak obiecywaliście. Brak mu takiej to a takiej funkcji. Okłamaliście nas. Jeżeli natomiast zgadzają się z naszą opinią, że wolność jest wartością samą w sobie, powiedzą: Dlaczego ci ludzie ośmielają się pozbawiać nas tej funkcji programu? Dlaczego ośmielają się ograniczać naszą wolność? I dzięki takim odpowiedziom możemy wytrwać pod gradem ciosów wymierzanych przez odłamki eksplodującego pocisku z patentami". + +Tego rodzaju komentarze oczywiście powodują sporo zamieszania. Większość obrońców oprogramowania open source sprzeciwia się prawom patentowym jeszcze głośniej niż Stallman. Jednakże nikt nie podważa jego opinii, że adwokaci oprogramowania open source kładą nacisk głównie na korzyści utylitarne a nie polityczne. Zwykle, zamiast podkreślać polityczne znaczenie wolnego oprogramowania, mówią o integralności jego konstrukcji opartej na hakerskim modelu rozwoju. Cytując oceny równorzędnych programów, malują obraz GNU/Linuksa lub FreeBSD jako lepiej skonstruowanych, lepiej sprawdzonych i, co z tego wynika, dla przeciętnego użytkownika bardziej godnych zaufania. + +Nie oznacza to, że pojęcie "oprogramowanie open source" nie niesie żadnych politycznych implikacji. Termin ten przez jego adwokatów jest używany z dwóch powodów. Po pierwsze, eliminuje zamieszanie wokół słowa "wolny", które biznes interpretuje zwykle jako "o zerowych kosztach". Po drugie, pozwala firmom na rozpatrywanie zagadnienia wolnego oprogramowania raczej z technicznego niż etycznego punktu widzenia. Eric Raymond, jeden z twórców Open Source Initiative18 i doskonały haker, poparł używanie terminu "oprogramowanie open source" w eseju z roku 1999 "Zamknij się i pokaż im kod" (ang. Shut Up and Show Them the Code), gdzie efektywnie podsumował frustracje płynące z kroczenia polityczną drogą Stallmana. + + Retoryka RMS potrafi uwieść wielu z nas. My, hakerzy, jesteśmy skłonnymi do rozmyślań idealistami, do których łatwo trafiają takie słowa jak "zasada","wolność" i "prawa". Nawet jeżeli nie zgadzamy się ze szczegółami programu, chcemy, aby retoryka RMS odnosiła skutek, sądzimy, że powinna działać na ludzi, i dziwimy się, że w 95% nie odnosi skutku, gdyż trafia na myślących inaczej niż my.19 + +W wymienionych przez Raymonda 95% mieszczą menadżerowie biznesu, inwestorzy i niehakerscy użytkownicy komputerów, którzy z prostego porównania liczb odczytują tendencje rynkowe. Bez znalezienia drogi do przekonania tych ludzi hakerzy wraz ze swoją ideologią będą zawsze tkwić na marginesie społeczeństwa: + + RMS, naciskając na dyskutowanie o prawach użytkowników komputerów, wysyła do nas niebezpiecznie atrakcyjne zaproszenie do powtarzania starych błędów. Powinniśmy je odrzucić, nie dlatego że opiera się na złych zasadach, lecz dlatego, że język, którego używa w zastosowaniu do oprogramowania, nikogo prócz nas nie przekonuje. Wręcz przeciwnie - ludzi spoza naszej kultury wprawia w zakłopotanie i odpycha.20 + +Patrząc na Stallmana przedstawiającego osobiście swą polityczną wizję, trudno zauważyć cokolwiek wprawiającego w zakłopotanie lub odpychającego. Jego wygląd może się nie wydawać zachęcający, ale przesłanie jest logiczne. Jeżeli ktoś ze słuchaczy pyta, czy świadomie unikający zaznaczania praw własności twórcy wolnego oprogramowania nie tracą możliwości dotrzymywania kroku postępowi najnowszych technologii, odpowiada, używając określeń zgodnych z jego własną wizją. "Sądzę, że wolność jest ważniejsza od postępu technicznego - mówił w trakcie swojego wystąpienia na Hawajach. - Zawsze wybiorę wolny program mniej zaawansowany technicznie, a nie jego lepszy technicznie odpowiednik z zastrzeżonymi prawami własności, gdyż nie zamierzam porzucać mej wolności dla takiego drobiazgu. Zgodnie z zasadą, którą wyznaję, nie chcę korzystać z czegoś, czym nie mogę podzielić się z innymi". + +Tego rodzaju odpowiedzi podkreślają quasireligijną naturę jego przesłania. Jak żyd przestrzegający koszeru lub mormon niepijący alkoholu, Stallman swoją decyzję niekorzystania z oprogramowania z prywatnym prawem własności ubiera w szaty tradycji i osobistych wierzeń. Jako niosący nową programistyczną ewangelię unika narzucania swych wierzeń siłą, jednak słuchacze rzadko wychodzą z jego wykładów nie przekonani, gdzie leży prawda. + +Aby dotrzeć ze swym przesłaniem do słuchaczy, uzupełnił wykład rytualnym przerywnikiem. Z plastikowej torby wyciągnął czarną togę i nałożył ją na ramiona, z drugiej torby wyjął malowany żółtą odblaskową farbą dysk komputerowy i umieścił go sobie na głowie, co widownia przyjęła ze śmiechem. + +"Jestem święty Ignucy z Kościoła Emacs - powiedział, wznosząc prawą rękę w geście szyderczego błogosławieństwa. - Błogosławię twój komputer, moje dziecko". + +Stallman jako święty Ignucy. Zdjęcia Woutera van Oortmerssena + +Słuchacze wybuchnęli niepohamowanym śmiechem. Widownia klaskała, dysk na głowie Stallmana chwytał światło lamp świecących nad głową i pobłyskiwał, doskonale imitując aureolę. W jednej chwili przeistoczył się z niezręcznego haole21 w postać z rosyjskiej świętej ikony. + +"Emacs został napisany jako zwykły edytor tekstowy - mówił Stallman, tłumacząc swój strój. - Z czasem stał się sposobem na życie dla wielu i religią dla niektórych. Nazywamy tę religię Kościołem Emacs". + +Ten moment autoparodii rozweselił zebranych, trafiając również do tych wielu, którzy wcześniej stallmanowską formę programistycznego ascetyzmu zdawali się uważać za maskowany przebraniem fanatyzm religijny. Było to także głośne "zrzucenie drugiego buta"22. Nałożenie togi i aureoli było przyzwoleniem: "Dobrze, śmiejcie się ze mnie. Wiem, że wyglądam dziwacznie". + +A co się tyczy samej osoby świętego Ignucego, Stallman twierdzi, że pojawił się on w roku 1996, długo po powstaniu Emacsa i równie długo przed pojawieniem się terminu "oprogramowanie open source". Jego pojawienie się zostało przyspieszone dążeniem do objęcia przywództwa hakerskiej społeczności. Mówiąc w ten sposób "śmiejcie się ze mnie", chciał przekonać wszystkich, że on, uparty Stallman, nie jest fanatykiem, choć wielu stara się przedstawić go w ten sposób. Dodaje, że później inni starali się nadać temu zbyt wielkie znaczenie, by podkreślić jego rolę programistycznego ideologa, jak to zrobił Eric Raymond w wywiadzie z roku 1999 umieszczonym w serwisie internetowym linux.com: + + Gdy mówię, że RMS skaluje swoje poczynania, nie lekceważę go i nie oskarżam o nieszczerość. Stwierdzam jedynie, że jak każdy dobry "przekonywacz" stosuje teatralne gesty. Czasem robi to świadomie dla zwiększenia efektu - czyż nie widzieliście go, jak przebrany za świętego Ignucego z dyskową aureolą na głowie błogosławi oprogramowanie? Jednakże często czyni to nieświadomie; umie odpowiednio pobudzić słuchaczy, aby trzymać ich uwagę w napięciu, zwykle unikając szokowania23. + +Stallman analizę Raymonda kwituje stwierdzeniem: "To mój sposób śmiania się z samego siebie. Jeżeli inni widzą w tym coś więcej, jest to ich problem, a nie mój". + +Przyznaje się do szmiry. "Śmieszy was to? - zapytał w pewnym momencie. - Uwielbiam być w centrum zainteresowania". Jak mówi, aby sobie to ułatwić, zapisał się kiedyś do Toastmasters, organizacji pomagającej swoim członkom udoskonalać umiejętność publicznego występowania, i teraz wszystkim to poleca. Osiągnął umiejętności sceniczne, których mogą mu pozazdrościć profesjonalni aktorzy i wyczuwa związek swych wystąpień z wodewilami ostatnich lat. W kilka dni po przemówieniu Stallmana w Maui High Performance Computing Center, robiąc aluzję do wystąpienia na Linux World Expo 1999, spytałem go, czy ma kompleks Groucho Marxa, tzn. niechęć do należenia do wszelkich klubów, które chętnie widziałyby go jako swego członka. Odpowiedział natychmiast: "Nie, ale podziwiam Groucho Marxa i sądzę, że pod wieloma względami jestem inspirowany przez niego, a także przez Harpo24." + +Wpływ Groucho Marxa jest widoczny w jego zamiłowaniu do gier słownych, choć z drugiej strony jest to typowa cecha większości hakerów. Wpływ Groucha daje się zauważyć przede wszystkim w sposobie wypowiadania kalamburów. Mówi je z kamienną twarzą, jakby mimochodem, bez zdradzania emocji nawet przez uniesienie brwi lub wykrzywienie ust, co sprawia wrażenie, że on bardziej śmieje się z widowni, niż ona z niego. + +Ale wrażenie to szybko znika, gdy patrzymy na członków zespołu Maui High Performance Computer Center, śmiejących się z parodii świętego Ignucego. Bez żadnego szczególnego wysiłku potrafił skłonić do śmiechu salę pełną inżynierów. "Bycie świętym Kościoła Emacs nie wymaga celibatu, ale zmusza do życia w moralnej czystości - mówił do mauitańskiego audytorium. - Musicie egzorcyzmami wygnać diabelski system operacyjny z prawem własności i zainstalować na waszych komputerach całkowicie wolny i święty system GNU, a na nim instalować jedynie wolne oprogramowanie. Jeżeli złożycie takie śluby i będziecie żyć, nie łamiąc ich, zostaniecie świętymi Kościoła Emacs i aureola pojawi się wokół waszych głów. + +Skecz o świętym Ignucym zakończył dowcipem z podtekstem. W większości systemów uniksowych i spokrewnionych z Uniksem głównym konkurentem Emacsa jest vi, edytor tekstowy stworzony przez byłego studenta UC Berkeley25, a obecnego szefa działu badawczego Sun Microsystems, Billa Joya. Przed zdjęciem aureoli Stallman pokpiwał sobie z programu rywala. Mówił: "Ludzie czasami pytają mnie, czy grzechem wobec Kościoła Emacs jest używanie vi. Odpowiadam, że korzystanie z wolnej wersji vi to nie grzech, lecz pokuta. Szczęśliwego hakowania". + +Po krótkiej sesji zadawania pytań słuchacze zebrali się wokół Stallmana. Kilku poprosiło o autografy. "Podpiszę to - powiedział, trzymając podany przez jakąś kobietę wydruk Powszechnej Licencji Publicznej GNU26 - ale tylko wtedy, gdy przyrzekniesz mi, że będziesz używać prawidłowej nazwy GNU/Linux zamiast Linux i wszystkim swoim przyjaciołom nakażesz to samo". + +Ten komentarz jedynie potwierdza moje prywatne obserwacje. W przeciwieństwie do innych występujących na scenie oraz wielu polityków, Stallman nie ma "trybu prywatnego". Obok świętego Ignucego istnieje ideolog, taki sam na scenie, jak i poza nią. Tego samego wieczoru podczas rozmowy przy obiedzie, gdy jakiś programista wspomniał o swoim pozytywnym stosunku do oprogramowania open source, Stallman poprawił go: "Masz na myśli wolne oprogramowanie. Tak należy o nim mówić." + +Zadającym pytania po wystąpieniu Stallman przyznał się do zapędów pedagogicznych. "Wielu ludzi powiada: Najpierw zaproś do wstąpienia do społeczności, a potem nauczaj o wolności. Może to być rozsądna strategia, ale w praktyce wszyscy zapraszają do udziału w społeczności, ale gdy chętni już się pojawią, mało kto zajmuje się nauczaniem o wolności". + +Przypomina to nieco miasto z trzeciego świata. Ludzie tam ciągną z nadzieją wzbogacenia się lub przynajmniej uczestniczenia w otwartej, żywej kulturze, ale ci, którzy dzierżą władzę, wciąż stosują różne triki i strategie, np. patenty chroniące oprogramowanie, aby trzymać masy z dala. "Wiele milionów ludzi buduje miasta slamsów, ale nikt nie dba o postąpienie o krok naprzód, by ich z tych ruder wyciągnąć. Jeżeli pozytywnie oceniacie strategię wolnego oprogramowania, proszę, wykonajcie następny krok. Krok pierwszy wykonuje wielu. Potrzeba nam tych, którzy postąpią dalej." + +Wykonanie drugiego kroku, czyli niesienie do domów idei wolności, a nie tylko jej akceptacja, jest kamieniem węgielnym ruchu wolnego oprogramowania. Ci, którzy mają nadzieję na zreformowanie od środka przemysłu programistycznego opartego na zasadach własności, grzeszą głupotą. "Zmienianie systemu od środka jest ryzykowne - twierdził Stallman - i jeżeli nie działacie z pozycji Gorbaczowa, zostaniecie unicestwieni". + +Chętni do zadawania pytań podnosili ręce. Stallman zwrócił uwagę na kogoś w stroju klubu golfowego, kto pytał: "Więc jak bez patentów można walczyć ze szpiegostwem przemysłowym?" + +"Te dwie sprawy nie mają ze sobą nic wspólnego, naprawdę" - odpowiedział Stallman. + +"A jeżeli ktoś chce wykraść z innej firmy część oprogramowania?" + +Stallman wyglądał jak ktoś rażony piorunem. "Chwileczkę - powiedział. - Wykraść? Przepraszam, ale ta wypowiedź zawiera tak wielki ładunek przesądów, że mogę jedynie powiedzieć, że ich nie podzielam. Firmy, które tworzą "niewolne" oprogramowanie i inne rzeczy, skrywają wiele sekretów handlowych i nie wygląda na to, by tutaj mogło coś się zmienić. W latach osiemdziesiątych znaczna część programistów nawet nie miała pojęcia, czym jest patent chroniący oprogramowanie, więc nie przykładała do tego żadnej wagi. Ludzie publikowali interesujące idee i jeżeli nie należeli do ruchu wolnego oprogramowania, zachowywali w sekrecie niewielkie szczegóły. Teraz opatentowują te idee, a drobne szczegóły nadal zachowują w tajemnicy. Tak czy inaczej, patenty w opisywanej dziedzinie nic nie zmieniły." + +"Więc skoro nie wpłynęły na publikowanie..." - głos kolejnej osoby, która wtrąciła się do dyskusji, zamarł niemal na początku. + +"Ależ wpłynęły - odpowiedział Stallman. - Teraz publikacje informują was, że taki a taki pomysł jest odcięty od społeczeństwa na 20 lat. I co w tym, do diabła, widzicie dobrego? Poza tym opisują wszystko w możliwie najbardziej niejasny sposób, aby rozciągnąć patent możliwie najszerzej i w rezultacie czytanie dokumentacji traci sens, bo i tak nic nie można zrozumieć. Czytanie patentów przynosi jedynie złe informacje o zdarzeniach, z którymi walka jest daremna". + +Na sali zapadła cisza. Wystąpienie rozpoczęło się o 15:15, a była już niemal 17:00 i większość słuchaczy wierciła się na siedzeniach, niecierpliwie oczekując, by wreszcie zerwać się i uciec na weekend. Wyczuwając zmęczenie, Stallman rozejrzał się po sali i szybko zakończył. "Wygląda na to, że skończyliśmy - powiedział, po czym na wzór prowadzącego aukcję, zaczął odliczać - "Koniec po raz pierwszy, koniec po raz drugi, koniec po raz trzeci. Wykład zamknięty". W ten sposób dał słuchaczom możliwość zadania ewentualnych ostatnich pytań. Skoro już żadne ręce nie podniosły się do góry, zakończył tradycyjnym: + + Szczęśliwego hakowania. + + +Rozdział 9. +Powszechna Licencja Publiczna GNU1 + +Do wiosny 1985 r. Richard Stallman uporał się ze stworzeniem pierwszego kamienia milowego projektu GNU, czyli opartej na Lispie wolnej wersji Emacsa. Aby tego dokonać, musiał sprostać dwóm wyzwaniom. Po pierwsze - uniezależnić Emacs od platformy systemowej, a po drugie - w tym duchu odtworzyć społeczność Emacs. + +Dysputy z UniPressem wyciągnęły na światło dzienne wady kontraktu wewnętrznego społeczności Emacs. Tam, gdzie Emacs rozwijał się pod bezpośrednim nadzorem Stallmana, zasady umowy społecznej były dotrzymane, ale w działach rozwiniętych bez jego kierownictwa i ogólnego nadzoru, np. dotyczących wersji Uniksa sprzed roku 1984, poszczególne osoby i firmy miały swobodę ustanawiania własnych zasad. + +Napięcie między swobodą modyfikacji i swobodą narzucana przywilejów autorskich zrodziło się jeszcze przed GOSMACS-em. Copyright Act (Akt praw autorskich) z roku 1976 rozciągał na oprogramowanie prawa autorskie regulujące zasady kopiowania. Zgodnie z ustępem 102(b) tegoż aktu, osoby i firmy uzyskały możliwość chronienia prawem autorskim (copyright) samych programów, ale nie "procesów i metod w ten program wbudowanych"2. Inaczej mówiąc, programy zostały potraktowane tak samo jak opowiadania i piosenki. Inni programiści mogli czerpać inspirację z istniejących programów, ale aby je skopiować, musieli - i to nie żart - postarać się wcześniej o zgodę autora oryginału. Choć nowe prawo gwarantowało ochronę prawną również programom bez noty copyright, programiści szybko przystąpili do zaznaczenia swych praw przez dodawanie tej noty. + +Stallman od początku patrzył na to z przerażeniem. Rzadko się zdarza, by jakiś program nie zapożyczał części kodu od programów już istniejących, a tu jedno pociągnięcie prezydenckiego pióra i jedna uchwała Kongresu dały programistom i firmom programistycznym przewagę nad społecznie budowanymi programami. Ponadto był to silny zastrzyk formalizmu zaaplikowany światu, który dotychczas pozostawał wolny od biurokracji. Nawet jeżeli hakerzy byliby w stanie udowodnić, że kod jakiegoś przeklętego programu korzysta z działań realizowanych przez lata, taka batalia z posiadaczami praw własności przekraczała ich możliwości finansowe. Dawne dyskusje hakera z hakerem zostały teraz zastąpione przez negocjacje prawnika z prawnikiem. Z takiego systemu prawnego ciągnęły korzyści przede wszystkim firmy, a hakerzy nie mieli szans. + +Ci, którzy zaproponowali ochronę praw autorskich oprogramowania, wysuwali kontrargumenty: bez ochrony praw autorskich rezultaty pracy mogły się przedostawać do domeny publicznej. Ponadto nota copyright była gwarancją jakości. Programiści i firmy, umieszczając swe imię lub nazwę w nocie autorskiej, pracowali na swą reputację. Ostatecznie był to rodzaj kontraktu, jak również stwierdzenie prawa własności. Używając noty copyright jako elastycznej postaci licencji, autor mógł zrzec się części swych praw w zamian za określone zachowanie użytkownika. Autor mógł na przykład zezwolić na nieautoryzowane kopiowanie programu pod warunkiem, że nie będzie on wykorzystywany w celach komercyjnych. + +Ten ostatni argument nieco łagodził sprzeciw Stallmana wobec stosowania noty copyright. Patrząc wstecz na lata prowadzące do rozpoczęcia projektu GNU, przyznaje on, że zaczął rozumieć korzyści płynące ze stosowania noty copyright gdzieś na etapie wersji Emacs 15.0, ostatniej ważnej poprzedzającej powstanie GNU Emacs. Wspomina: "Widziałem e-maile z uproszczonymi notami copyrightu: Kopiowanie bez zmian dozwolone i to było inspirujące". + +Dla wersji Emacs 15.0 stworzył notę copyright dającą użytkownikom prawo sporządzania i upowszechniania kopii. Dał im również prawo tworzenia wersji zmodyfikowanych, ale bez możliwości przypisywania sobie wyłącznego autorstwa, jak to miało miejsce w przypadku GOSMACS. + +Licencja Emacs 15.0, choć pomocna przy kodyfikowaniu umowy wzajemnej społeczności Emacs, okazała się zbyt nieformalna, aby się nią posłużyć w projekcie GNU. Zaraz po rozpoczęciu pracy nad wersją GNU Emacs Stallman rozpoczął konsultację z innymi członkami Fundacji Wolnego Oprogramowania nad dopracowaniem języka licencji. Szukał także rady u prawników, którzy pomagali mu stworzyć Fundację. + +Mark Fisher, adwokat bostoński specjalizujący się w prawie własności intelektualnej, przypomina sobie z tego okresu dyskusje ze Stallmanem na temat postaci licencji. "Richard miał bardzo sprecyzowaną wizję, jak ta licencja ma wyglądać - wspomina. - Miała opierać się na dwóch podstawowych zasadach. Po pierwsze, licencja miała czynić oprogramowanie maksymalnie dostępnym (otwartym). Po drugie, miała zachęcać innych do stosowania tych samych praktyk licencyjnych." + +Zachęcanie innych do stosowania tego samego sposobu licencjonowania oprogramowania oznaczało ograniczenie powstawania nowych wersji Emacsa z zastrzeżonymi prawami własności. Aby ukrócić ten proceder, Stallman z grupą kolegów programistów, zwolenników wolnego oprogramowania ogłosili, że każdy użytkownik może do woli modyfikować GNU Emacsa dopóty, dopóki będzie publikował zmiany. Dodatkowo każda nowa, pochodna wersja musiała być opatrzona tą samą licencją GNU. + +Rewolucyjna natura tego ostatniego zastrzeżenia ujawniła się dopiero po pewnym czasie. Fischer wspomina, że wówczas patrzył na licencję GNU Emacs jak na zwykły dość prosty kontrakt. Dla towaru została określona cena. Jedyną różnicą było to, że zamiast pobierania opłaty pieniężnej Stallman zażądał od użytkowników udostępniania innym wszelkich wprowadzanych zmian. To, jak pamięta Fischer, odróżniało ten kontrakt od innych. + +"W tym czasie samo proszenie innych o zaakceptowanie proponowanej ceny było rzeczą unikalną" - twierdzi. + +Licencja GNU Emacs ostatecznie pojawiła się w roku 1985 wraz z samym programem GNU Emacs. Po ukazaniu się programu Stallman zwrócił się do hakerskiej społeczności o pomoc w ulepszeniu licencji. Rychło na apel odpowiedział John Gilmore, haker pracujący dla Sun Microsystems, który stał się potem aktywistą ruchu wolnego oprogramowania. Jako swój wkład Gilmore wniósł wersję Emacsa przystosowaną do SunOS, wewnątrz formowej wersji Uniksa. Podczas adaptacji wykonał dwie poprawki zgodnie z wymaganiami licencji. Uznał tę licencję nie za obciążenie, lecz za zwięzły opis hakerskiego etosu. "Wszystkie dotychczasowe licencje były bardzo nieformalne" - wspomina. + +Jako przykład braku formalizmu Gilmore cytuje notę copyrightu dla trn, programu narzędziowego Uniksa. Program ten, napisany przez Larry'ego Walla, późniejszego twórcę języka Perl, ułatwiał programistom uniksowym wprowadzanie do dużych kodów źródłowych poprawek, tzw. "patchów". Objaśniając przydatność tego programu, Wall w tekstowym pliku README dopisał: + +Copyright (c) 1985, Larry Wall +Możecie trn kopiować w całości albo po kawałku, +dopóki nie robicie na tym forsy lub nie udajecie, że +to wyście go napisali3. + +Takie stwierdzenia, będące doskonałym odbiciem hakerskiej etyki, jednocześnie ilustrowały trudności przetłumaczenia jej swobodnej postaci na sztywny, formalny język legalnego copyrightu. Pisząc licencję dla GNU Emacs, Stallman zrobił coś więcej niż proste zablokowanie możliwości wymykania się zmodyfikowanych wersji na rynek oprogramowania z prywatnymi prawami własności. Wyraził zasady hakerskiej etyki w języku zrozumiałym dla obu stron: hakerów i prawników. + +Nie upłynęło wiele czasu, nim inni hakerzy zaczęli rozmyślać nad "przyczepieniem" licencji GNU Emacs do swoich własnych programów. W odpowiedzi na wezwanie zgłoszone w usenetowej dyskusji Gilmore w listopadzie 1986 roku wysłał do Stallmana e-mail sugerujący wprowadzenie dwóch modyfikacji: + + W nazwie licencji mógłbyś chyba "EMACS" zastąpić przez "SOFTWARE" lub coś podobnego. Mam nadzieję, że wkrótce Emacs przestanie być największą częścią systemu GNU i licencja będzie obejmować wszystko.4 + +Nie tylko Gilmore proponował większą ogólnikowość licencji. Do końca roku 1986 Stallman osiągnął kolejny kamień milowy projektu GNU - debugger kodu źródłowego - i szukał sposobu zmodyfikowania licencji Emacs tak, aby objęła oba programy. Zdecydował się na usunięcie wszystkich sformułowań odnoszących się bezpośrednio do Emacsa i stworzenie ogólnej licencji, jednego ogólnego "parasola", który przykryje całe oprogramowanie projektu GNU. W ten sposób narodziła się Powszechna Licencja Publiczna GNU (GNU General Public License, czyli w skrócie GPL). + +Do oznaczania licencji przyjął powszechnie stosowaną konwencję numerowania wersji oprogramowania, zgodnie z którą pełne wersje oznacza się liczbami całkowitymi, zaś prototypowe za pomocą ułamków dziesiętnych. GPL w wersji 1.0 opublikował w roku 1989 (prace nad samym projektem trwały od roku 1985), czyli w rok po wypuszczeniu GNU Debuggera (drugiego wejścia w świat programowania uniksowego). Licencja zawierała preambułę wyrażającą intencje polityczne: + +Celem Powszechnej Licencji Publicznej GNU (GNU +General Public License, GPL) jest zagwarantowanie +użytkownikowi swobo dy udostępniania i sprzedawania +kopii wolnego oprogramowania, swobody otrzymywania +kodu źródłowego, jeżeli jest potrzebny, i swobody +zmieniania wolnego oprogramowania, a więc danie +pewności, iż oprogramowanie jest wolno dostępne dla +wszystkich użytkowników. +W celu ochrony praw użytkownika jesteśmy zmuszeni +wprowadzać ograniczenia zabraniające komukolwiek +kwestionowanie jego praw albo sugerowanie +rezygnacji z tych praw. Ograniczenia te sprowadzają +się do pewnych obowiązków w przypadku +rozpowszechniania przez Was kopii naszego +oprogramowania bądź dokonywania w nim zmian5 i 6. + +Przygotowując GPL, Stallman był zmuszony wprowadzić zmiany przystosowujące licencję do nieformalnych zasad obowiązujących wewnątrz społeczności Emacs. Poprzednie żądanie publikowania wszystkich wprowadzanych zmian musiał zamienić na żądanie publikowania jedynie zmian wprowadzonych w programach pochodnych, upowszechnianych w taki sposób, jak on to czynił. Mówiąc inaczej, programiści, którzy modyfikowali Emacs jedynie dla własnych potrzeb, zostali zwolnienie z przesyłania do niego kopii plików źródłowych. To obniżenie ceny wolnego oprogramowania było jednym z niewielu zaaprobowanych przez niego odstępstw od doktryny. Teraz użytkownicy mogli wprowadzać zmiany bez obawy, że Stallman zagląda im przez ramię, jeżeli tylko nie odcinali reszty hakerskiej społeczności od późniejszych zmian danego programu. + +Patrząc wstecz, Stallman przyznaje, że kompromisowe sformułowanie wprowadził do GPL, gdyż nie podobało mu się pełnienie roli Wielkiego Brata wobec społeczności Emacs. Lubił zaglądać w systemy innych hakerów, ale obawiał się, że w przyszłości ktoś inny, nadzorując rozwój kodu, może taką uprzywilejowaną pozycję wykorzystać w złym celu. To właśnie skłoniło go do złagodzenia warunków GPL. + +"Nie jest dobre zmuszanie ludzi do publikowania wszystkich zmian - mówi Stallman. - Nie jest słuszne żądanie, by wszystkie informacje przesyłali do jednego uprzywilejowanego użytkownika. Taki rodzaj centralizacji i uprzywilejowania jednej osoby nie jest zgodny z zasadami społeczeństwa, w którym wszyscy mają równe prawa". + +Powszechna Licencja Publiczna (GPL) może być uznana za największe hakerskie osiągnięcie Stallmana. Stworzyła ona system własności społecznej w ramach powszechnie obowiązującego systemu prawa autorskiego (copyright). A co jeszcze ważniejsze, ukazała intelektualne podobieństwo tekstu zapisu prawnego i kodu programowego. Preambuła GPL zawiera głębokie przesłanie, że zamiast spoglądać z podejrzliwością na prawo autorskie (copyright), hakerzy mogą je uważać za kolejny system aż się proszący o "zhakowanie". + +"GPL powstawała jak fragment wolnego oprogramowania, tworzony przez dyskusję dużej społeczności, która omawia ogólną konstrukcję, zgodność lub niezgodność z własnymi wymaganiami, domaga się złagodzenia różnych elementów i dojścia do kompromisu zadawalającego możliwie dużą grupę - mówi Jerry Cohen, inny prawnik, który pomagał Stallmanowi przy tworzeniu licencji. - Proces ten przebiegał bardzo sprawnie i choć pierwsze opublikowane wersje zostały przyjęte ze sceptycyzmem, a nawet wrogością, kolejne były coraz szerzej akceptowane." + +W roku 1986 w wywiadzie dla magazynu "Byte" Stallman optymistycznie przedstawił wyniki pracy nad GPL. Oprócz proklamacji wartości hakerskich czytelnicy powinni odebrać tę licencję jako "rodzaj intelektualnego pojedynku jujitsu z systemem prawnym stworzonym przez tych, którzy oprogramowanie chcą zamienić w swój tajny kapitał"7. Lata później Stallman opisuje powstanie GPL w słowach o wiele mniej wojowniczych: "Rozmyślałem o materii, która miała sens etyczny, polityczny i prawny - mówi. - Musiałem zastanowić się, które elementy systemu prawnego należy w licencji pozostawić. Wszak przystępowałem do tworzenia podstaw prawnych nowej społeczności, a nie byłem rządem i nie mogłem zmieniać istniejącego prawa. Zadanie musiałem wykonać, tworząc budowlę na szczycie istniejącego systemu prawnego, który nie był stworzony z myślą o realizacji celów, jakie mi przyświecały." + +W czasie, gdy on ważył dotyczące wolnego oprogramowania racje etyczne, polityczne i prawne, kalifornijski haker i członek klubu entuzjastów science-fiction, Don Hopkins, odesłał mu pożyczoną wcześniej instrukcję mikroprocesora 68000. W dowód wdzięczności udekorował tył koperty nalepkami otrzymanymi na lokalnym zjeździe miłośników science-fiction. Jedna z nalepek przyciągnęła wzrok Stallmana. Widniał na niej napis "Copyleft (L), All Rights Reversed8". Wydając pierwszą wersję GPL, Stallman zapożyczył termin z tekstu nalepki, nadając licencji wolnego oprogramowania nieformalną nazwę "Copyleft"9. Z czasem nazwa nieformalna i jej skrót "odwrócone C", stały się dla Fundacji Wolnego Oprogramowania symbolem Powszechnej Licencji Publicznej (GPL). + +Niemiecki socjolog Max Weber stwierdził kiedyś, że wszystkie wielkie religie wyrosły z "rutynizacji" i instytucjonalizacji charyzmy. Według niego, każda religia, która zdobyła sobie trwałe miejsce w historii, osiągnęła to przez przekształcenie charyzmy i posłania swego przywódcy-proroka w społeczny, polityczny i etyczny aparat głoszący własne prawdy w formie możliwej do przyjęcia przez różne kultury w różnych czasach. + +Choć GNU GPL per se nie jest przesłaniem religijnym, na pewno można uważać ją za interesujący przykład procesu instytucjonalizacji następującej w nowoczesnym, zdecentralizowanym świecie twórców oprogramowania. Wkrótce po pojawieniu się licencji od razu zaakceptowała ją większość programistów i firm, nawet niepoczuwających się do jakiejkolwiek wspólnoty z ruchem Stallmana. Niektórzy uznali GPL za podstawę ochrony własnego oprogramowania. Nawet ci, którzy odrzucili GPL jako zbyt ograniczającą, przyznali, że pozostali pod jej wpływem. + +Do drugiej grupy należał haker Keith Bostic, w chwili opublikowania GPL 1.0 pracownik University of California. Dział, w którym pracował - Computer Systems Research Group (CSRG)10 - zajmował się rozwojem oprogramowania uniksowego od roku 1970 i był odpowiedzialny za wiele kluczowych elementów systemu, włączając w to protokół sieciowy TCP/IP, podstawę nowoczesnej komunikacji internetowej. Pod koniec lat osiemdziesiątych AT&T, właściciel nazwy firmowej Unix, zaczął się interesować komercjalizacją tego systemu i począł spoglądać na Berkeley Software Distribution (BSD), akademicką wersję Uniksa, rozwiniętą przez Bostica i jego kolegów, jak na kluczowe źródło komercyjnych technologii. + +Choć na podstawie licencji kod źródłowy BSD był dostępny dla naukowców i komercyjnych programistów, te usiłowania komercjalizacji zaczęły stawać się problemem. Prawa własności kodu Berkeley i kodu komercyjnego AT&T były wymieszane. W rezultacie dystrybucje Berkeley były dostępne jedynie dla instytucji, które miały licencję kodu źródłowego AT&T. Gdy AT&T podniosło ceny licencji, układ, który z początku wydawał się nieszkodliwy, stopniowo stawał się coraz cięższy do zniesienia. + +Przyjęty do pracy w roku 1986, Bostic przyjął na siebie zadanie przystosowania BSD do działania na komputerze PDP-11 firmy Digital Equipment Corporation. Wówczas, jak mówi, dość blisko współdziałał ze Stallmanem podczas jego okazjonalnych wizyt na zachodnim wybrzeżu. "Pamiętam, że Stallman siedział przy terminalu CSRG, gdy toczyliśmy żywą wymianę zdań na temat praw autorskich - wspomina. - Potem poszliśmy na obiad i dalej dyskutowali na ten sam temat". + +Jego argumenty ostatecznie zostały przyjęte, choć niedokładnie w takiej formie, jak sobie życzył. W czerwcu 1989 Berkeley oddzieliło swój kod sieciowy (BSD Networking) od reszty systemu operacyjnego, do którego prawa własności miało AT&T, i zaczęło go rozpowszechniać z niezależną licencją University of California. Warunki kontraktu były bardzo liberalne. Licencjobiorca był zobowiązany jedynie do powoływania się na uczelnię w ogłoszeniach reklamujących programy pochodne11. W przeciwieństwie do GPL licencja ta zezwalała na tworzenie programów pochodnych z zastrzeżonymi prawami własności. Powszechnemu uznaniu licencji BSD przeszkadzał fakt, że wersja BSD Networking nie była pełnym systemem operacyjnym. Można było studiować jego kod, ale jego uruchomienie wymagało połączenia z kodem strzeżonym przez ograniczenia praw własności. + +Przez kilka następnych lat Bostic i inni pracownicy uniwersytetu pracowali nad dorobieniem brakujących elementów kodu BSD, aby uczynić go pełnym, ogólnodostępnym systemem operacyjnym. Ich wysiłki ostatecznie zostały uwieńczone powodzeniem na początku lat dziewięćdziesiątych, pomimo opóźnień spowodowanych zastrzeżeniami prawnymi Unix Systems Laboratories z AT&T, które starały się zachować wyłącznie dla siebie prawa do używania nazwy firmowej Unix. Jednakże już wcześniej wiele narzędzi z Berkeley znalazło swe miejsce w projekcie GNU Stallmana. + +"Wydaje się mało prawdopodobne, byśmy tak twardo parli do przodu, gdyby nie wpływ projektu GNU - przyznaje Bostic, patrząc wstecz. - Było coś, co nas ostro poganiało, a myśmy się temu z ochotą poddawali". + +Do końca roku 1980 GPL pokazała swą moc przyciągania całej społeczności twórców oprogramowania. Narzędzia BSD należały do wolnego oprogramowania nawet bez licencji GPL, ale jej użycie niosło określony komunikat. "Myślę, że pojawienie się GPL zmusiło wielu ludzi do zastanowienia się, czy naprawdę tworzą wolne oprogramowanie i w jaki sposób powinni je licencjonować" - twierdzi Bruce Perens, twórca popularnego narzędzia uniksowego Electric Fence i przyszły szef grupy programistów Debian GNU/Linux. W kilka lat po pojawieniu się GPL postanowił zrezygnować z licencji własnego pomysłu i objąć Electric Fence licencją sporządzoną przez Stallmana przy wsparciu prawników. "Było to bardzo łatwe" - wspomina. + +Rich Morin, który pierwszy anons Stallmana dotyczący projektu GNU przyjął sceptycznie, przyznaje, że z coraz większym zdumieniem spoglądał na gromadzenie się oprogramowania pod ochroną GPL. Jako przywódca grupy programistów SunOS w latach osiemdziesiątych był zobowiązany do rozsyłania taśm z nowymi wersjami najlepszego wolnego oprogramowania. Często wymagało to telefonowania do twórców oryginalnych programów i sprawdzania, czy przypadkiem prawa autorskie nie zabraniają ich rozpowszechniania i czy są przeznaczone do użytku w wolnej ogólnodostępnej domenie. Pod koniec roku 1989 zauważył, że najlepsze programy zwykle są chronione przez licencję GPL. "Jako dystrybutor oprogramowania wiedziałem, że znak GPL oznacza swobodę rozpowszechniania" - wspomina. + +Aby zrekompensować sobie kłopoty wynikające z trudności kompletowania taśm z żądanymi programami, obciążał odbiorców stosowną opłatą. Teraz zauważył, że przygotowanie taśm złożonych z programów z licencją GPL zajmuje mu dwakroć mniej czasu, dzięki czemu interes zaczął przynosić zyski. Widząc okazję do zarobku, zamienił hobby w biznes pod nazwą: Prime Time Freeware. + +Taka działalność gospodarcza była całkowicie zgodna z zasadami wolnego oprogramowania. "Gdy mówimy o wolnym oprogramowaniu, mówimy o wolności, a nie o cenie" - objaśnia Stallman w preambule GPL. Pod koniec lat osiemdziesiątych przedstawił tę myśl w postaci uproszczonego stwierdzenia: "Mówiąc wolny, nie myśl o wolnym, bezpłatnym dostępie do piwa, lecz o wolności wypowiedzi". + +Większość firm zlekceważyła argumenty Stallmana. Części przedsiębiorców wolność związana z wolnym oprogramowaniem nadal kojarzyła się z wolnym rynkiem. Usunięcie ograniczeń własności oprogramowania stwarzało sytuację, w której nawet najmniejsza firma mogła stawać w szranki z takimi potęgami jak IBM i DEC. + +Jednym z pierwszych przedsiębiorców, którzy to pojęli, był Michael Tiemann, programista i student ostatnich lat Stanford University. W latach osiemdziesiątych bez zastanowienia postępował zgodnie z zasadami projektu GNU, jak początkujący jazzman śladami swego ulubionego artysty. Dopiero po ukazaniu się w roku 1987 kompilatora GNU języka C (GNU C Compiler, w skrócie GCC) pojął, jak wielki jest potencjał wolnego oprogramowania. Samo pojawienie się GCC, który nazwał "bombą", uznał za dowód wielkiej determinacji Stallmana-programisty. + +"Tak jak każdy pisarz marzy o napisaniu wielkiej amerykańskiej powieści, tak każdy programista w latach osiemdziesiątych pragnął napisać wielki amerykański kompilator - wspomina Tiemman. - Nagle Stallman to zrobił. To było poniżające". + +"Mówicie o różnych niedociągnięciach GCC - wtóruje mu Bostic, - ale nikt przed Stallmanem nie mógł się uznać za twórcę kompilatora". + +Zamiast współzawodniczyć ze Stallmanem, Tiemann postanowił korzystać z jego pracy. Oryginalna wersja GCC liczyła około 110 tysięcy linii kodu, ale Tiemann wspomina, że był to kod, który można było bardzo łatwo odczytać i pojąć. Było to na tyle proste, że zajęło mu tylko pięć dni. Przez następny tydzień udało mu się przenieść to oprogramowanie na platformę mikroprocesora National Semiconductor 32032. W rok później zajął się tworzeniem kompilatora dla języka C+. Pewnego razu, wygłaszając na ten temat wykład w Bell Labs, zetknął się ze zmagającymi się z tym samym problemem programistami z AT&T. + +"Na sali było około 40 lub 50 osób, więc zapytałem, ilu z nich pracuje nad tym kompilatorem - wspomina. - Gospodarz odpowiedział, że ta informacja jest objęta tajemnicą, ale mogę się mniej więcej zorientować, rozglądając się po sali". + +Wkrótce potem, jak wspomina, rozjaśniło mu się w głowie. "Pracuję nad tym kodem od sześciu miesięcy - pomyślał, - co oznacza niezłą wydajność, którą wolny rynek powinien wynagrodzić". + +Dalszą zachętę znalazł w manifeście GNU, gdzie obnażano chciwość niektórych dostawców oprogramowania, zachęcając innych do rozważenia korzyści, jakie wolne oprogramowanie daje konsumentom. Wolne oprogramowanie, łamiąc potęgę monopolu oprogramowania komercyjnego, umożliwia bystrym mniejszym dostawcom konkurowanie z wielkimi za pomocą usług i konsultacji - dwóch najbardziej dochodowych nisz rynku komputerowego. + +W szkicu opublikowanym w roku 1999 Tiemann wspomina wrażenie, jakie wywarł na nim manifest Stallmana. "Czytało się to jak socjalistyczną polemikę, ale ujrzałem w tym coś zupełnie innego. Zobaczyłem tam zamaskowany biznesplan"12. + +Wraz z Johnem Gilmorem, innym zwolennikiem projektu GNU, założył firmę udzielającą konsultacji w dziedzinie korzystania i dostosowywania do potrzeb oprogramowania GNU. Cygnus Support, bo tak nazwano firmę, pierwszy kontrakt podpisał w lutym 1990 roku, a do końca roku miał już portfel kontraktów wart 725 000 dolarów. + +GNU Emacs, GDB i GCC13 to "wielka trójka" narzędzi dla programistów, ale nie były to jedyne programy stworzone przez Stallmana w pierwszej połowie dekady istnienia projektu GNU. Do roku 1999 stworzył on wersje GNU Bourne Shell (przemianowanego na Bourne Again Shell czyli BASH14), YACC15 (przemianowanego na Bison), awk (przemianowanego na gawk16). Każdy program GNU na wzór GCC projektowano tak, aby mógł być uruchamiany w różnych systemach, a nie tylko na platformie jednego dostawcy. Podczas udoskonalania elastyczności i wszechstronności programów Stallman i jego współpracownicy często zwiększali ich przydatność. + +Przypominając uniwersalistyczną filozofię GNU, Morin z Prime Time Freeware wskazuje na istotny i rozpowszechniony na świecie pakiet hello world17. "Program hello world liczy wszystkiego pięć linii kodu napisanego w C, ale jest opakowany, jakby był normalną dystrybucją GNU - mówi Morin. - Ma więc Textinfo (informacyjny plik tekstowy) i dane do konfiguracji. Dostał wszystkie dodatki inżynierii oprogramowania, jak wszystkie normalne pakiety GNU, dzięki czemu tak łatwo je instalować i uruchamiać na tak wielu różnych platformach. To diabelnie ważne i jest cechą nie tylko oprogramowania pisanego przez Stallmana lecz wszystkich pakietów tworzonych przez projekt GNU. + +Według Stallmana, ulepszanie oprogramowania to zadanie wtórne, zaś najważniejsze było budowanie nowych programów. "Każdy kawałek programu daje, bądź nie daje się ulepszyć - mówił Stallman w wywiadzie dla Byte'a. - Do pewnego stopnia korzystam z reimplementacji, która prowadzi do ulepszania programów. W pewnej dużej mierze wynika to z faktu, że siedzę w tej branży tak długo, że pracowałem z wieloma systemami. Z tego powodu mam wiele pomysłów do zastosowania"18. + +Do końca lat osiemdziesiątych narzędzia GNU zdążyły wyrobić sobie dobrą markę, a znana jeszcze z czasów AI Lab wybredność Stallmana stała się wprost legendarna w całym programistycznym świecie. + +Jeremy Alson, w latach osiemdziesiątych użytkownik Suna i programista realizujący własny projekt wolnego oprogramowania Samba, na początku lat dziewięćdziesiątych wspominał tę reputację ze śmiechem. Pod koniec lat osiemdziesiątych zaczął używać Emacsa. Zainspirowany rozwojem społeczności programistów, przesłał Stallmanowi fragment kodu jedynie po to, by został on odrzucony. + +"To coś w rodzaju nagłówka z "The Onion"19 - mówi Allison. - Modlącym się dzieciom Bóg odpowiedział: Nie". + +Rosnącemu uznaniu dla Stallmana programisty towarzyszyły kłopoty związane z zarządzaniem projektem GNU. Projekt odnosił jeden sukces za drugim w dziedzinie tworzenia narzędzi programistycznych, ale nie był w stanie stworzyć działającego jądra systemu, "centrali dowodzenia" wszystkich systemów uniksowych, decydującego o tym, które programy i narzędzia w danym momencie uzyskują dostęp do mikroprocesora. Zaczęło to wywoływać niepokój już pod koniec lat osiemdziesiątych. Jak w przypadku wielu innych zadań wykonywanych w projekcie GNU, Stallman rozpoczął pracę nad jądrem od poszukiwania istniejącego programu, który można by było zmodyfikować. Według informacji z "Gnusletters" ze stycznia 1987, przeglądał gruntownie TRIX, jądro uniksowe stworzone przez MIT. + +Przeglądając "GNUsletters", biuletyn informacyjny projektu GNU z końca lat osiemdziesiątych, wyczuwa się rosnące napięcie. W styczniu 1987 Stallman poinformował, że w ramach projektu GNU dokonywana jest dokładna analiza TRIX-a, uniksowego jądra stworzonego przez MIT. Rok później, w lutym 1988 roku, podano do wiadomości, że w centrum zainteresowania znalazł się Mach, lekkie "mikrojądro" opracowane przez Carnegie Mellon. Wszyscy przyznają jednak, że właściwe prace nad jądrem nie rozpoczęły się przed rokiem 199020. + +Opóźnienie prac nad jądrem było tylko jednym z problemów nękających wówczas Stallmana. W roku 1989 firma Lotus Development Corporation wystąpiła przeciwko swojemu rywalowi na rynku programistycznym, firmie Paperback Software International, oskarżając ją o skopiowanie poleceń menu z popularnego programu arkusza kalkulacyjnego 1-2-3. Nastąpiło to w tym samym czasie, gdy Apple i Microsoft toczyły walkę o "look and feel21". Razem wzięte przyczyniło się to do powstania dodatkowych kłopotów odczuwanych przy realizacji projektu GNU. Choć oba procesy w żadnej mierze nie dotyczyły projektu GNU, gdyż oba obracały się wokół systemów operacyjnych i aplikacji tworzonych dla komputerów osobistych niezgodnych sprzętowo z systemami uniksowymi, budziły jednak strach wśród wszystkich twórców oprogramowania. Stallman postanowił temu przeciwdziałać, więc wraz z kilkoma zaprzyjaźnionymi programistami umieścił w jednym z magazynów ogłoszenie uderzające w trwające procesy. W ślad za tym zorganizował grupę zwalczającą te zjawiska. Przyjęła ona nazwę League of Programming Freedom22 i rozpoczęła protesty przed siedzibą Lotus, Inc. i przed budynkiem sądu w Bostonie, w którym toczyła się rozprawa. + +Protest był zauważalny23. To, co się działo, było odbiciem ewolucji przemysłu programistycznego, w którym aplikacje, a nie sam system operacyjny, z wolna stawały się głównym przedmiotem sporów. Niespełnione dążenie GNU do stworzenia wolnego systemu operacyjnego zdawało się być anachronizmem. Rzeczywiście, fakt, że Stallman za nieodzowne uznał zebranie grupy zwalczającej procesy "look and feel", wielu odebrało jako oznakę starzenia się. + +W roku 1990 Fundacja Johna D. i Catherine T. MacArthurów uznała Stallmana za geniusza, nadając mu swoje członkostwo, co było połączone z wypłaceniem jego organizacji nagrody, tzw. "genius grant". Była to suma 240 tysięcy dolarów przeznaczona na rozwój projektu GNU. Projekt i głoszona idea wolnego oprogramowania na krótko stały się wówczas obiektem powszechnego zainteresowania. Przede wszystkim pozwoliło to Stallmanowi i wielu jego nieopłacanym współpracownikom z Fundacji Wolnego Oprogramowania, dotychczas dorabiającym różnymi kontraktami konsultingowymi, poświęcić więcej czasu na pisanie kodów dla projektu GNU. + +Zabawne, że ta nagroda umożliwiła Stalmanowi także udział w głosowaniu. Kilka miesięcy przed jej przyznaniem pożar w mieszkaniu strawił niewiele rzeczy, które posiadał. Do czasu przyznania nagrody mieszkał jako "dziki lokator"24 na Technology Square 545. "Komisarz wyborczy za nic nie chciał uznać, że taki jest mój adres - wspomina. - Pogodził się z tym dopiero wtedy, gdy ta informacja została potwierdzona w artykule prasowym o nagrodzie MacArthura.25" + +Najważniejsze, że nagroda MacArthura dała Stallmanowi więcej swobody. Poświęcony bez reszty idei wolności oprogramowania, wykorzystał otrzymaną wolność na podróże wspierające misję projektu GNU. + +Ciekawe, że jedna z tych podróży rzeczywiście przyczyniła się do ostatecznego sukcesu projektu GNU i ruchu wolnego oprogramowania. W roku 1990 Stallman odwiedził Politechnikę w Helsinkach w Finlandii. Wśród jego słuchaczy znalazł się 21-letni Linus Torvalds, późniejszy twórca jądra Linuksa, elementu, który wypełnił dotkliwą lukę w oprogramowaniu projektu GNU. + +Torvalds, wówczas student pobliskiego Uniwersytetu Helsińskiego, spoglądał na Stallmana bez entuzjazmu. "Zobaczyłem po raz pierwszy w życiu typowego długowłosego i brodatego hakera" - wspomina w swojej autobiografii "Just for Fun" wydanej w roku 200126 i 27. + +Choć nie całkiem odpowiadała mu "socjopolityczna" strona zadań wyliczonych przez Stallmana28, doceniał logikę zasadniczego założenia, że żaden programista nie pisze bezbłędnych kodów, a udostępnianie ich innym oznacza stawianie postępu ponad indywidualną żądzę zysku i chronienia własnego ego.29 + +Jak wielu programistów z jego pokolenia, Torvalds nie zajął się problemami wielkich komputerów "mainframe", lecz "zatopił zęby" w różnobarwnej i niejednorodnej materii systemów komputerów osobistych. Jako student i użytkownik uniwersyteckiego MicroVAXa, uczynił pierwszy krok, przechodząc od programowania w C do zagadnień systemu Unix. To wykonanie jednego kroku do przodu pozwoliło mu z innej perspektywy zobaczyć bariery broniące dostępu do maszyny. Dla Stallmana główną przeszkodą były biurokracja i przywileje, zaś dla Torvaldsa - geografia i ostra helsińska zima. Zmuszony brnąć przez teren uniwersytetu po to, by zalogować się do systemu uniksowego, rychło zaczął szukać możliwości łączenia się systemem bez wysuwania nosa ze swej ciepłej kwatery w uczelnianym campusie. + +Te poszukiwania doprowadziły go do systemu Minix30, wersji "wagi lekkiej" Uniksa napisanej w celach edukacyjnych przez profesora holenderskiego uniwersytetu Andrew Tanenbauma. System pasował do ograniczonych parametrów, zwłaszcza niewielkiej pamięci PC 386, najpotężniejszej maszyny, na jaką Torvalds mógł sobie pozwolić, ale brakowało mu niektórych funkcji. Przede wszystkim nie pozwalał na emulację terminalu, co pozwalałoby na pełnienie roli terminalu uniwersyteckiego i logowanie się do MicroVAX-a z domu. + +Latem 1991 roku Torvalds przetworzył od podstaw kod Minixa, dodając brakujące funkcje. Pod koniec lata zaczął określać swą pracę jako "terminalowe programy emulacyjne GNU/Emacs"31. Poczuł się wystarczająco pewny siebie, by poprosić miniksową grupę dyskusyjną o kopie standardów POSIX32, zbioru podstawowych zasad programistycznych, decydujących o tym, czy program można uznać za zgodny z Uniksem. Kilka tygodni później wysłał komunikat, bardzo przypominający stallmanowską zapowiedź powstania GNU w roku 1983: + +Pozdrawiam wszystkich, którzy używają minixa +Robię (wolny) system operacyjny (jako hobby, więc +nie będzie wielki i profesjonalny jak gnu dla +klonów 386 (486) AT). Szykuję to od kwietnia i +zbliżam się do końca. Czekam na odzew o tym, co +ludzie lubią/nie lubią w minixie, który mój system +przypomina (fizycznie ten sam układ systemu plików +(z przyczyn praktycznych) i podobne inne rzeczy)33. + +Komunikat spotkał się z niewielkim odzewem, a w ciągu miesiąca Torvalds opublikował wersję 0.01 swego systemu operacyjnego, co oznacza, że została ona udostępniona na serwerze FTP34. Stanęło przed nim zadanie nadania systemowi nazwy. Na dysku swojego własnego PC-ta zapisał ten program35 pod nazwą Linux, zgodną z zasadą, że nazwy różnych wariantów Uniksa powinny się kończyć na X. Uznając ją jednak za "egoistyczną", zmienił ją na Freakx - chyba tylko po to, by administrator serwera FTP mógł dokonać zmiany odwrotnej. + +Choć Torvalds założył zbudowanie pełnego systemu operacyjnego, zarówno on, jak i inni programiści doskonale wiedzieli, że wiele narzędzi jest już gotowych dzięki pracy GNU, BSD i innych programistów tworzących wolne oprogramowanie. Jednym z pierwszych narzędzi, z których skorzystała grupa twórców Linuksa, był GCC (GNU C Compiler), narzędzie pozwalające na przystosowanie do działania programów napisanych w języku C. + +Integracja z GCC zwiększyła wydajność i możliwości Linuksa, co podniosło jego rangę. Choć "wirusowa" natura GPL nie miała zastosowania do jądra Linuksa, Torvalds, pragnąc pożyczyć GCC do własnych celów, zaciągnął zobowiązanie zwrócenia długu. Potem ujął to następująco: "Wzniosłem się na barkach olbrzymów"36 i 37. Nie zaskakuje, że zaczął rozmyślać, co by się stało, gdyby inni oczekiwali takiej samej pomocy. W dziesięć lat później zgodził się ze słowami Roberta Chassela z Fundacji Wolnego oprogramowania, który w następujący sposób podsumował jego ówczesne myśli: + + Na zrobienie tego poświęciłem sześć miesięcy życia i chcę to udostępnić innym i dostać coś w zamian, ale nie chcę, aby inni czerpali z tego dla własnych korzyści. Chciałem, aby ludzie zobaczyli Linuksa, aby go zmieniali i ulepszali dla własnej satysfakcji, ale jednocześnie chciałem mieć dostęp do źródeł, aby móc robić te same ulepszenia, co oni.38 + +Gdy nadszedł czas wydania wersji Linux 0.12, pierwszej w pełni zintegrowanej z GCC, Torvalds postanowił zgłosić przystąpienie do ruchu wolnego oprogramowania. Odrzucił starą licencję jądra systemu i zastąpił ją przez GPL, co zaowocowało potokiem adaptacji i Torvalds wraz ze współpracownikami mógł się przyglądać, jak wiele programów GNU wpada do kotła z "linuksowym gulaszem". W ciągu trzech lat linuksowi programiści mogli już pokazać Linuksa 1.0, zawierającego pełne i zmodyfikowane wersje GCC i GDB, oraz wiele narzędzi zaczerpniętych z BSD. + +Do roku 1994 ten amalgamatyczny system operacyjny zdobył sobie już taki szacunek w hakerskim świecie, że niektórzy obserwatorzy zaczęli się interesować, czy Torvalds, zgadzając się na GPL, nie oddał "za frajer" kury znoszącej złote jaja. W pierwszym wydaniu Linux Journal wydawca Robert Young przeprowadził z nim wywiad. Gdy spytał fińskiego programistę, czy żałuje, że zrzekł się prawa własności do kodu źródłowego Linuksa, Torvalds zaprzeczył: "Nawet patrząc wstecz, na 100% uważam przyjęcie GPL za jedną z najlepszych decyzji, jakie podjąłem we wczesnej fazie projektu"39. + +Fakt, że decyzja ta została podjęta bez odwoływania się do Stallmana i Fundacji Wolnego oprogramowania, świadczy o rosnącej przenośności GPL. Dopiero po paru latach Stallman uświadomił sobie, że siłą rozprzestrzeniania się Linuks przypomina zdarzenia dotyczące Emacsa. Tym razem przyczyną nie były sztuczki hakerskie w rodzaju Ctrl+R lecz nowość, jaką było działanie systemu uniksowego na komputerach o architekturze PC-tów. Motywy działania były różne, ale rezultat końcowy był zgodny z założeniami etycznymi: powstał wolny, w pełni funkcjonalny system operacyjny. + +Jak zapowiadał pierwszy e-mailowy komunikat wysłany przed kilkoma miesiącami do grupy comp.os.minix, Torvalds spodziewał się, że po ukończeniu przez programistów GNU jądra HURD40 jego system rychło stanie się przeżytkiem. Ta początkowa niechęć spojrzenia na Linuksa z punktu widzenia korzyści politycznych, okazała się ciosem, który Fundacja Wolnego Oprogramowania sama sobie wymierzyła. + +Jak zauważa Torvalds, był on tylko jednym z wielu dzieciaków, które gdzieś tam z boku robiły różne rzeczy dla zabawy. Pomimo to, patrząc wstecz na oszałamiający sukces projektu, uznaje mądrość swej młodzieńczej decyzji zaakceptowania GPL, bez czego jego system mógł zakończyć żywot na jakimś zapomnianym przez wszystkich dysku twardym. + +"A mogłem tego światełka nie spostrzec - pisze, wspominając wykład Stallmana na Politecnice Helsińskiej w roku 1991 i wynikającą z tego decyzję przyjęcia GPL. - Widocznie jednak coś wtedy zapadło w moją duszę"41. + + +Rozdział 10. +GNU/Linux + +Przed rokiem 1993 ruch wolnego oprogramowania znalazł się na rozdrożu. Optymiści twierdzili, że wszystkie znaki na niebie i ziemi wskazują na zwycięstwo kultury hakerskiej. Magazyny sieciowe, dziwaczne nowe publikacje z opowiadaniami o szyfrowaniu danych, Usenecie i wolności oprogramowania zaczęły gwałtownie znikać z półek. Internet - jeszcze niedawno slangowe określenie używane tylko przez hakerów i naukowców - znalazło swe miejsce w powszechnie używanym słownictwie. Używał go nawet prezydent Clinton. Komputer osobisty, do niedawna jedynie zabawka hobbystów, stał się powszechnie uznawanym narzędziem dającym nowemu pokoleniu użytkowników dostęp do stworzonego przez hakerów oprogramowania. A skoro projekt GNU nie dostarczył jeszcze pełnego, wolnego systemu operacyjnego, ciekawscy użytkownicy, czekając nań, zajęli się wypróbowywaniem Linuksa. + +Jakby na to nie patrzyć, wiadomości były dobre i po dekadzie walki o przetrwanie hakerzy wraz z promowanymi przez siebie wartościami poczęli zdobywać akceptację społeczną. Ludzie zaczęli "w to wchodzić". + +Czy aby na pewno? Pesymiści twierdzili, że każdy znak akceptacji niesie ze sobą kolejny problem. Nagle okazało się, że świetnie być hakerem, ale czy było to dobre dla kultury, która dotychczas rozwijała się w odosobnieniu? Oczywiście, Biały Dom wychwalał Internet, a nawet zarejestrował własną domenę whitehouse.gov, ale towarzyszyły temu kontakty z firmami, zwolennikami cenzury i wpływowymi osobistościami dążącymi do prawnego postawienia tamy kulturze internetowego "dzikiego zachodu". Oczywiście, PC-ty stawały się coraz potężniejsze, ale w wyniku opanowania ich rynku przez chipy Intela znacznie wzmocniła się pozycja dostawców oprogramowania z prywatnymi prawami własności. Na każdego użytkownika, który wybierał wolny system Linux, przypadały setki lub tysiące innych, którzy zaczynali od uruchamiania komputera z preinstalowanym systemem Windows. + +Do tego dochodziła osobliwa natura Linuksa. Nie ograniczony błędami projektowymi (jak GNU) i debatami prawniczymi (jak BSD), błyskawiczny rozwój Linuksa nie był zaplanowany, a sukces tak przypadkowy i nieoczekiwany, że programiści najbliżej zaznajomieni z kodem, nie wiedzieli, co z tym począć. Była to raczej składanka niż system operacyjny, album, do którego wklejono hity oprogramowania, wszystko - od GCC, GDB i glicb (nowej biblioteki C projektu GNU), przez X (uniksowy interfejs graniczny stworzony przez MIT Laboratory for Computer Science), po opracowane przez BSD narzędzia, takie jak BIND (ang. Berkeley Internet Naming Daemon - pozwalający zastąpić liczbowe adresy IP przez łatwe do zapamiętania nazwy domen) i TCP/IP. Oczywiście, zwornikiem tej konstrukcji było jądro Linuksa - przenicowane i doładowane jądro Minixa. Zamiast budować system od podstaw Torvalds i jego grupa postąpili zgodnie z sentencją Picassa, że "dobrzy artyści pożyczają, wielcy artyści kradną". Później Torvalds, wyjaśniając tajemnicę sukcesu, tak to określił: "Jestem z natury bardzo leniwy i lubię polegać na tym, co robią inni"1. + +Takie lenistwo, choć godne pochwały z punktu widzenia efektywności, z powodów politycznych sprawiało kłopoty. Podkreślało brak celów ideologicznych. W przeciwieństwie do twórców GNU, Torvalds nie budował systemu operacyjnego z powodu chęci dostarczenia narzędzia kolegom hakerom; zbudował coś, czego sam potrzebował. Jak Tomek Sawyer bielący płot Torvalds nie zajmował się wizją ogólną lecz raczej zatrudnianiem innych hakerów w celu szybszego osiągnięcia wyniku. + +Dlaczego więc jemu i współpracującym z nim hakerom udało się to, na czym inni polegli, i czym właściwie jest Linux? Czy jest to wyraz filozofii wolnego oprogramowania ogłoszonej w manifeście GNU napisanym przez Stallmana? A może to zwykły amalgamat świetnych narzędzi, które inni podobnie myślący również byliby w stanie zmontować w system? + +Przed upływem roku 1993 rosnąca liczba użytkowników Linuksa zaczęła się skłaniać ku tej drugiej definicji i zaczęła tworzyć przeróżne opinie na jego temat. Znaleźli się nawet tacy, którzy ośmielili się swoje wariacje na temat systemu nieco inaczej opakować i przedstawić uniksowym aficionados2 jako oddzielne "dystrybucje". Rezultaty, nawet przy dobrej woli, trzeba nazwać partaniną. + +"Było to jeszcze przed pojawieniem się Red Hata i innych komercyjnych dystrybucji - wspomina Ian Murdock, w owym czasie student Purdue University3. - W każdym uniksowym piśmie można było znaleźć kilka ogłoszeń wielkości wizytówki reklamujących "Linux". Często były to firmy "krzaki", które nie widziały nic złego w próbie dodania własnego fragmentu do ogólnej składanki". + +Murdock, uniksowy programista, został pochłonięty przez Linksa w chwili, gdy po raz pierwszy zainstalował go na swoim komputerze. "To była wspaniała zabawa - mówi. - Wciągnęło mnie to". Jego zapał przygasił nieco zalew marnie napisanych dodatków. Zdecydował, że najlepszym rozwiązaniem będzie skonstruowanie wersji Linuksa oczyszczonego ze wszystkiego, co do niego doczepiono, więc przystąpił do sporządzania listy najlepszych dostępnych narzędzi programistycznych z zamiarem włączenia ich do własnej dystrybucji. "Chciałem stworzyć coś wartego nazwy Linuksa" - powiada. + +Aby wzbudzić zainteresowanie innych, ogłosił swe zamiary w Internecie, również w grupie usenetowej comp.os.linux. Jeden z pierwszych e-maili, które otrzymał, pochodził od rms@ai.mit.edu. Jako haker, natychmiast rozpoznał autora. Był to Richard M. Stallman, twórca projektu GNU i człowiek znany Murdockowi jako "haker hakerów". Widok e-maila od Stallmana w skrzynce własnej poczty elektronicznej zdziwił go. Dlaczego, u diabła, Stallman, tworzący własny system operacyjny, miałby się interesować faktem, że on postanowił zająć się Linuksem? + +Otworzył e-mail. + +"Stallman pisał, że Fundacja Wolnego Oprogramowania zaczyna dokładnie przyglądać się Linuksowi i także być może będzie zainteresowana stworzeniem z niego systemu. Z grubsza można powiedzieć, iż Stallman sądził, że nasze zamierzenia są zgodne z ich filozofią". + +Ten komunikat był odbiciem dramatycznej sytuacji Stallmana. Aż do roku 1993 nie wtykał on nosa w zdarzenia zachodzące wewnątrz linuksowej społeczności. Prawdę mówiąc, rozmyślnie unikał renegackiego systemu operacyjnego od chwili, gdy po raz pierwszy pojawił się on na horyzoncie w roku 1991. Po otrzymaniu pierwszej wiadomości o uniksopodobnym systemie operacyjnym działającym na PC-tach zbadanie sprawy polecił jednemu z przyjaciół. "Powiedział mi - mówi Stallman, - że to oprogramowanie jest naśladownictwem Systemu V, pośledniej wersji Uniksa. Dodał, że nie jest przenośne". + +Raport przyjaciela był słuszny. Linuks, zbudowany specjalnie dla PC 386, wykorzystywał maksymalnie możliwości tej technicznie ubogiej maszyny. Jednakże przyjaciel zapomniał wspomnieć o tym, że wielką wartością Linuksa było jego istnienie jako jedynego systemu operacyjnego, który można było swobodnie modyfikować. Innymi słowy, w ciągu następnych trzech lat, które Stallman spędził na wysłuchiwaniu raportów o błędach składanych przez zespół pracujący nad stworzeniem HURD-a, Torvalds wysunął się przed programistów, którzy mieli później zająć się adaptacją Linuksa na inne platformy sprzętowe. + +Do roku 1993 brak działającego jądra systemu projektu GNU stał się przyczyną kłopotów nie tylko grupy ludzi bezpośrednio w projekt zaangażowanych, lecz także całego ruchu wolnego oprogramowania. W marcu 1993 magazyn "Wired" w artykule napisanym przez Simsona Garfinkela poinformował, że projekt GNU "zapada się w grzęzawisko" pomimo sukcesów w tworzeniu wielu świetnych narzędzi4. Tym, którzy tkwili wewnątrz projektu i związanej z nim organizacji pozarządowej - Fundacji Wolnego Oprogramowania sytuacja wydawała się jeszcze gorsza od przedstawionej w artykule Garfinkela. "Było jasne, przynajmniej dla mnie, że los uśmiechnął się do nas, dając okienko, czyli czas na wprowadzenia nowego systemu operacyjnego - twierdzi Chassel. - Gdy się to okienko zamknęło, ludzie zaczęli tracić zainteresowanie. Właśnie to się zdarzyło"5. + +Wielokrotnie analizowano przyczyny trudności, które dotknęły projekt GNU w latach 1990-1993. Niektórzy winą obciążali Stallmana, ale - jak twierdzi Eric Raymond, niegdyś członek zespołu GNU Emacs, a później krytyk Stallmana - problem miał bardziej instytucjonalny charakter. "FSF stała się arogancka - uważa Raymond. - Odeszła od tworzenia gotowego do działania systemu operacyjnego w stronę badań nad systemem. Nawet gorzej, bo sądzili, że nikt spoza Fundacji nie może mieć wpływu na ich pracę". + +Murdock, osoba mniej wtajemniczona w wewnętrzne sprawy projektu GNU, widzi rzecz łagodniej. "Myślę, że częściową przyczyną kłopotów była ich wygórowana ambicja - zbyt wiele wysiłków marnotrawili na poprawianie błędów" - twierdzi. W latach osiemdziesiątych i dziewięćdziesiątych mikrojądra były gorącym tematem. Nieszczęściem projektu GNU było przystąpienie do budowy własnego jądra właśnie w tym czasie. Spowodowało to wielkie obciążenie prac i konieczność usilnego "pedałowania wstecz" w celu pozbycia się zbędnego bagażu. + +Stallman podaje wiele przyczyn wyjaśniających opóźnienie. Procesowanie się Lotusa z Apple odciągało uwagę, do tego doszła czasowa niezdolność Stallmana do używania klawiatury, co utrudniało mu udzielanie pomocy zespołowi pracującemu nad HURD-em. Inną przyczyną była marna wymiana informacji między różnymi częściami projektu GNU. "Mieliśmy wiele kłopotów z zachowaniem możliwości debuggowania środowiska, a zespół GDB w tym czasie nie był zbyt chętny do współpracy". Jednakże przyznaje, że główną przyczyną był fakt, iż on i jego współpracownicy nie docenili trudności, jakie sprawiało rozszerzenie mikrojądra Mach do postaci pełnego jądra uniksowego. + +"Myślałem: OK, część (Mach), która ma się dogadać z maszyną, już została zdebuggowana - mówił Stallman, wspominając kłopoty z HURD-em w przemówieniu z roku 2000. - Mając gotową głowę, powinniśmy resztę dorobić znacznie szybciej, ale okazało się, że debuggowanie tych asynchronicznych wielowątkowych programów było nie lada kłopotem. Wyznaczone terminy mijały i bieg czasu mógł zniweczyć nasze wysiłki. W rezultacie wyglądało na to, że wersja testowa pojawi się dopiero po latach6. + +Jak by się nie usprawiedliwiać, stworzenie jądra Linux przez konkurencyjny zespół zrodziło napiętą sytuację. Oczywiście, jądro to pojawiło się z licencją GPL, ale - jak zauważa Murdock - chęć uznania Linuksa za podstawowy system wolnego oprogramowania była niewielka. Do końca roku 1993 liczba jego użytkowników wzrosła od mniej więcej tuzina entuzjastów Miniksa do pułapu gdzieś między 20 a 100 tys.7 To, co kiedyś było jedynie hobby, stało się rynkiem dojrzałym do eksploatacji. Gdy doszło do uznania zwycięstwa Linuksa, Stallmanem miotały mieszane uczucia - jak niegdyś Churchillem patrzącym na wkraczanie do Berlina sowieckich oddziałów8. + +Choć Stallman późno zasiadł do gry, ma w niej jednak swój udział. Gdy tylko FSF ogłosiła, że jest gotowa poprzeć finansowo i moralnie projekt Murdocka, zaczęły napływać kolejne oferty wsparcia. Murdock nadał projektowi nazwę Debian - co było kompilacją imion jego żony i jego: Deborah i Ian - i już po kilku tygodniach przedstawił pierwszą gotową dystrybucję. "(Poparcie Richarda) niemal w ciągu jednej nocy przekształciło Debian z małego, interesującego niewiele osób, lokalnego projektu w przedsięwzięcie, na które niemal cała społeczność zwróciła uwagę" - twierdzi Murdock. + +W styczniu 1994 roku Murdock wydał "Manifest Debian". Napisany w duchu stallmanowskiego, wydanego przed dekadą, "Manifestu GNU", wyjaśnia wagę współpracy z Fundacją Wolego Oprogramowania (FSF). Murdock pisze9: + + Fundacja Free Software Foundation może odegrać niezmiernie ważną rolę w przyszłości Debiana. Już poprzez fakt udostępniania go przez tę organizację świat otrzyma sygnał, że Linux nie jest produktem komercyjnym i nigdy nie powinien nim zostać. Nie znaczy to, iż nigdy nie będzie mógł stanowić konkurencji na polu komercyjnym. Tym, którzy mają przeciwne zdanie, polecam przyjrzenie się fenomenowi programów GNU Emacs albo GCC, które nie są aplikacjami komercyjnymi, a jednak wywołały spore zamieszanie na rynku podobnego oprogramowania. + +Przyszedł czas bardziej skoncentrować się na przyszłości Linuksa niż na nieetycznym celu, jakim jest wzbogacanie się kosztem całej linuksowej społeczności. Rozwój i dystrybucja Debiana niekoniecznie stanowią rozwiązanie problemów, których obraz naszkicowałem w manifeście, ale mam nadzieję, że przynajmniej zwrócą na nie uwagę i w rezultacie doprowadzą do ich rozwiązania10. + +Krótko po wydaniu manifestu Fundacja Wolnego Oprogramowania wysunęła swe pierwsze żądanie. Stallman chciał, aby Murdock nadał dystrybucji nazwę "GNU/Linux". Jak twierdzi Murdock, Stallman najpierw zaproponował nazwę Lignux, jako "Linux z GNU w sercu", ale krótkotrwałe próby użycia tej nazwy na listach Usenetu wywołały liczne drwiny hakerskiej braci, co skłoniło Stallmana do przyjęcia mniej niezręcznej nazwy GNU/Linux. + +Choć niektórzy uznali żądanie Stallmana za niewczesne wyciąganie ręki po czyjąś chwałę, Murdock widział to inaczej. Sięgając myślą wstecz, widzi to jako echo kontrowersji i wzrostu napięcia między projektem GNU i grupą twórców linuksowego jądra. "Wyraźnie było widać pojawiający się rozdźwięk - wspomina. - Richard przejął się tym". + +Przyczyną najgłębszego podziału była glibc. glibc to skrót od GNU C Library (biblioteka GNU C), którym nazwano pakiet programów pozwalających programistom na kierowanie do jądra "wywołań systemowych" (wywołań usług systemowych). W latach 1993 - 1994 glibc była "wąskim gardłem" Linuksa. Ponieważ wielu użytkowników dodawało do jądra swe własne funkcje, ludzie pracujący w projekcie GNU nad utrzymaniem glibc zostali wkrótce przytłoczeni nadmiarem żądań. Część użytkowników Linuksa, sfrustrowanych opóźnieniami i szerzącym się przekonaniem o rozlazłości projektu GNU, domagała się "rozwidlenia" działań i stworzenia równoległej do glibc biblioteki C. + +W świecie hakerskim rozwidlenia są ciekawym zjawiskiem. Choć zasady etyki hakerskiej zezwalają programistom na dowolne przerabianie w kodzie źródłowym wszystkiego, na co mają ochotę, większość woli umieszczać swe zmiany w centralnym pliku źródłowym lub w "drzewie", aby zapewnić zgodność z programami tworzonymi przez innych. Rozwidlenie glibc na tak wczesnym etapie rozwoju systemu groziło potencjalną utratą setek, a być może tysięcy przyszłych linuksowych programistów. Groziło to także zwiększeniem niezgodności Linuksa i reszty systemu GNU, nad którą Stallman i jego grupa nadal pracowali. + +Jako lider projektu GNU Stallman w roku 1991 już doświadczył negatywnych rezultatów rozwidlenia oprogramowania. Grupa twórców Emacsa pracująca dla programistycznej firmy Lucid przeszła do porządku dziennego nad niechęcią Stallmana do uwzględniania części poprawek w podstawowym kodzie GNU Emacsa. Doprowadziło to do powstania równoległej wersji Lucid Emacs oraz wielu kłopotów i starć11. + +Murdock twierdzi, że Debian wyrósł z takich samych chęci rozwidlenia kodu, które leżały u podstaw żądań dotyczących glibc. Dlatego właśnie Stallman domagał się umieszczenia cząstki GNU, gdy tylko Debian stało się dystrybucja zdatną do rozpowszechniania. "Dzięki temu rozwidlające się drogi zbiegły się ponownie, jednakże społeczność linuksowa nadal odczuwała swą odrębność w stosunku do społeczności GNU, co mogło stać się siłą niszczącą jedność". + +Stallman potwierdza opinię Murdocka. Jak twierdzi, powstawaniu wszystkich najważniejszych elementów projektu GNU towarzyszyła groźba rozwidlenia. Mówi, że z początku uważał rozwidlenie za wynik rozczarowania, zawiedzenia nadziei. W przeciwieństwie do szybko działającej nieformalnej grupy twórców jądra Linuksa, pracujący dla GNU programiści starali się pracować wolniej, bez gwałtownego dostosowywania się do okoliczności, ale z myślą o przygotowaniu zmian, które będą miały znaczenie dla działania systemu w długim czasie. Nie obawiali się ostrej krytyki innych twórców kodu. Jednakże w miarę upływu czasu Stallman, czytając e-maile napływające od innych linuksowych programistów, wyczuł malejące zainteresowanie projektem GNU i jego celami. + +"Odkryliśmy, że ludzie uważający się za linuksowych programistów przestają się interesować projektem GNU - mówi Stallman. - Mówili Dlaczego mam się tym przejmować? Co mnie obchodzi projekt GNU? Pracują dla nas, użytkowników Linuksa, a poza tym, co mi do tego. Zastanawiające było, że nawet ludzie używający jakiegoś wariantu systemu GNU sam projekt GNU mieli w nosie." + +Choć kilka wcześniejszych opisów Linuksa jako "wariantu" projektu GNU wydawało mu się chwytem politycznym, Murdock, sympatyzujący z racjami wolnego oprogramowania, uznał za uzasadnione żądanie Stallmana, by Debianowi nadać nazwę GNU/Linux. "Przystałem na to bardziej ze względu na jedność niż z powodu uznania zasług" - mówi. + +Potem nastąpiły żądania natury bardziej technicznej. Choć Murdock przystosował się do żądań politycznych, usztywnił swą pozycję, gdy przyszło do ustalania zasad rozwoju istniejącego oprogramowania. To, co zaczęło się jako manifestacja solidarności, rychło stało się modelem dla innych projektów GNU. + +"Muszę przyznać, że często się z nim nie zgadzałem - mówi Murdock ze śmiechem. - Z Richardem naprawdę trudno współpracować". + +Po uzyskaniu dyplomu Purdue w roku 1996 Murdock postanowił przekazać innym sterowanie rozwijającym się projektem Debian. Obowiązki zarządcy powierzył Bruce'owi Perensowi, hakerowi znanemu z pracy przy Electric Fence, narzędziu uniksowym z licencją GPL. Perens, tak samo jak Murdock, był programistą uniksowym, który zakochał się w GNU/Linuksie, gdy tylko stały się widoczne jego uniksopodobne możliwości. Podobnie jak Murdock sympatyzował z politycznym przesłaniem Stallmana i Fundacji Wolnego Oprogramowania, jednak zachowywał pewien dystans. + +"Pamiętam, że wkrótce po ogłoszeniu manifestu GNU, wypuszczeniu GNU Emacsa i GCC wyczytałem w jakimś artykule prasowym, iż Stallman pracuje jako konsultant Intela - mówi Perens, wspominając swoje pierwsze starcie ze Stallmanem w roku 1980. - Napisałem do niego, pytając, w jaki sposób godzi rolę adwokata wolnego oprogramowania z funkcją konsultanta Intela. Odpowiedział: Pracuję jako konsultant do spraw tworzenia wolnego oprogramowania. Odpowiedź była bardzo grzeczna i myślę, że sensowna". + +Jednakże przyjmując na siebie obowiązki kierowania rozwojem Debiana, Perens uznał starcia Murdocka ze Stallmanem za kłopotliwe. Stając na czele zespołu, podjął strategiczną decyzję o oddzieleniu Debian od Fundacji Wolnego Oprogramowania. "Zdecydowałem, że nie możemy przystać na stallmanowski styl mikrozarządzania" - mówi. + +Według Perensa, ta decyzja zaskoczyła Stallmana, ale był wystarczająco mądry, by przejść nad nią do porządku dziennego. "Odczekał nieco, by ochłonąć i wysłał e-mail, który był istotny dla ustalenia wzajemnych stosunków. Zażądał zachowania nazwy GNU/Linux, na co przystałem. Decyzję podjąłem samodzielnie. Wszyscy odetchnęli z ulgą." + +Po pewnym czasie Debian zdobył opinię hakerskiej wersji Linuksa, podobnie jak Slackware, inna popularna dystrybucja powstała w latach 1993-1994. Jednakże Linux zaczął zdobywać pozycję na komercyjnym rynku uniksowym. W Północnej Karolinie firma uniksowa o nazwie Red Hat przestawiła swoją działalność na linuksowe tory. Jej dyrektorem naczelnym był Robert Young, wcześniej wydawca Linux Journal12, który w roku 1994 zapytał Linusa Torvaldsa, czy żałuje decyzji podporządkowania linuksowego jądra licencji GNU. Odpowiedź Torvaldsa znacznie wpłynęła na sposób postrzegania Linuksa przez Younga. Zamiast dążyć do zepchnięcia go w kąt rynku oprogramowania za pomocą tradycyjnie stosowanej taktyki, Young zaczął się zastanawiać nad zastosowaniem w firmie podejścia debianowskiego, budowania kompletnego systemu operacyjnego z całkowicie wolnych elementów. Cygnus Solutions, firma założona w roku 1990 przez Michaela Tiemanna i Johna Gilmore'a, pokazała już możliwość sprzedawania usług polegających na poprawianiu jakości i dostosowywaniu wolnego oprogramowania do potrzeb klientów. Co by się stało, gdyby Red Hat w ten sam sposób podszedł do Linuksa? + +"W zachodniej tradycji naukowej my dzisiaj stoimy na ramionach gigantów - powtarza Young za Torvaldsem i Newtonem. - W języku biznesu mówimy, że koła nie należy wciąż odkrywać na nowo. O pięknie licencji GPL stanowi oddanie kodu domenie publicznej13. Jeżeli jesteś niezależnym dostawcą oprogramowania i do stworzenia jakiejś aplikacji jest ci potrzebny program wdzwaniający się przez modem (modem dialer), zamiast pisać go od nowa możesz wziąć PPP z Red Hat Linuksa i użyć go jako narzędzia we własnym programie. Jeżeli potrzebujesz zestawu narzędzi graficznych, nie musisz pisać od nowa całej biblioteki graficznej. Po prostu ściągasz GTK14. Nagle masz możliwość korzystania z najlepszego, co dotychczas zostało zrobione. Jako dostawca aplikacji mniej czasu musisz poświęcać na zarządzanie oprogramowaniem i możesz go przeznaczyć na pisanie kodu aplikacji dostosowującej narzędzia do specyficznych potrzeb klienta.". + +Young nie był jedynym zarządcą firmy zainteresowanym możliwościami biznesowego wykorzystania wolnego oprogramowania. Do końca roku 1996 większość firm uniksowych przebudziła się, węsząc zapach "świeżo warzonego" kodu. Sektor linuksowy był dopiero dobre dwa, trzy lata przed pełnym komercyjnym przełomem, ale ci, którzy byli blisko hakerskiej społeczności, już "czuli pismo nosem", przewidywali wielkie wydarzenia. Chip 386 Intela, Internet i World Wide Web uderzyły w rynek jak wielkie oceaniczne fale, ale największą okazał się Linux i korzystające z niego oprogramowanie wraz ze wspólną liberalną polityką licencyjną i wolnością korzystania z kodów źródłowych. + +Dla Iana Murdocka, najpierw zwolennika Stallmana, później odstręczonego przez jego styl zarządzania, napływająca fala zdawała się należną nagrodą i należną karą dla człowieka, który znaczną część życia poświęcił na nadanie wolnemu oprogramowaniu własnej tożsamości. Jak wielu linuksowych aficionados, Murdock widział, jak naprawdę wszystko się działo. Był świadkiem oryginalnego ostrzeżenie Torvaldsa, że Linux "jest tylko hobby", a także wyznania Torvaldsa pod adresem twórcy Miniksa Andrew Tanenbauma, że: "gdyby jądro GNU było tego lata gotowe, w ogóle nie przystępowałbym do realizacji swojego projektu"15. Tak jak inni Murdock widział możliwości, które zostały zmarnowane. Odczuwał także podniecenie, jakie niosło obserwowanie nowych możliwości niesionych przez każde nowe "włókno" Internetu. + +"Dzięki Linuksowi tkwiłem w tej zabawie od początku - wspomina. - Mieliśmy wówczas coś do zrobienia, aby jakoś wykorzystać upływający czas. Jeżeli poczytacie tamte stare dyskusje (comp.os.minix), wyczujecie sentymentalną nutę: robiliśmy coś, w co mogliśmy się bawić dopóty, dopóki nie pojawi się gotowy HURD. Ludzie byli podnieceni. To zabawne, ale podejrzewam, że gdyby HURD powstał wcześniej, Linux nigdy by się nie przydarzył". + +Przed końcem roku 1996 pojawiły się kwestie sporne. Użytkownicy dyskutowali, jak to nazwać - Linux, a może GNU/Linux. 36 miesięcy pozostawionych na stworzenie jądra dobiegło kresu, okno zostało zatrzaśnięte, co oznacza, że gdyby nawet projekt GNU zbudował wreszcie swe jądro HURD, miałoby ono niewielkie szanse na zauważenie przez kogoś spoza ścisłego grona hakerskiej społeczności. Pierwszy uniksopodobny wolny system operacyjny już istniał i nabierał pędu. Hakerom pozostało jedynie oczekiwanie na kolejną falę, która miała nadciągnąć i spaść na ich głowy. Nawet na kudłatą głowę Richarda M. Stallmana. + +Gotową na to lub nie. + + +Rozdział 11. +OprogramowanieOpen Source1 + +W listopadzie 1995 Peter Salus, członek Fundacji Wolnego Oprogramowania, autor książki z roku 1994 A Quarter Century of Unix (Ćwierć wieku Uniksa), przesłał do listy dyskusyjnej zajmującej się systemami projektu GNU prośbę o nadsyłanie artykułów konferencyjnych. Conference on Freely Redistributable Software (konferencja na temat swobodnie rozpowszechnianego oprogramowania) miała być zorganizowana w Cambridge w stanie Massachusetts w lutym 1996, a Salus, wybrany na jej przewodniczącego, chciał w ten sposób zawiadomić o tym kolegów hakerów. Sponsorowana przez Fundację Wolnego Oprogramowania, miała stać się pierwszą konferencją inżynierii oprogramowania w całości poświęconą wolnemu oprogramowaniu. Dla zademonstrowania jedności zaproszono także programistów z innych ruchów wolnego oprogramowania zajmujących się "różnymi aspektami GNU, Linuksa, NetBSD, 386BSD, FreeBSD, Perla, Tcl/tk oraz innych narzędzi, których kod był wolnodostępny i mógł być swobodnie rozpowszechniany". Salus pisał: + + Przez ostatnie 15 lat wolne i tanie oprogramowanie stało się wszechobecne. Ta konferencja ma zebrać razem wszystkich, którzy dokonali implementacji różnego rodzaju wolnego oprogramowania i jego wydawców (na różnego rodzaju nośnikach). Przewidziane są wykłady informacyjne i artykuły odnoszące się do tematu, a także przewodnie wystąpienia Linusa Torvaldsa i Richarda Stallmana2. + +Jednym z pierwszych, do których dotarł e-mail Salusa, był Eric S. Raymond, jeden z członków komitetu tej konferencji. Choć nie kierował żadnym projektem, ani firmą, jak większość innych z listy, zdobył sobie przyzwoitą reputację w społeczności hakerskiej jako jeden ludzi z najaktywniej biorących udział w GNU Emacs i jako wydawca The New Hacker Dictionary (Nowego słownika hakerskiego), książkowej wersji liczącego się już pliku słownikowego Jargon File. + +Dla Raymonda konferencja w roku 1996 była oczekiwanym zdarzeniem. W latach osiemdziesiątych brał aktywny udział w projekcie GNU, po czym w roku 1992 usunął się na bok, zrażony - jak wielu przed nim - mikrozarządzaniem Stallmana. "Richard zrobił awanturę z powodu moich nieautoryzowanych modyfikacji, które wprowadziłem podczas czyszczenia emacsowych bibliotek lispowych - wspomina. - Tak mnie to sfrustrowało, że postanowiłem dalej z nim nie współpracować". + +Pomimo swego odejścia Raymond pozostał członkiem społeczności wolnego oprogramowania. Na tyle aktywnym, by gorliwie przyklasnąć pomysłowi Salusa, gdy ten zaproponował, aby na konferencji obok siebie wystąpili Torvalds i Stallman. Stallman reprezentował stary zespół hakerski związany z ITS/Unix, zaś Torvalds - młodą i dynamiczną grupę hakerów linuksowych. Ich wystąpienia na tej samej konferencji symbolizowały jedność, która mogła przynieść pożądane owoce zwłaszcza dla młodych (tzn. poniżej czterdziestego roku życia) i ambitnych hakerów w rodzaju Raymonda, co on podsumował następująco "Poczułem, jakbym stał każdą nogą w innym obozie". + +W okresie przed konferencją napięcie między tymi obydwoma obozami stawało się coraz bardziej wyczuwalne. Łączyła je wspólna chęć zobaczenia w naturze fińskiego "cudownego dziecka". Ku zaskoczeniu wszystkich Torvalds okazał się przyjemnym, czarującym mówcą. Mówiąc jedynie z lekkim szwedzkim akcentem, zdumiał audytorium błyskotliwym, zabarwionym autoironią dowcipem3. "Jeszcze bardziej zdumiewały jego cięte, rzucane mimochodem złośliwostki pod adresem innych hakerów, nie wyłączając Stallmana" - twierdzi Raymond. Do końca konferencji wszystkich młodszych i starszych uczestników ujął jego lekki, pół hakerski, pół odmienny sposób bycia. + +"Był to moment przełomowy - wspomina Raymond. - Przed rokiem 1996 Richard był jedynym uznanym przywódcą ideologicznym całej społeczności. Dysydenci nie występowali publicznie. Torvalds był tym, który złamał to tabu". + +Do następnego przełamania tabu doszło pod koniec konferencji. Podczas dyskusji o nadciągającej dominacji Microsoftu i jego systemu Windows Torvalds stwierdził, że podoba mu się PowerPoint, program Microsoftu do przygotowywania i pokazywania prezentacji. Dla hakerskich purystów ideologicznych było to jak chełpienie się mormona w świątyni swym zamiłowaniem do whisky, zaś dla Torvaldsa i jego zwolenników była to po prostu opinia zgodna ze zdrowym rozsądkiem. Dlaczego unikać wartościowych programów komercyjnych? Celem hakera jest wykonanie zadania, a nie cierpienie dla idei. + +"Było to szokujące stwierdzenie - wspomina Raymond. - Mógł sobie na nie pozwolić, gdyż w latach 1995 i 1996 gwałtownie zdobywał coraz szersze wpływy". + +Stallman z kolei nie pamięta napięcia narastającego podczas konferencji w roku 1996, ale pozostała mu w pamięci impertynencja Torvaldsa. "W dokumentacji Linuksa znalazło się stwierdzenie, by wydrukować wszystkie standardy programistyczne GNU, a potem je podrzeć - przytacza jeden przykład. - Dobrze, mógł się nie zgadzać z naszymi konwencjami, ale nie musiał wyrażać tego w tak arogancki sposób. Czyż nie mógł powiedzieć po prostu Ja tak to widzę? Nie byłoby w tym demonstracji wrogości". + +Gorące przyjęcie Torvaldsa przez innych hakerów jedynie potwierdziło podejrzenia Raymonda. Główna linia oddzielająca twórców Linuksa i GNU/Linuksa zgadzała się z podziałem pokoleniowym. Wielu hakerów linuksowych, jak Torvalds, wyrosła w świecie oprogramowania komercyjnego z zastrzeżonymi prawami własności. Jeżeli program nie jest zły, dlaczego go unikać tylko z powodu rodzaju licencji? Gdzieś tam w przestrzeni wolnego oprogramowania kiełkował program, który być może kiedyś zostanie przekształcony w wolny odpowiednik PowerPointa. Ale póki się to nie stanie, dlaczego zazdrościć Microsoftowi i zwalczać go? + +Jako uczestnik projektu GNU z większym stażem Raymond wyczuwał rosnące napięcie między Stallmanem i Torvaldsem. W ciągu dekady, która upłynęła od rozpoczęcia projektu GNU, Stallman zdobył budzącą respekt reputację doskonałego programisty. Zdobył sobie również opinię człowieka nieprzejednanego zarówno w dziedzinie programowania, jak i zarządzania ludźmi. Krótko przed konferencją z roku 1996 Fundację Wolnego Oprogramowania opuścił cały personel zrażony postępowaniem Stallmana. Brian Youmans, obecny pracownik FSF, przyjęty przez Salusa po zbiorowym odejściu innych, wspomina, że "Wówczas Peter (Salus) był jedyną osobą pracującą w biurze". + +Zbiorowe odejście pracowników jedynie potwierdziło podejrzenia Raymonda, że ostatnie opóźnienia, takie jak z HURD-em i ostatnie kłopoty, takie jak ze schizmą Lucid-Emacs wynikały nie z trudności w tworzeniu kodu, lecz z nieudolnego zarządzania projektem. Wkrótce po Freely Redistributable Software Conference Raymond rozpoczął prace nad swym własnym projektem-pupilkiem, narzędziem popmailowym (klienta pocztowego) o nazwie "fetchmail". Wzorując się na Torvaldsie, udostępnił swój program z obietnicą uaktualniania kodu źródłowego tak szybko i tak często, jak tylko będzie to możliwe. Gdy użytkownicy zaczęli nadsyłać raporty o błędach i sugestie zmian, spodziewał się jednego wielkiego bałaganu, ale ku swemu zaskoczeniu odkrył, że wszystko stanowiło zwartą całość. Analizując zwycięstwo podejścia Torvaldsa, doszedł do wniosku, że: używając Internetu jako "płytki Petriego4", a także narzędzia do dokonania surowej kontroli i naturalnej selekcji, Torvalds stworzył ewolucyjny model działania wolny od centralnego planowania. + +Ponadto, jak sobie uświadomił Raymond, Torvalds znalazł sposób obejścia prawa Brooksa. Prawo to, po raz pierwszy sformułowane przez Freda P. Brooksa, menadżera projektu OS/360 w firmie IBM i autora wydanej w roku 1975 książki The Mythical Man-Month5, głosi że dodawanie kolejnych programistów6 do projektu powoduje jedynie dalsze jego opóźnienie. Raymond, jak większość hakerów wierzący dotychczas, że zupa staje się tym gorsza, im więcej kucharzy, odkrył, że Torvaldsowi udało się pokazać, że jest przeciwnie. Zapraszając do kuchni coraz więcej i więcej kucharzy, czynił programistyczną zupę coraz lepszą7. + +Raymond przelał swe spostrzeżenia na papier. Nadał im postać przemówienia pt. "The Cathedral and the Bazaar" (Katedra i bazar), które zapewne wygłosił dla grupy przyjaciół i sąsiadów z Chester County w Pensylwanii. Sposobowi zarządzania projektem GNU przeciwstawił tam styl zarządzania stosowany przez Torvaldsa i pozostałych hakerów z grupy tworzącej jądro Linuksa. Jak twierdzi, spotkało się to od razu z entuzjastycznym przyjęciem, choć nie tak entuzjastycznym, jak na zorganizowanym na wiosnę następnego roku (1997) kongresie niemieckich użytkowników Linuksa. + +"Na tym kongresie po moim przemówieniu nastąpiła owacja na stojąco - wspomina Raymond. - Sądzę, że wynikało to z dwóch przyczyn. Po pierwsze, ludzie byli podekscytowani tym, co usłyszeli, a po drugie, cieszyli się, że zrozumieli pomimo bariery językowej". + +Ostatecznie przemówienie zostało opublikowane pod tym samym tytułem The Cathedral and the Bazaar. Tytuł był związany z główną podkreślaną przez Raymonda analogią. Programy GNU to były "katedry", monumentalne, centralnie zaplanowane pomniki hakerskiej etyki, tworzone z myślą o wytrzymaniu próby czasu. Zaś Linux przypominał "wielki rozgadany bazar", był oprogramowaniem tworzonym przez luźną, nieznającą centralizacji, dynamiczną naturę Internetu. + +Podtekstem tej analogii było porównanie Stallmana z Torvaldsem - Stallman był klasycznym architektem "katedr", wizjonerem, który potrafił zniknąć na 18 miesięcy, by potem pojawić się z czymś takim jak GNU C Compiler, zaś Torvalds przypominał raczej genialnego gospodarza przyjęcia. Pozwalając innym wieść dyskusje i wkraczając jedynie, gdy wszyscy przy stole potrzebowali punktu odniesienia, stworzył model tworzenia oprogramowania będący odbiciem jego własnej osobowości skłonnej do pozostawania w cieniu wydarzeń i działania zza kulis. Z jego punktu widzenia nadrzędnym zadaniem menadżera nie jest narzucanie sterowania i kontroli lecz zapewnienie przepływu idei. + +Podsumowując, Raymond stwierdził, że: "największym hakerskim osiągnięciem Linusa nie jest sama konstrukcja jądra Linuksa lecz stworzenie i konsekwentna realizacja nowego modelu tworzenia oprogramowania"8. + +Doceniając menedżerski sukces Torvaldsa, Raymond odniósł własny sukces. Jednym ze słuchających go na niemieckim kongresie linuksowym był Tim O'Reilly z O'Reilly & Associates, firmy specjalizującej się w wydawaniu podręczników informatycznych i książek w różny sposób dotyczących programowania i oprogramowania (wydawcy również tej książki). Po wysłuchaniu przemówienia Raymonda O'Reilly od razu poprosił go o powtórzenie go na organizowanej przez firmę inauguracyjnej konferencji poświęconej językowi Perl, która miała się odbyć nieco później w tym samym roku w Monterey w Kalifornii. + +Choć głównym tematem konferencji był Perl, język skryptowy stworzony przez uniksowego hakera Larry'ego Walla, O'Reilly zapewnił Raymonda, że inne zagadnienia dotyczące technologii wolnego oprogramowania również będą poruszane. Miał nadzieję, że coraz większe komercyjne zainteresowanie Linuksem i Apachem, popularnym wolnym serwerem WWW, pozwoli na rozpowszechnienie informacji o roli wolnego programowania w tworzeniu struktury Internetu. Od przyjaznych dla WWW języków w rodzaju Perla i Pythona, przez działające "zza kulis" takie programy jak BIND (ang. Berkeley Internet Naming Daemon), który pozwala użytkownikom stosować łatwe do zapamiętania nazwy domen (np. amazon.com)9 zamiast tajemniczych numerów IP, po najpopularniejszy program pocztowy sendmail - wolne oprogramowanie zaczynało stanowić coraz bardziej istotną część Internetu. Ale tym, którzy je tworzyli, brakowało samoświadomości, tak jak brakuje jej kolonii mrówek budujących piękny kopiec przez dokładanie pojedynczych ziarnek piasku. O'Reilly uznał, że przemówienie Raymonda nadaje się do jej rozbudzenia. Pokaże też, że ruch wolnego programowania nie zaczął się i nie kończy się na projekcie GNU. Właśnie języki Perl i Python oraz oprogramowanie internetowe BIND, Apache i sendmail były najlepszymi dowodami, że wolne oprogramowanie wszędzie znajduje swe miejsce, a jego znaczenie rośnie. Zapewnił także Raymonda, że spotka się z równie gorącym przyjęciem, jak w Niemczech, a może nawet gorętszym. + +Miał rację. "Tym razem owacja na stojąca spotkała mnie już przed przemówieniem, a nie dopiero po nim" - mówi Raymond ze śmiechem. + +Jak było do przewidzenia, audytorium składało się nie tylko z hakerów, lecz również z innych osób zainteresowanych rosnącą rolą ruchu wolnego oprogramowania. Jedna grupa reprezentowała Netscape z Mountain View w Kalifornii, firmę, której trzyletnia walka z Microsoftem o dominację na rynku przeglądarek WWW właśnie dobiegała końca. + +Członkowie tej grupy, zaintrygowani przemówieniem Raymonda i dążący za wszelką cenę do odzyskania utraconych udziałów w rynku, przesłali komunikat do głównej siedziby firmy. Kilka miesięcy później, w styczniu 1998 Netscape ogłosił plan opublikowania kodu źródłowego swego flagowego produktu - przeglądarki WWW Navigator, licząc na wsparcie hakerów w dalszym rozwoju produktu. + +Gdy dyrektor naczelny Netcape'a Jim Barksdale stwierdził, że artykuł Raymonda Cathedral and the Bazaar miał istotny wpływ na podjęcie tej decyzji, firma natychmiast uznała go za hakerską osobistość. Zdecydowany nie zmarnować nadarzającej się okazji, Raymond udał się na zachód, by udzielać wywiadów, doradzać rządzącym Netscapem oraz wziąć udział w ostatniej fazie uroczystości udostępnienia kodu źródłowego Navigatora. Kod ten nosił nazwę "Mozilla", co było odniesieniem do jego gargantuicznych rozmiarów - 30 milionów linii oraz dziedzictwa. Mozilla była komercyjnym odrostem programu Mosaic, przeglądarki stworzonej przez Marca Andressena z University of Illinois i doskonałym potwierdzeniem faktu, że większość programistów, budując nowy program, woli korzystać ze starych, dostępnych do modyfikacji kodów. + +Będąc w Kalifornii, Raymond znalazł także czas na odwiedzenie VA Research, firmy z Santa Clara sprzedającej stacje robocze z preinstalowanym systemem GNU/Linux. Zdecydował się tam na spotkanie z niewieloma osobami: z założycielem firmy Larrym Augustinem, kilkoma pracownikami oraz z Christine Peterson, prezesem zarządu Foresight Institute10, "think tanku11" z Doliny Krzemowej zajmującego się nanotechnologią. + +Plan spotkania został ograniczony do jednego zagadnienia: w jaki sposób sprawić, aby inne firmy podążyły tą samą drogą co Netscape? Raymond nie pamięta rozmowy, ale zapamiętał pierwsze zgłoszone zażalenie. Pomimo wysiłków Stallmana i innych hakerów, by uświadomić ludziom, że słowo "wolny" w określeniu "wolne oprogramowanie" oznacza uwolnienie od ograniczeń, a nie od kosztów, świadomość tego faktu jeszcze nie stała się powszechna. Większość zarządzających instytucjami, słysząc ten termin po raz pierwszy, uważa słowo "wolny" za synonim "zerowych kosztów12" i odrzuca wszelkie możliwości innej interpretacji. Dopóki hakerzy nie rozwiążą problemu tej podwójnej interpretacji, dopóty ruch nie osiągnie sukcesów, nawet po decyzji Netscape'a. + +Peterson, której organizacja była żywo zainteresowana dalszym rozwojem wolnego oprogramowania, zaproponowała termin alternatywny: oprogramowanie open source. + +Patrząc wstecz, Peterson twierdzi, że termin "oprogramowanie open source" wymyśliła podczas omawiania decyzji Netscape'a z przyjacielem z branży public relations13. Nie pamięta gdzie na ten pomysł wpadła, a także czy go skądś zapożyczyła, ale pamięta, że przyjacielowi się on nie podobał14. + +Na spotkaniu reakcja była diametralnie różna. "Wahałam się, czy tę nazwę sugerować - wspomina Peterson. - Nie miałam żadnych stałych kontaktów z tą grupą, więc użyłam terminu przypadkowo, bez podkreślania, że jest nowy." Ku jej zaskoczeniu, nowe określenie chwyciło. Pod koniec spotkania większość uczestników, łącznie z Raymondem, zdawała się używać go z przyjemnością. + +Raymond twierdzi, że publicznie terminu "oprogramowanie open source" zamiast "wolne oprogramowanie" po raz pierwszy użył dopiero w dzień lub dwa po rozmowie na lunchu w sprawie Mozilli, podczas której O'Reilly zaproponował zorganizowanie "spotkania na szczycie" w sprawie wolnego oprogramowania (Freeware Summit). O'Reilly chciał zwrócić uwagę mediów i społeczeństwa również na inne realizowane projekty, które także wpłynęły na decyzję Netscape'a o uwolnieniu Mozilli. "Wszyscy ci faceci mieli tak wiele wspólnego, iż trudno było pojąć, że nic o sobie nawzajem nie wiedzą - twierdził O'Reilly. - Chciałem, aby świat się dowiedział, jak wielki był dotychczasowy wpływ kultury wolnego oprogramowania. Ludzie wiele tracili, nie znając tej tradycji". + +Układając listę zaproszonych, O'Reilly podjął decyzję mającą dalekosiężne konsekwencje polityczne. Zdecydował się ograniczyć zaproszenia jedynie do twórców oprogramowania z zachodniego wybrzeża, takich jak Wall, Eric Allman - twórca sendmaila i Paul Vixie - twórca BIND-a. Były oczywiście wyjątki, jak pochodzący z Pensylwanii Raymond przebywający akurat w mieście z powodu spotkania w sprawie Mozilli. Został także zaproszony mieszkający w Wirginii Guido van Rossum, twórca Phytona. "Zaprosił go bez uzgadniania ze mną Frank Willison, mój redaktor naczelny i najlepszy wśród nas znawca Pythona - wspomina O'Reilly. - Byłem zadowolony z jego przyjazdu, choć, wedle moich zamierzeń, miało to być lokalne spotkanie". + +Niektórzy uznali, że niezaproszenie Stallmana było afrontem i zadzieraniem nosa. "Z tego powodu zdecydowałem, by nie brać w tym udziału" - mówi Perens, wspominając "szczyt". Raymond, który przyszedł, wspomina, że argumentował za zaproszeniem Stallmana, ale bez skutku. Oskarżenie o afront zostało wzmocnione faktem, że między gospodarzem spotkania O'Reillym i Stalmanem istniała zadawniona i powszechnie znana wrogość z powodu sporu o prawa autorskie instrukcji do oprogramowania. Przed spotkaniem Stallman ogłosił, że instrukcje do wolnego oprogramowania można dowolnie kopiować i modyfikować tak samo jak samo wolne oprogramowanie. Tymczasem O'Reilly argumentował, że komercyjne podręczniki są wartością dodaną, zwiększającą użyteczność wolnego oprogramowania, dzięki czemu staje się ono dostępne dla szerszych kręgów społeczeństwa. Przedmiotem sporu był również tytuł spotkania - Stallman upierał się przy "Free Software", zamiast mającego mniejszą wagę polityczną "Freeware"15. + +Patrząc wstecz, O'Reilly nie uważa, że niezaproszenie Stallmana było afrontem. "Do tego czasu nigdy nie spotkałem się osobiście ze Stallmanem, ale wymiana e-maili między nami świadczyła, że jest on osobą nieskłonną do jakichkolwiek kompromisów i niechętną do podejmowania dyskusji. Chciałem, aby na spotkaniu była reprezentowana tradycja GNU i dlatego zaprosiłem Johna Gilmore'a i Michala Tiemanna, których znałem osobiście i którzy byli szalenie przywiązani do GPL, ale chętniej dyskutowali o zaletach i słabościach projektów wolnego oprogramowania i jego tradycji. Mając na uwadze rwetes, który spowodowało pominięcie Richarda, sądzę, że powinienem go zaprosić, ale nadal nie uważam, że mój błąd można interpretować jako demonstrację braku szacunku dla projektu GNU i samego Richarda". + +Z afrontem lub bez, O'Reilly i Raymond twierdzą, że termin "open source" został przyjęty bez oporów przez tak znaczną większość uczestników spotkania, że można to uważać za sukces. Podzielili się oni pomysłami i doświadczeniami oraz uczestniczyli w burzy mózgów, której celem było znalezienie najlepszych sposobów poprawienia wizerunku wolnego oprogramowania. Zastanawiano się głównie, jak wykorzystać sukces wolnego oprogramowania, zwłaszcza w świecie Internetu, w wielkiej rozgrywce GNU/Linuksa z Mirosoft Windows. Ale tak jak podczas wcześniejszego spotkania w VA dyskusja szybko zbiegła na problemy związane z samym terminem "wolne oprogramowanie". Gospodarz spotkania, O'Reily, pamięta szczególnie refleksyjny komentarz biorącego udział w spotkaniu Torvaldsa: + +"Linus, który niedawno przeniósł się do Krzemowej Doliny, wyjaśnił, że dopiero ostatnio dowiedział się, że po angielsku słowo free ma dwa znaczenia: wolny i bezpłatny". + +Michael Tiemann, założyciel Cygnusa, zaproponował rozwiązanie problemu przez zastąpienie terminu "free software" (wolne oprogramowanie) przez "sourceware" (mniej więcej oprogramowanie ze źródłem), ale jak wspomina O'Reilly, "nikomu się to zbytnio nie spodobało. Wówczas Eric zaproponował open source". + +Choć niektórym termin bardzo się spodobał, niewielu poparło zmianę oficjalnej terminologii. Na koniec jednodniowej konferencji poddano pod głosowanie trzy nazwy: "free software", "open source" i "sourceware". O'Reilly twierdzi, że termin "open source" zwyciężył 9 głosami na 15 głosujących. Choć niektórzy zgłaszali obiekcje, ostatecznie zgodzono się na używanie wybranej nazwy przy późniejszych kontaktach z prasą. "Chcieliśmy zamanifestować solidarność" - mówi O'Reilly. + +Wkrótce nowe określenie znalazło swe miejsce w narodowym słowniku. Zaraz po zakończeniu spotkania O'Reilly zaprosił jego uczestników na konferencję prasową, na której zjawili się reporterzy z "New York Timesa", "Wall Street Journal" i innych liczących się pism. W ciągu kilku miesięcy twarz Torvaldsa znalazła się na okładce magazynu Forbes, w którego wnętrzu umieszczono zdjęcia Stallmana, Larry'ego Walla - twórcy Perla i Briana Behlendorfa - lidera grupy, która stworzyła Apache. Oprogramowanie "open source" stało się rzeczywiście otwarte dla biznesu. + +Dla biorących udział w spotkaniu, np. dla Tiemanna, najważniejsza była manifestacja solidarności. Choć jego firma odniosła znaczny sukces, sprzedając narzędzia wolnego oprogramowania i związane z nimi usługi, rozumiał trudności piętrzące się przed innymi programistami i przedsiębiorcami. + +"Chyba nikt nie zaprzeczy, że używanie słowa free w wielu sytuacjach powoduje zamieszanie - mówi Tiemann. - Open source robi wrażenie terminu bardziej przyjaznego i sensownego dla biznesu, zaś wolne oprogramowanie było terminem, za którym stały racje moralne. Uznaliśmy, że lepiej na dobre i na złe przyłączyć się do tłumu zwolenników oprogramowania open source." + +Stallman nie śpieszył się z wyrażeniem opinii o nowym terminie "open source". Najpierw krótko zastanawiał się nad przyjęciem nowej nazwy, lecz szybko ją odrzucił. "Wiem o tym, gdyż z nim na ten temat rozmawiałem" - twierdzi Raymond. + +Przed końcem roku 1998 Stallman sformułował swoje stanowisko: "open source" jest nazwą pomocną przy informowaniu o technicznych korzyściach stosowania wolnego oprogramowania, lecz ośmielał mówców do łagodzenia swego stanowiska w kwestiach dotyczących wolnego oprogramowania. Z powodu tej wady Stallman postanowił pozostać wierny starej nazwie wolnego oprogramowania. + +Na LinuxWorld Convention and Expo w roku 1999 podsumował swoje stanowisko i mimo iż nazwany został przez Torvaldsa "przemijającą częścią" linuksowej społeczności, błagał kolegów hakerów o nieuleganie powabom łatwego kompromisu. + +"Ponieważ pokazaliśmy już, na jak wiele nas stać, nie musimy desperacko zabiegać o współpracę firm i kompromisowo rezygnować z wyznaczonych celów - mówił podczas dyskusji panelowej. - Pozwólmy im na złożenie oferty, którą moglibyśmy zaakceptować. Nie musimy nic zmieniać w naszym postępowaniu, aby pozyskać ich pomoc. Dążąc we właściwą stronę, możecie najpierw wykonać jeden krok, potem następny, potem jeszcze jeden i jeszcze jeden, aż wreszcie dotrzecie do celu. Lub możecie działać połowicznie i przystać na kompromis, lecz wówczas nigdy nie wykonacie drugiego kroku i nigdy nie dotrzecie do celu." + +Ale już przed konferencją LinuxWorld dążenie Stallmana do zdystansowania się od swych bardziej ugodowych towarzyszy stawało się coraz bardziej widoczne. W kilka miesięcy po Freeware Summit O'Reilly zorganizował drugą doroczną konferencję języka Perl (Perl Conference). Tym razem Stallman był obecny. Podczas dyskusji panelowej, na której IBM ogłosił decyzję o umieszczeniu w swej ofercie komercyjnej wolnego serwera WWW Apache, zawładnął mikrofonem, aby przed zebraną publicznością wygłosić tyradę przeciwko Johnowi Ousterhoutowi, twórcy języka skryptowego Tcl. Nazwał Ousterhouta pasożytem żerującym na społeczności wolnego oprogramowania, a to z powodu sprzedawania przez jego firmę Scriptics komercyjnej wersji Tcl. "Nie uważam, aby do dalszego istnienia Tcl potrzebne było istnienie Scriptics" - głosił Stallman pomimo syków zgromadzonych słuchaczy16. + +"Była to obrzydliwa scena - wspomina Rich Morin z Prime Time Freeware. - John zrobił rzeczy, które należy docenić: Tcl, Tk i Sprite17. To jego znaczny dorobek". + +Pomimo sympatii dla Stallmana i jego osiągnięć wyczuwa się u Morina empatię wobec słuchaczy, którzy z powodu jego niestosownego zachowania znaleźli się w krępującej sytuacji. + +Wybuch Stallmana na Perl Conference odstraszył innego potencjalnego sympatyka, Bruce'a Perensa. W roku 1998 Eric Raymond zaproponował stworzenie Open Source Initiative czyli OSI, organizacji, która miała strzec porządku stosowania nazwy "open source" i określać zakres stosowania dla firm zainteresowanych rozwijaniem własnych programów. Raymond poprosił Perensa o sformułowanie definicji18. + +Perens odszedł potem z OSI, wyrażając żal, że organizacja stanęła w opozycji do Stallmana i Fundacji Wolnego Oprogramowania (FSF). Patrząc wstecz, uznaje ówczesną potrzebę zdefiniowania wolnego oprogramowania poza auspicjami FSF i rozumie, dlaczego część hakerów nadal woli trzymać się od niej z daleka. "Rzeczywiście, lubię i szanuję Richarda - twierdzi - ale sądzę, że wykonałby swoje zadanie lepiej, gdyby dokładniej wyważał racje. Mógłby przez kilka miesięcy odpocząć od wolnego oprogramowania". + +Jego monomaniakalna energia nie była w stanie przeciwstawić się oddziaływaniu na opinię publiczną grupy z rozmachem proponującej oprogramowanie open source. Gdy w sierpniu 1998 producent procesorów Intel wykupił część akcji firmy Red Hat, dostawcy GNU/Linuksa, "New York Times" w omawiającym ten zakup artykule napisał, że firma ta jest produktem ruchu "nazywanego alternatywnie ruchem wolnego oprogramowania lub oprogramowania open source"19. Sześć miesięcy później John Markoff w artykule na temat Apple Computer poinformował o "adoptowaniu" przez tę firmę serwera Apache należącego do oprogramowania open source, umieszczając to określenie w tytule20. + +Zbiegło się to z dążeniem wielu firm, które zaczęły używać terminu "open source". Jeszcze przed sierpniem 1999 Red Hat i inne firmy zajmujące się oprogramowaniem open source i stosujące tę nazwę zaczęły sprzedawać swe akcje na giełdzie Nasdaq21. W grudniu VA Linux, poprzednio VA Research, osiągnęło historyczne przebicie ceny IPO22. Cena otwarcia wynosząca 30 dolarów za akcję podskoczyła gwałtownie aż do 300 dolarów, by przed zamknięciem spaść jedynie do 239 dolarów. Szczęśliwcy, którym udało się kupić akcje po cenie zbliżonej do dolnego progu, mogli osiągnąć 698% zysku, co było rekordem giełdy Nasdaq. + +Wśród nich był Eric Raymond, który jako członek zarządu od czasów uruchomienia Mozilli przy debiucie giełdowym VA Linux otrzymał 150 tys. akcji. Zdumiał się faktem, że opisanie odmienności stylów menedżerskich Stallmana i Torvaldsa przyniosło mu potencjalny majątek wart 36 milionów dolarów i zasiadł do napisania kolejnego artykułu. Rozważał w nim wzajemne zależności etyki hakerskiej i bogactwa: + + Ostatnio dziennikarze często pytają, czy sądzę, że społeczność open source zostanie skorumpowana napływem wielkich pieniędzy. Komercyjne zapotrzebowanie na programistów od dawna jest tak duże, że wszyscy, których zarabianie pieniędzy bardzo pociągało, już odeszli. W naszej społeczności została już dokonana autoselekcja i pozostali ci, dla których najważniejsze było co innego: duma, artystyczna pasja i inne podobne rzeczy.23 + +Nie wiadomo, w jakim stopniu podobne komentarze uśmierzyły podejrzenia, że Raymond i inni twórcy ruchu open source działali po prostu dla pieniędzy, ale niewątpliwie uświadomili hakerskiej społeczności, że wszystko, czego potrzeba, aby sprzedać koncepcję wolnego oprogramowania, to życzliwe nastawienie i trafiająca do adresatów informacja. Zamiast za wszelką cenę zwalczać rynek, jak robił to Stallman, Raymond i Torvalds oraz inni, nowi przywódcy hakerskiej społeczności przyjęli o wiele luźniejsze zasady działania, ignorując pewne obszary rynku, a oddziałując na inne. Zamiast grać rolę tkwiących na uczelniach wygnańców, wykorzystywali zdobyte poważanie do powiększania swych możliwości. + +"W swoje najgorsze dni Richard wierzy, że Linus Torvalds i ja zmówiliśmy się, by przejąć jego rewolucję - mówi Raymond. - Odrzucenie przez niego terminu open source i jego rozmyślne, uparte tworzenie ideologicznego rozłamu bierze się, jak sądzę, z mieszaniny idealizmu i chęci zawłaszczania terytorium. Wielu ludzi sądzi, że wynika to z jego ego. Nie wierzę w to. Po prostu idea wolności oprogramowania tak bardzo stopiła się z jego osobowością, że wszelkie jej zagrożenia odczuwa jako groźbę wobec siebie samego". + +Ironią losu może się wydawać fakt, że ani open source ani jego zwolennicy nie zmniejszyli przywódczej roli Stallmana. Ciągną za nim następni kandydaci do nawrócenia. Jednakże rzucone przez Raymonda oskarżenie o dążenie do panowania na własnym terytorium, nic nie straciło ze swej przeklętej aktualności. Jest wiele przykładów, gdy chwyta on za broń bardziej ze zwyczaju niż potrzeby. Takim działaniem było na przykład wstępne odrzucenie jądra Linuksa oraz jego trwająca wciąż niechęć do działań politycznych poza światem oprogramowania. + +Ostatnie debaty na temat oprogramowania open source również pokazują, iż Stallman pozostaje przywiązany do metod, które dotychczas pozwalały mu na działanie. "Jedną z podstawowych cech jego charakteru jest niewzruszoność - mówi Ian Murdock. - Może przez dziesięciolecie tkwić w jednym miejscu, czekając, aż wokół zbiorą się ludzie, którzy podzielą jego poglądy". + +Murdock uważa tę niewzruszoność natury Stallmana za wartościową i inspirującą. Stalman może już nie być jedynym przywódcą ruchu wolnego oprogramowania, ale pozostanie dla tej społeczności gwiazdą świecącą nad biegunem. "Możecie być pewni, że zachowa wierność swym poglądom - mówi Murdock, - czego większość ludzi u niego nie lubi, ale nawet nie zgadzając się z nim, musi przyznać, że go szanuje". + + +Rozdział 12. +Krótka podróż przez hakerskie piekło + +Richard Stallman bez zmrużenia powiek spoglądał przez przednią szybę wynajętego samochodu, oczekując na zmianę świateł, by ruszyć w dalszą drogę przez centrum Kihei. + +Jechaliśmy do pobliskiego miasta Pa'ia, gdzie mniej więcej przed godziną powinniśmy się byli spotkać na obiedzie z kilkoma programistami i ich żonami. + +Znaleźliśmy się tu w dwie godziny po wykładzie Stallmana w Maui High Performance Center, a Kihei, które przed wykładem zdawało się być miastem przyjaznym dla przybyszów, teraz sprawiało kłopoty na każdym kroku. Jak wszystkie kurorty nadmorskie zdawało się być przedmieściem rozciągniętym nad miarę w jednym wymiarze. Jadąc wzdłuż głównej ulicy wypełnionej niekończącymi się straganami z hamburgerami, agencjami nieruchomości i sklepami z bikini, miałem wrażenie, że jesteśmy drobinami uwięzionymi w blaszanym pancerzu samochodu i przesuwającymi się wzdłuż przewodu pokarmowego gigantycznego handlowego potwora. Wrażenie to potęgował brak dodatkowych pasów dla ruchu lokalnego, co powodowało, że na jedynej zatłoczonej jezdni posuwanie się do przodu przypominało konwulsje drgającej sprężyny. Zielone światła zapalające się 200 metrów przed nami, gdy do nich dojeżdżaliśmy, zmieniały się na żółte. + +Stallmana, który całe życie mieszkał na wschodnim wybrzeżu, o zawał mogła przyprawić perspektywa spędzenia większej części słonecznego hawajskiego popołudnia w pułapce ruchu ulicznego. Jeszcze gorsza była świadomość, że skręcenie w prawo mniej więcej ćwierć mili wcześniej pozwoliłoby na ominięcie tej pułapki. Niestety, byliśmy na łasce jadącego przed nami programisty z laboratorium, który znał trasę i który zdecydował się przewieźć nas malowniczą trasą przez Pa'ia zamiast sąsiednią autostradą Pilani. + +"To straszne - mówił Stallman między kolejnymi zmianami świateł. - Dlaczego nie pojechaliśmy inną drogą?" + +Zielone światła ponownie zapaliły się ćwierć mili przed nami. Znowu przepełzliśmy do przodu kilka długości samochodu. Powtarzało się to przez kolejne 10 minut, aż wreszcie dotarliśmy do głównego skrzyżowania umożliwiającego skręt na sąsiednią autostradę. + +Kierowca przed nami zignorował to i przejechał przez skrzyżowanie na wprost. + +"Dlaczego on nie skręca? - narzekał Stallman, wznosząc ręce w rozpaczy. - Możesz to pojąć?" + +Postanowiłem w ogóle nie odpowiadać. Fakt, że w Maui jadę samochodem ze Stallmanem jako kierowcą i tak wydawał się trudny do uwierzenia. Jeszcze dwie godziny temu nie miałem nawet pojęcia, czy Stallman w ogóle potrafi prowadzić samochód. Teraz, słuchając przez samochodowe stereo Yo-Yo Ma1 grającego na wiolonczeli rzewne basowe nuty "Appalachian Journey" i oglądając po lewej zachód słońca, uznałem, że najlepiej zapaść się w miękką tapicerkę siedzenia. + +Kiedy kolejna możliwość skręcenia w bok została zmarnowana, Stallman włączył prawy kierunkowskaz, by w ten sposób dać wskazówkę jadącemu przed nami. Nic z tego. Przepełzliśmy na wprost przez kolejne skrzyżowanie, utykając w ruchu na 200 metrów przed kolejnymi światłami. Stallman zsiniał z wściekłości. + +"Tak jakby nas specjalnie ignorował" - powiedział i w daremnym wysiłku przyciągnięcia uwagi jadącego przed nami począł wykonywać gesty przypominające znaki dawane na lotnisku przez kierującego ruchem lądujących samolotów. Nasz przewodnik był jednak niewzruszony i przez następne pięć minut mogliśmy jedynie oglądać fragment głowy widoczny w lusterku wstecznym jego samochodu. + +Spojrzałem przez okno po stronie Stallmana. Pobliskie wyspy Kahoolawe i Lanai pięknie wyglądały w oprawie zachodzącego słońca. Widok zapierał dech w piersi i jego wspaniałość mogła czynić znośniejszym życie tubylców. Starałem się zwrócić na to uwagę Stallmana, ale wściekły, jedynie mnie ofuknął. + +Gdy nasz przewodnik przejechał przez kolejne skrzyżowanie, zupełnie ignorując napis "Autostrada Pilani na prawo", zacisnąłem zęby. Przypomniałem sobie, jak programista BSD Keith Bostic ostrzegał mnie, że "Stallmanowi niełatwo ścierpieć głupców". Twierdził, że każdemu, kto mówi lub robi coś głupiego, on mówi wprost: "To głupie". + +Patrząc na nieświadomego sytuacji kierowcę przed nami, pojąłem, że to jego głupota, a nie niedogodność podróży doprowadzają Stallmana do szału. + +"Wygląda na to, że wybierając tę drogę, w ogóle nie zastanowił się nad efektywnym dotarciem do celu" - powiedział Stallman. + +Słowo "efektywny" zawisło nad nami swym niewidocznym ciężarem. Niewiele jest rzeczy irytujących hakera bardziej niż nieefektywność. To właśnie nieefektywność wielokrotnego sprawdzania, czy drukarka się nie zacięła, spowodowała, że Stallman zaczął szukać dostępu do kodu źródłowego jej oprogramowania. To właśnie nieefektywność kodów zawłaszczonych przez komercyjnych dostawców oprogramowania doprowadziła do jego walki z firmą Symbolics i stworzenia projektu GNU. Jeżeli Jean Paul Sartre stwierdził kiedyś, że piekłem są inni ludzie, to męki piekielne hakera są spotęgowane przez ludzką głupotę, a całe życie Stallmana było dążeniem, by uchronić ludzkość przed stoczeniem się w te piekielne otchłanie. + +W miarę naszego powolnego brnięcia do przodu ta piekielna metafora stawała się coraz bardziej oczywista. Mnogość sklepów, parkingów i z rzadka zapalane lampy uliczne Kihei przywodziły na myśl nie miasto, lecz raczej marnie zaprojektowany, rozwlekły program komputerowy. Zamiast skierować ruch pojazdów na sąsiednie ulice i drogi ekspresowe, planiści miejscy zepchnęli wszystko do jednego zatłoczonego cieku głównej drogi. Dla hakera siedzenie w samochodzie w środku tego bałaganu było jak słuchanie nagranego na płcie CD zgrzytu paznokci na szkolnej tablicy. + +"Niedoskonałość systemów doprowadza hakerów do szału - zauważył Steven Levy, co było kolejnym ostrzeżeniem, jakiego mi udzielono przed wejściem do samochodu prowadzonego przez Stallmana. - Właśnie dlatego hakerzy nie lubią prowadzić samochodów w ruchu, w którym zapalające się przypadkowo czerwone światła i dziwacznie ułożone ulice jednokierunkowe powodują niepotrzebne opóźnienia. Wywołuje to u nich chęć zmiany ustawienia znaków, przeprogramowania skrzynek sterujących światłami... innego zaprojektowania całego systemu"2. + +Ale najbardziej denerwująca była głupota przewodnika, któremu zawierzyliśmy. Zamiast znaleźć skrót umożliwiający jak najszybsze dotarcie do celu - co powinien uczynić instynktownie każdy haker - włączył nas do gry wymyślonej przez miejskich planistów. Jak Wergiliusz w "Piekle" Dantego postanowił odbyć z nami pełny objazd tego hakerskiego piekła, niezależnie od tego, czy mieliśmy na to ochotę. + +Zanim zdążyłem podzielić się ze Stallmanem tą opinią, nasz przewodnik wreszcie zapalił prawy kierunkowskaz. Stallman odprężył się nieco i napięcie w samochodzie na chwilę zelżało. Wróciło, gdy kierowca przed nami zwolnił. Po obu stronach ulicy widać było znaki "Roboty drogowe", a pasma drogi dojazdowej do odległej o ćwierć mili autostrady Pilani blokował bezczynnie stojący buldożer i dwie sterty gruzu. + +Dopiero po chwili Stallman zdołał zorientować się, że nasz przewodnik manewruje, by zawrócić. Gdy jego wzrok padł na buldożer i napis "Przejazd zamknięty", wszystko się w nim zagotowało. + +"Dlaczego, dlaczego, dlaczego? - zaskowyczał. - Powinieneś wiedzieć, że tu nie ma przejazdu. Powinieneś wiedzieć, że tu nie przejedziesz. Robisz to specjalnie". + +Kierowca zakończył manewr i minął nas, wracając na główną ulicę. Potrząsnął przy tym głową i usprawiedliwiająco wzruszył ramionami. Ten gest w połączeniu z zębami wyszczerzonymi w uśmiechu był podkreśleniem kontrastu między frustracją przybysza z kontynentu a spokojnym fatalizmem wyspiarza. Przez zamknięte szyby wynajętego przez nas samochodu dotarł do nas sens tego zwięzłego komunikatu "To jest Maui i co począć?" + +Tego już Stallman nie mógł znieść. + +"Mam dość twego pieprzonego uśmiechu - wrzasnął, przyćmiewając mgiełką oddechu zamkniętą szybę. - To twoja pieprzona wina. Wszystko poszłoby łatwiej, gdybyś to robił moim sposobem". + +Stallman słowa "moim sposobem" podkreślił dwukrotnym uchwyceniem i pociągnięciem do siebie kierownicy. Przypominało to histerię dziecka, które siedząc za kierownicą, na niej wyładowuje swą złość. Dźwięki, jakie z siebie wydawał, wskazywały, że jest wściekły, udręczony i bliski łez. + +Na szczęście łzy się nie pojawiły. Jego furia ustała tak nagle, jak nagle się pojawiła. Po kilku jękliwych sapnięciach zawrócił samochód. Gdy ponownie znaleźliśmy się na głównej ulicy, jego twarz była już tak spokojna jak 30 minut temu, gdy wyjeżdżaliśmy z hotelu. + +Po pięciu minutach dotarliśmy do następnego skrzyżowania. Tym razem łatwo wjechaliśmy na autostradę i po kilku sekundach mknęliśmy w stronę Pa'ia, napawając się uspokajającą szybkością. Słońce jeszcze niedawno jasno żółcące się po lewej stronie Stallmana, teraz świeciło w lusterku wstecznym pomarańczową czerwienią, tak jakby pożyczyło barwy od drzew wili wili obrastających obie strony autostrady. + +Przez następnych dwadzieścia minut słyszeliśmy jedynie dźwięk silnika samochodowego, szum opon na asfalcie oraz dźwięki wiolonczeli i skrzypiec brzmiących smętnymi ludowymi nutami pieśni z Appalachów. + + +Rozdział 13. +Kontynuacja walki + +Czas nie mógł uleczyć wszystkich ran Stallmana, ale był jego sprzymierzeńcem. + +Nawet po czterech latach krytyka zapisana przez Raymonda w Katedrze i bazarze (The Cathedral and the Bazaar) tkwiła jak zadra w jego duszy. Boczył się także na Linusa Torvaldsa za zajęcie pozycji najsławniejszego hakera na świecie. Jeszcze dziś wspomina koszulkę typu T-shirt, która zaczęła się pojawiać na targach linuksowych w roku 1999. Zaprojektowano ją na wzór plakatu Gwiezdnych Wojen - z Torvaldsem wymachującym mieczem świetlnym jak Luke Skywalker i twarzą Stallmana na szczycie korpusu R2D21. Ta koszulka wciąż gra mu na nerwach, nie tylko dlatego, że przedstawia go w roli pomagiera Linusa, lecz z tego powodu, że podnosi Torvaldsa do rangi przywódcy społeczności wolnego oprogramowani i oprogramowania open source, roli, której nawet on sam sobie nie przypisuje. "To śmieszne, że sam Torvalds nie zamierzał dzierżyć tego miecza - mówi z żalem. - Wszyscy uznali go za przywódcę ruchu, a on nie miał ochoty na walkę. Gdzie tu sens?" + +Ta niechęć Torvaldsa do "wzięcia w dłoń miecza" pozwoliła Stallmanowi zachować pozycję najwyższego arbitra hakerskiej etyki. Pomimo poczucia krzywdy Stallman musi przyznać, że kilka ostatnich lat to niezły czas dla niego samego i jego organizacji. Odsunięty na ubocze przez nieoczekiwany sukces GNU/Linuksa, zdołał jednak odzyskać inicjatywę. Od stycznia 2000 do grudnia 2001 odwiedził 6 kontynentów, wygłaszając wykłady w krajach, w których sprawy wolnego oprogramowania cieszą się zainteresowaniem, np. Chinach i w Indiach. + +Nauczył się także budować swoją pozycję poza katedrą wykładowcy, jako osoba współodpowiedzialna za Powszechną Licencję Publiczną (GPL). Latem 2000, gdy powietrze nagle zaczęło uciekać z nadmuchanego w 1999 roku linuksowego balonu giełdowego, Stallman i jego Fundacja Wolnego Oprogramowania odnieśli dwa znaczne sukcesy. W lipcu 2000 Trolltech, norweska firma programistyczna, twórca Qt - wartościowego pakietu narzędzi graficznych dla systemu operacyjnego GNU/Linux - ogłosiła przyjęcie licencji GPL. Kilka tygodni później firma Sun Microsystems, dotychczas próbująca samodzielnie dbać o zachowanie kontroli nad prawami własności swojego oprogramowania open source, w końcu złagodziła swoje stanowisko i ogłosiła, że jej pakiet aplikacji OpenOffice będzie odtąd chroniony przez podwójną licencję - Lesser GNU Public License (LGPL)2 oraz Sun Industry Standards Source License (SISSL)3. + +Warto podkreślić, że oba zwycięstwa przyszły bez szczególnych starań ze strony Stallmana. W przypadku Trolltech Stallman pełnił jedynie rolę arcykapłana wolnego oprogramowania. W roku 1999 firma wystąpiła z własną licencją, wychodzącą naprzeciw warunkom Fundacji, ale po przeanalizowaniu jej treści Stallman zauważył prawne niezgodności, które mogły uniemożliwić łączenie Qt z programami chronionymi przez GPL. Zmęczony naleganiami Stallmana, zarząd Trolltecha ostatecznie zdecydował się rozdzielić Qt na dwie wersje chronione licencjami GPL i QPL, co umożliwiło twórcom oprogramowania obejście wytkniętych przez Stallmana problemów niezgodności. + +Sun od początku chciał postępować zgodnie z wytycznymi Fundacji Wolnego Oprogramowania. W roku 1999 na O'Reilly Open Source Conference współzałożyciel Sun Microsystems i szef działu badawczego firmy, Bill Joy, obronił "społeczną licencję" (ang. community licence) stanowiącą kompromisowe rozwiązanie o mniejszej mocy. Pozwalała ona użytkownikom na kopiowanie i modyfikowanie oprogramowania będącego własnością Suna, ale nie na pobieranie opłaty za to oprogramowanie, o ile wcześniej nie została zawarta umowa określająca sposób dzielenia zysków. Rok po przemówieniu Joya wiceprezes Sun Microsystems, Marco Boerries, z tej samej trybuny ogłosił kolejny kompromis. Dotyczył on OpenOffice, pakietu aplikacji zaprojektowanych specjalnie do stosowania w systemie operacyjnym GNU/Linux. + +"Mogę to wyrazić za pomocą trzech liter - GPL" - powiedział. + +Jak stwierdził Boerries, decyzja firmy miała niewiele wspólnego ze Stallmanem, a o wiele więcej z rozmachem rozpowszechniania się programów chronionych licencją GPL. "Przede wszystkim różne produkty są atrakcyjne dla różnych społeczności i licencja chroniąca dany produkt powinna być dostosowana do wymagań danej społeczności - stwierdził Boerries. - A jest oczywiste, że OpenOffice jest produktem dla społeczności GPL-owskiej"4 i 5. + +Takie komentarze pokazywały nierozpoznaną od razu moc GPL, a pośrednio - polityczny geniusz człowieka, który odegrał najważniejszą rolę przy jej tworzeniu. "Nie było na świecie prawnika, który potrafiłby naszkicować GPL w tej postaci - twierdzi Eben Moglen, profesor prawa na Columbia University i generalny doradca Fundacji Wolnego Oprogramowania. - A jak widać, to działa. Działa dzięki filozofii stworzonej przez Richarda". + +Moglen, niegdyś zawodowy programista, śledzi swą współpracę ze Stallmanem pro publico bono sięgającą roku 1990, gdy został poproszony o poradę prawną w sprawie prywatnej. Współpracował wówczas z ekspertem od szyfrowania, Phillipem Zimmermanem, wspierając go w prawnej batalii z National Security Administration. Prośbę Stallmana uznał za wyróżnienie: "Powiedziałem mu, że codziennie używam Emacsa i musiałbym wykonać wielką pracę prawniczą, gdybym chciał spłacić zaciągnięty dług". + +Od tego momentu Moglen o wiele dokładniej niż ktokolwiek inny mógł śledzić przeistaczanie się hakerskiej filozofii Stallmana w prawną rzeczywistość. Twierdzi, że Stalman niemal tak samo podchodzi do tekstu prawnego i kodu programu komputerowego. "Jako prawnik muszę powiedzieć, iż pomysł, aby w dokumencie prawnym wyszukać wszystkie błędy i niedociągnięcia, nie ma wielkiego sensu - mówi Moglen. - W każdym postępowaniu prawnym jest pewna doza niepewności i prawnicy starają się wyciągnąć stąd korzyści dla swego klienta. Cel Richarda był zupełnie inny. On chciał usunąć wszystkie niejasności, co jest z natury rzeczy niemożliwe. Niemożliwe jest także napisanie jednej licencji, która pasowałaby do wszystkich okoliczności we wszystkich systemach prawnych na całym świecie. Ale jeżeli wejdziesz między wrony, musisz krakać tak jak one; musiałem się dostosować. Zdumiewa elegancja i prostota wyniku. Chyba zostało tu osiągnięte wszystko, co było możliwe do osiągnięcia. Niewiele prac prawniczych może się z tym równać". + +Jako osoba odpowiedzialna za realizację zadań zgodnie z planem nakreślonym przez Stallmana, Moglen doskonale rozumie frustrację potencjalnych sojuszników. "Richard jest człowiekiem nieuznającym kompromisów w sprawach, które uważa za fundamentalne - mówi - i z trudem pojmuje pokrętność słów i poszukiwanie dwuznaczności, która okazuje się pożądana przez część społeczeństwa". + +Ponieważ Fundacja Wolnego Oprogramowania nie miała ochoty na rozważanie kwestii leżących poza zagadnienia GNU i GPL, Moglen resztę swej energii poświęcił współpracy z Electronic Frontier Foundation6, organizacji dającej wsparcie osobom ostatnio oskarżonym o łamanie praw autorskich, takim jak np. Dymitr Sklarow7. W roku 2000 Moglen był także doradcą grupy hakerów zajmujących się programem deCSS deszyfrującym zapis DVD. Moglen nauczył się doceniać upór swojego głównego klienta pomimo jego małomówności. "Zdarzało się, że przychodziłem do Richarda, mówiąc Musimy to zrobić. Musimy tamto zrobić. To jest strategicznie ważna sytuacja. Następny ruch powinien być taki. Oto, co musimy zrobić, na co on odpowiadał Nie musimy niczego robić. Poczekajmy, aż to, co potrzebne, zostanie wykonane". + +"I wiesz co? - dodaje Moglen. - Zwykle miał rację". + +Takim komentarzom przeczy wypowiedź samego Stallmana: "Nie nadaję się do prowadzenia rozgrywek - odpowiada wielu krytykom uznającym go za przebiegłego stratega. - Nie potrafię przewidywać działań innych. Zawsze zwracałem uwagę głównie na budowanie podstaw. Mówiłem Temu, co robimy, dajmy możliwie najmocniejsze podstawy". + +Rosnąca popularność GPL i coraz większa siła przyciągania tej licencji najlepiej świadczyły o jakości fundamentów założonych przez Stallmana i jego kolegów z projektu GNU. Stallman, choć nie mógł się już uważać za "ostatniego prawdziwego hakera", nadal był uznawany za kogoś, kto sam stworzył etyczne zasady ruchu wolnego oprogramowania. Niezależnie od tego, czy współczesnym hakerom w pełni odpowiadały ramy nakreślone przez Stallmana, dzięki niemu mieli wybór sposobu działania i to stanowiło największą wartość jego spuścizny. + +Mówienie o spuściźnie Stallmana zdaje się być nieco przedwczesne. W chwili, gdy piszę te słowa, Stallman ma 48 lat i przed sobą czas, w ciągu którego może powiększyć swe dzieło lub nieco uszczknąć z należnej mu chwały. Nadal samosterująca natura ruchu wolnego oprogramowania skłania do spojrzenia na życie Stallmana ponad codziennymi walkami z przemysłem programistycznym i szukania cech ogólniejszych o znaczeniu historycznym. + +Stallman odrzuca wszystkie spekulacje dotyczące jego osoby. "Nigdy nie potrafiłem opracować szczegółowego planu, przewidującego, co przyniesie przyszłość" - twierdzi i nieco przedwcześnie proponuje, aby na jego nagrobku wyryć epitafium: "Zawsze byłem gotowy do walki, choć nie wiedziałem, dokąd mnie ona zawiedzie". + +Jest oczywiste, że, wybierając walkę, odstręczył od siebie wielu ludzi, którzy mogli stać się jego największymi sprzymierzeńcami. Hołdem dla jego prostolinijnej etycznej natury jest fakt, że wielu jego niegdysiejszych przeciwników politycznych, gdy ich przyprzeć do muru, potrafi powiedzieć o nim nieco dobrego. Zdziwienie biografa budzi jednakże napięcie między Stallmanem-ideologiem i Stallmanem-genialnym hakerem, jednakże nie ma tu miejsca na rozważanie, jak ludzie będą pamiętali Stallmana, gdy jego już nie będzie". + +We wczesnych szkicach tej książki nazwałem ten rozdział "Po 100 latach". Mając nadzieję na obiektywne opisanie Stallmana i jego dzieła, wypytywałem wielu ludzi, osobistości przemysłu programistycznego. Proponowałem im wzniesienie się ponad bieżące wydarzenia i spojrzenie na sprawę z pozycji historyka, który będzie badał ruch wolnego oprogramowania po 100 latach. W chwili obecnej łatwo snuć porównania Stallmana do wielu Amerykanów z przeszłości, którzy zajmując marginalną pozycję w życiu współczesnym, z perspektywy historycznej sięgnęli wyżyn uznania. Łatwo przeprowadzić paralelę z Henrym Davidem Thoreau8 transcendentalnym filozofem i autorem "Cywilnego nieposłuszeństwa" (ang. On Civil Disobedience) oraz Johnem Muirem9, założycielem Sierra Club i propagatorem współczesnego ruchu ochrony środowiska. Łatwo też zauważyć podobieństwo do Williama Jenningsa Bryana10, znanego także jako "Wielki człowiek z ludu" (ang. Great Commoner), lidera populistyczngo ruchu społecznego, wroga monopoli, w swoim czasie człowieka potężnego, którego znaczenie jednakże maleje, gdy spoglądamy nań z perspektywy historii. + +Choć nie on pierwszy uznał oprogramowanie za własność powszechną, z powodu GPL Stallman zasłużył sobie na notkę w przyszłych podręcznikach historii. Mając to na względzie, warto przesunąć się w czasie, by spojrzeć na spuściznę Stallmana spoza obecnych ram czasowych. Czy w roku 2102 GPL będzie wciąż coś znaczyła dla programistów, czy pozostanie jedynie wspomnieniem po czymś, co dawno zostało odrzucone na margines historii? A może termin "wolne oprogramowanie" będzie jedynie taką osobliwością jak dziś "wolne srebro" (ang. free silver)11? A może jest inspirującą wytyczną przyszłych politycznych zdarzeń? + +Przewidywanie przyszłości jest zajęciem ryzykownym, ale wielu ludzi, proszonych o to, chętnie to ryzyko podejmuje. "Za sto lat Richard i kilku innych będą zasługiwali na o wiele więcej uwagi niż krótki przypisek historyczny - mówi Moglen. - Są na drodze do znalezienia się w centrum uwagi historii". + +Wśród tych "kilku innych", których Moglen uznaje za godnych znalezienia się na kartach historii, są John Gilmore, najpierw doradca Stallmana w czasie powstawania DPL, a potem założyciel Electronic Frontier Foundation, a także Theodor Holm Nelson, znany jako Ted Nelson12, autor wydanej w roku 1982 książki "Literary Machines". Moglen twierdzi, że Stallman, Nelson i Gilmore wnieśli do historii trzy różne i niezależne rozwiązania. Nelson, powszechnie znany jako ten, który ukuł pojęcie "hipertekst", był pierwszym, który przewidział niedogodności wynikające z praw własności informacji w wieku technologii cyfrowych, zaś Gilmore'owi i Stallmanowi zawdzięczamy zidentyfikowanie negatywnych politycznych efektów kontrolowania informacji. Oni też stworzyli organizacje zwalczające te zagrożenia: Gilmore - Fundację Elektronicznego Pogranicza (Electronic Frontier Foundation), zaś Stallaman - Fundację Wolnego Oprogramowania (Free Software Foundation). Jednakże, zdaniem Moglena, działania Stallmana mają bardziej osobisty i mniej polityczny charakter. + +"Richard jest jedynym, który tak wcześnie zauważył etyczne implikacje zniewolenia oprogramowania - mówi Moglen. - Choć wielu piszących o nim uważa zajęcie się tym problemem za działanie uboczne lub nawet za jego błąd życiowy, w rzeczywistości wynika to bezpośrednio z jego osobowości". + +Gilmore, który z mieszanymi uczuciami przyjął umieszczenie go między kapryśnym Nelsonem i drażliwym Stallmanem, jednak przytakuje Moglenowi, pisząc: + + Przypuszczam, że teksty Stallmana wytrzymają próbę czasu tak, jak wytrzymało ją to, co napisał Thomas Jefferson. Stallman pisze jasno i jasno wyraża swe zasady... To, czy stanie się on równie wpływowy jak Jeferson, zależy od tego, czy abstrakcje, które nazywamy "prawami obywatelskimi", staną się za 100 lat ważniejsze od abstrakcji, które nazywamy teraz "oprogramowaniem" i "technicznie narzuconymi ograniczeniami". + +Gilmore zwraca uwagę, że dorobkiem Stallmana, którego nie można nie dostrzec, jest wprowadzony w projekcie GNU pionierski model współtworzenia oprogramowania. Choć czasem w postaci skażonej, zdołał on jednak stać się standardem w przemyśle programistycznym. Gilmore przypuszcza, iż być może właśnie ten model kooperatywnego tworzenia programów w przyszłości będzie miał większe znaczenie niż projekt GNU, licencja GPL lub którykolwiek z programów napisanych przez Stallmana: + + Przed nastaniem Internetu współpraca na odległość była bardzo utrudniona i ciężko było wspólnie tworzyć programy nawet w zespole, którego członkowie znali się nawzajem i ufali sobie. Richard stworzył model kooperatywnego tworzenia programów także przez grupy złożone z osób niezorganizowanych i rzadko się spotykających. Nie zbudował żadnego z narzędzi służących do takiej współpracy (protokołu TCP, list e-mailowych, narzędzi diff/patch13, plików tar14, RCS15 lub CVS lub zdalnego CVS16), ale zawsze używał wszystkiego, co było dostępne i pomocne w tworzeniu grup programistów, którzy mogli efektywnie współpracować. + +Wtóruje mu Lawrence Lessig, profesor prawa w Stanford i autor książki roku 2001 The Future of Ideas (Przyszłość idei). Jak wielu innych wykładowców akademickich Lessig uważa GPL za główny bastion tak zwanej wspólnoty cyfrowej (ang. digital commons), wielkiej społeczności oprogramowania będącego wspólną własnością oraz standardów sieciowych i komunikacyjnych, które w ciągu ostatnich trzech dekad umożliwiły gwałtowny rozwój Internetu. Raczej nie łączy Stallmana z innymi wielkimi pionierami Internetu jak Vannear Bush17, Vinton Cerf18 i J. C. R. Licklider19, którzy przekonali innych do stosowania technologii komputerowej na szeroką skalę. Uważa, że jego wpływ był bardziej osobisty, introspektywny i niepowtarzalny: + + (Stallman) zastąpił debatę o tym, co jest, debatą o tym, co być powinno. Zmusił ludzi do zastanowienia się, jak wysoka jest stawka, i stworzył narzędzia do wprowadzenia swych idei w życie... Nie wiem, na jakim miejscu należy go umieścić obok Cerfa i Licklidera. Wymyślił coś zupełnie innego. Nie jest to jakiś nowy rodzaj kodu lub wyposażenie Internetu w nowe możliwości. To raczej uświadomienie ludziom wartości pewnej części Internetu. Nie sądzę, aby udało nam się znaleźć kogoś tej samej klasy przed nim lub po nim. + +Oczywiście, nie wszyscy traktują osiągnięcia Stallmana jako warte upamiętnienia. Eric Raymond, jeden z twórców oprogramowania open source, uważa, że przywódcza rola Stallmana znacznie zmalała po roku 1996 i oglądając w czarodziejskiej szklanej kuli świat roku 2102, spostrzega zmieszanie sprzecznych ocen: + + Myślę, że artefakty Stallmana (GPL, Emacs, GCC) będą uznane za dzieła rewolucyjne, kamienie węgielne świata informacji, ale historia będzie mniej łaskawa dla teorii będących podstawą działania RMS, a całkiem zlekceważy jego pragnienia uczynienia się kultowym przywódcą pewnej grupy. + +Sam Stallman również ma mieszane uczucia: + + Co za dwadzieścia lat historia powie o projekcie GNU, będzie zależało od tego, kto zwycięży w walce o wolność ludzkiej wiedzy. Jeżeli przegramy, pozostaniemy jedynie przypisem na kartach historii. Jeżeli zwyciężymy, nie jest pewne, czy ludzie będą znali rolę systemu operacyjnego GNU; jeżeli będą nazywać ten system "Linuksem", zbudują fałszywy obraz tego, co się działo i przyczyn, które do tego doprowadziły. + +Nawet jeżeli zwyciężymy, to, co będą pisać historycy za sto lat, będzie zależało od tego, kto będzie wówczas dzierżył ster władzy politycznej. + +Szukając swego odpowiednika wśród dziewiętnastowiecznych postaci historycznych, Stallman wspomina Johna Browna20, wojowniczego abolicjonistę21 uznanego za bohatera po jednej stronie linii Masona-Dixona (Mason Dixon line)22 i za szaleńca po drugiej stronie. + +Rewolta, której pragnął John Brown, nigdy nie wybuchła, ale podczas późniejszego procesu udało się mu rozbudzić w społeczeństwie żądanie abolicji. Podczas wojny domowej uznawano go za bohatera, ale w 100 lat później, a nawet przez większość XX wieku, podręczniki historii zwykle przedstawiały go jako szaleńca. W okresie legalnej segregacji, gdy bigoteria nie przynosiła wstydu, Stany Zjednoczone częściowo zaakceptowały to, co stany południowe miały do powiedzenia na swój temat - wiele nieprawdziwych opinii o wojnie secesyjnej i związanych z nią sprawach przeniknęło wówczas do podręczników historii. + +Takie porównania świadczą o tym, że sam Stallman postrzega swą obecną pracę jako zjawisko peryferyjne wobec głównego biegu zdarzeń, oraz o podwójnej naturze jego obecnej reputacji. Trudno sobie wyobrazić, by opinia o nim kiedykolwiek sięgnęła takich nizin infamii jak opinia o Johnie Brownie po zakończeniu odbudowy ze zniszczeń wojny secesyjnej, jednakże wojenne analogie w jego wypowiedziach nie stały się zaczynem żadnego buntu i łatwo sobie wyobrazić, że w przyszłości jego idee zostaną zapomniane. Nadając działaniom dotyczącym wolnego oprogramowania postać nie masowego ruchu, lecz raczej ciągu prywatnych potyczek z siłami upowszechniającymi oprogramowanie z prywatnymi prawami własności, Stallman zdaje się stawiać swoich, równie upartych jak on, zwolenników w sytuacji uniemożliwiającej zwycięstwo. + +Pomimo wszystko może się to kiedyś okazać jego najtrwalszą spuścizną. Moglen w ciągu ostatniego dziesięciolecia z bliska obserwujący te zdarzenia, ostrzega wszystkich, którzy błędnie chcą uważać osobowość Stallmana za dodatek do jego dokonań. Bez takiej osobowości Stallman nie stworzyłby wielu rzeczy godnych uwagi, twierdzi Moglen, były urzędnik Sądu Najwyższego: + + Największym człowiekiem, dla którego kiedykolwiek pracowałem, był Thurgood Marshall23. Wiem, co uczyniło go wielkim. Wiem, dlaczego potrafił zmienić świat zgodnie z własnym wyobrażeniem. Porównywanie ich obu, byłoby nadużyciem, gdyż trudno znaleźć dwie bardziej odmienne postaci. Thurgood Marshall był niezwykłym człowiekiem, reprezentował wyrzuconych poza nawias wobec społeczeństwa, które się przed nimi zamknęło. Jego zdolności i umiejętności były zdolnościami i umiejętnościami społecznymi. Pod wszelkimi innymi względami różnili się, ale pomimo to ze wszystkich, których poznałem, tylko Stallman jest tak samo monolitem wykonanym z jednej bryły, z materii, z której zbudowane są gwiazdy. + +Aby sprowadzić ten obraz na ziemię, Moglen wspomina spotkanie ze Stallmanem na wiosnę 2000. W mediach zajmujących się sprawami biznesu odbijało się jeszcze echo sukcesu VA Linux IPO i przy okazji omawiano kilka tematów dotyczących wolnego oprogramowania. W środku tego huraganu tematów i historii wymagających komentarza zasiadł ze Stallmanem do lunchu, czując się jak drobina w oku cyklonu. W ciągu kilku następnych godzin spokojnie omawiali zagadnienia dotyczące jednego tematu: wzmocnienia GPL. + +"Siedzieliśmy tam, rozważając, co zrobimy z kilkoma problemami, które pojawiły się we wschodniej Europie, i co poczniemy, gdy problem własności zawartości zacznie zagrażać wolnemu oprogramowaniu - wspomina Moglen. - Podczas rozmowy zastanawiałem się, co mogą o nas myśleć ludzie obok. Widzieli dwóch brodatych anarchistów kreślących plany swych następnych poczynań. Oczywiście, Richard jak zwykle wyskubywał kosmyki ze swej czupryny, upuszczając je do talerza zupy. Ktokolwiek przysłuchiwał się naszej rozmowie, zapewne doszedł do wniosku, że jesteśmy szaleni, ale wiedziałem, że przy tym stole robimy rewolucję. Mówimy o tym, co się stanie, a ten człowiek sprawi, że to się urzeczywistni." + +Moglen twierdzi, że ten moment jak nic innego przekonał go o elementarnej prostocie stylu działania Stallmana. + +"Zabawne - wspomina Moglen. - Powiedziałem do niego Richardzie, wiesz co, ty i ja to tacy dwaj faceci, którzy nie zarobią grosza na tej rewolucji, a potem zapłaciłem za lunch, bo wiedziałem, że on nie ma pieniędzy". + + +Epilog +Miażdżąca samotność + +Pisanie biografii osoby żyjącej przypomina wystawianie sztuki w teatrze. Przedstawienie na scenie często blednie w porównaniu z dramatem za kulisami. + +Pisząc "Autobiografię Malcolma X" (The Autobiography of Malcolm X), Alex Haley dał czytelnikom rzadką okazję zajrzenia za kulisy. Wychodząc poza rolę ghostwritera1, w epilogu przemówił własnym głosem. Wyjaśnił, w jaki sposób niezależny reporter, przegnany przez rzecznika Nation of Islam jako "pachołek" i "szpieg", przeniknął przez polityczne i personalne bariery, aby przelać na papier historię życia Malcolma X. + +Waham się, czy mogę porównywać tę książkę z "Autobiografią Malcolma X", ale chciałbym wyrazić głęboką wdzięczność dla Haleya za napisanie tak szczerego i otwartego epilogu. Przez ostatnich 12 miesięcy był on dla mnie podręcznikiem, instrukcją opisywania postaci, która całą karierę zbudowała na sprzeciwie. Dlatego tę biografię postanowiłem zakończyć podobnym epilogiem, który ma być hołdem złożonym Haleyowi i informacją mówiącą czytelnikom, jak ta książka powstawała. + +Przygoda z pisaniem tej opowieści zaczęła się w mieszkaniu w Oakland i prowadziła mnie przez miejsca tak różne, jak: Dolina Krzemowa, Maui, Boston i Cambridge. Ostatecznie jest to jednak historia o dwóch miastach: Nowym Jorku, światowej stolicy wydawców książek, i Sebastopolu w Kalifornii, stolicy wydawców Sonoma County. + +Wszystko zaczęło się w kwietniu 2000 roku. Pisałem wówczas historie dla złej sławy witryny WWW BeOpen (http:// www.beopen.com). Jednym z pierwszych zadań było przeprowadzenie telefonicznego wywiadu z Richardem M. Stallmanem. Wywiad wypadł dobrze, aż tak dobrze, że łącze do niego zostało umieszczone na stronie WWW VA Software, Inc. (niegdyś VA Linux Systems, a poprzednio VA Research). W ciągu kilku godzin serwery BeOpem zagrzały się od licznych kliknięć użytkowników chcących przeczytać ten artykuł. + +Wszystkie znaki na niebie i ziemi wskazywały, że na tym się skończy. Jednakże gdy w trzy miesiące później uczestniczyłem w O'Reilly Open Source Conference w Monterey w Kalifornii, otrzymałem e-mail od Tracy Pattison, zarządzającej sprawami obcych praw autorskich w jednym z wielkich wydawnictw nowojorskich: + +Do: sam@BeOpen.com +Temat: Wywiad z RMS +Data: 10 lipca 2000, 15:56:37 -0400 + +Drogi Panie Williams + +Z wielkim zainteresowaniem przeczytałam na stronie +BeOpen Pański wywiad z Richardem Stallmanem. Od +pewnego czasu intryguje mnie RMS i jego działanie i +z przyjemnością stwierdzam, że Pański tekst o nim +był doskonały. Udało się Panu świetnie przekazać +ducha działań Stallmana dotyczących GNU-Linuksa i +Fundacji Wolnego Oprogramowania. + +Chciałabym jednak dowiedzieć się więcej i sadzę, że +nie tylko ja. Czy sądzi Pan, że jest dostępnych +więcej źródeł, które pozwoliłyby na rozszerzenie i +uaktualnienie Pańskiego wywiadu w celu lepszego +nakreślenie sylwetki Stallmana? Dodanie nieco +anegdot i informacji zza kulis mogłoby naprawdę +zainteresować i poinformować wielu czytelników +spoza ścisłego kręgu programistów. + +E-mail kończył się prośbą o telefon w celu dokładniejszego omówienia sprawy. Zadzwoniłem. Tracy poinformowała mnie, że jej wydawnictwo rozpoczyna wydawanie serii książek elektronicznych i szuka historii, które mogą trafić do czytelników przyzwyczajających się do nowego medium. Format e-booka obejmował 30 tys. słów, czyli około 100 stron. Tracy przedstawiła swym szefom pomysł opisania głównych postaci hakerskiej społeczności. Szefom pomysł się spodobał, więc rozpoczęło się poszukiwanie postaci do opisania. To doprowadziło Tracy do mojego wywiadu ze Stallmanem na stronie BeOpen. Stąd ten e-mail do mnie. + +Tracy zapytała, czy zechciałbym rozszerzyć wywiad do pełnego opisu postaci Stallmana? + +Odpowiedziałem natychmiast, że tak. Poprosiła, abym spisał zarys tego, co chcę opisać, aby mogła to przedstawić swoim szefom. Dwa dni później wysłałem jej żądany opis proponowanego tekstu. Po tygodniu otrzymałem e-mail z odpowiedzią. Jej szefowie "dali zielone światło". + +Muszę przyznać, że dopiero wtedy pomyślałem o konieczności pozyskania Stallmana do udziału w tym e-bookowym projekcie. Jako reporter zajmujący się zagadnieniami oprogramowania open source, wiedziałem, że Stallman był pedantem. Do tego czasu dostałem już od niego z pół tuzina e-maili karcących mnie za używanie nazwy "Linux" zamiast "GNU/ Linux". + +Wiedziałem także, że Stallman szuka sposobów dotarcia ze swoim przesłaniem do szerszego grona odbiorców. Pomyślałem, że jeżeli przedstawię mu projekt od tej strony, być może łatwiej go zaakceptuje. Jeżeli nie, pozostanie mi korzystanie z wielkiej liczby rozsianych w Internecie dokumentów, wywiadów i zapisanych z nim rozmów, a następnie napisanie nieautoryzowanej biografii. + +Podczas poszukiwania materiałów trafiłem na esej pod tytułem Freedom-Or Copyright? (Wolność czy prawo autorskie). Napisany przez Stallmana i opublikowany w czerwcowym wydaniu MIT Technology Review (Przeglądzie technicznym MIT) artykuł nie pozostawiał suchej nitki na e-bookach, wyliczając całą litanię ich grzechów. Stallman narzekał, że czytelnicy, aby czytać tekst, muszą korzystać z oprogramowania z zastrzeżonymi prawami własności, a do tego stosuje się bardzo silne zabezpieczenia przed nieautoryzowanym kopiowaniem. Zamiast zwykłego łatwego do przekazywania pliku HTML lub PDF czytelnicy ściągają plik szyfrowany. W rzeczywistości kupowanie e-booka oznacza kupowanie nieprzekazywalnego klucza do rozpakowania zaszyfrowanego pliku. Każda próba odczytania zawartości książki bez autoryzowanego klucza jest uznawana za pogwałcenie Digital Millennium Copyright Act z roku 1998, ustawy stworzonej dla wzmocnienia praw autorskich w Internecie. Tych, którzy dokonaliby konwersji zawartości książki do pliku z otwartym formatem, czekają kary, nawet gdyby ich jedynym celem było czytanie tekstu na innym domowym komputerze. W przeciwieństwie do zwykłej książki właściciel e-booka nie może go pożyczyć, skopiować lub odsprzedać. Stallman ostrzegał, że może go jedynie czytać na autoryzowanej maszynie: + + Używając papierowych książek, zachowujemy wszystkie stare wolności. Sytuacja pogarsza się, gdy książka drukowana zostaje zastąpiona przez elektroniczną. "Elektroniczny atrament" może pisać wciąż na tym samym "papierze", a więc również czasopisma staną się efemerydami. Wyobraźcie sobie: żadnych antykwariatów z używanymi książkami, żadnego pożyczania książek przyjaciołom, żadnego wypożyczania książek z bibliotek publicznych, żadnych "przecieków", pozwalających komuś przeczytać książkę bez płacenia za nią (a uwzględniwszy dodatki Microsoft Reader, również żadnego anonimowego kupowania książek). Taki świat szykują nam wydawcy.2 + +Nie trzeba chyba wyjaśniać, że takie stawianie sprawy wprawiło nas w zakłopotanie. Ani Tracy, ani ja nie zastanawialiśmy się, jakiego oprogramowania chce użyć jej firma, i jakie prawa autorskie mają chronić e-bookowe wydanie. Wspomniałem Tracy o artykule w Technology Rewiev i poprosiłem o informacje na temat polityki wydawnictwa dotyczącej e-booków. Obiecała dowiedzieć się. + +Paląc się do roboty, postanowiłem tak czy inaczej zatelefonować do Stallmana i wspomnieć mu o e-bookowym pomyśle. Gdy o tym usłyszał, natychmiast się zainteresował i zgłosił zastrzeżenia. "Czy czytałeś mój artykuł o e-bookach?" - zapytał. + +Gdy powiedziałem, że tak i że czekam na informacje z wydawnictwa, postawił dwa warunki: nie będzie wspierał + +e-bookowego mechanizmu licencjonowania, któremu jest z zasady przeciwny, i nie chce, aby wyglądało, że ten rodzaj wydawnictw popiera. "Nie chcę brać udziału w czymkolwiek, co pokazywałoby mnie jako hipokrytę" - stwierdził. + +Dla niego samo oprogramowanie było sprawą mniejszej wagi niż sposób jego licencjonowania. Stwierdził, że dopóty jest mu obojętne, jakie oprogramowanie jest używane, dopóki wydawca w licencji praw autorskich umożliwia dosłowne kopiowanie i rozpowszechnianie zawartości e-booka. Wskazał na The Plant Stephena Kinga jako na model możliwy do zastosowania. W czerwcu 2000 King ogłosił na swej oficjalnej stronie WWW, że postanowił samodzielnie wydać The Plant w postaci kolejnych odcinków. Zgodnie z zapowiedzią, książka w całości miała kosztować 13 dolarów podzielonych na ciąg wpłat jednodolarowych. Dopóty, dopóki przynajmniej 75% czytelników będzie płacić za kolejne rozdziały, King będzie udostępniał następne. Do sierpnia wydawało się, że pomysł działa - King opublikował już dwa rozdziały i pracował nad trzecim. + +"Można by zaakceptować coś takiego - mówił Stallman, - jeżyli tylko czytelnicy otrzymają prawo sporządzania dokładnych kopii". + +Przekazałem tę informację Tracy. Przekonany, że mnie i Tracy uda się dojść do porozumienia, zatelefonowałem do Stallmana i umówiłem się z nim na pierwszy wywiad związany z tą książką. Zgodził się bez dalszego dopytywania o szczegóły prawne wydania. Wkrótce po pierwszym wywiadzie przeprowadziłem następny (ten w Kihei), zorganizowany przed + +14-dniowym urlopem Stallmana na Tahiti. + +Podczas wakacji Stallmana z wydawnictwa nadeszły złe wieści. Dział prawny nie zgadzał się na zmianę noty copyright dla e-booków. Czytelnicy, którzy chcieliby dysponować książką w postaci zdatnej do przekazywania innym, musieliby złamać kod zabezpieczający i dokonać konwersji do otwartego formatu HTML. Oznaczałoby to przestępstwo podlegające karze. + +Mając dwa nowe wywiady, resztę książki musiałbym pisać bez dostępu do nowych materiałów. Postanowiłem jak najszybciej wybrać się do Nowego Jorku na rozmowę z moim agentem i z Tracy, mając nadzieję na znalezienie kompromisowego rozwiązania. + +Po przylocie do Nowego Jorku, spotkałem się z moim agentem, Henningiem Guttmanem. Było to nasze pierwsze osobiste spotkanie - Henning stwierdził, że czarno widzi sprawę. Nie wydawało mu się, że uda się przekonać wydawcę do kompromisu. Wielkie domy wydawnicze z podejrzliwością spoglądały na e-booki i nie miały ochoty na żadne ułatwiające unikanie płatności eksperymenty z prawami autorskimi. Jednakże jako agent specjalizujący się w książkach dotyczących technologii, był zaintrygowany naturą moich kłopotów. Powiedziałem mu o dwóch już odbytych wywiadach i obietnicy niewydawania książki w sposób, który "uczyniłby ze Stallmana hipokrytę". Uznawszy to za zobowiązanie etyczne, postanowił przyjąć to za punkt wyjścia do dalszych negocjacji. + +Poza tym pozostawało nam zawsze stosowanie metody "kija i marchewki". "Marchewką" byłaby reklama związana z pierwszym w świecie wydaniem e-booka zgodnie z zasadami wewnętrznej etyki hakerskiej. "Kijem" było ryzyko niespełnienia tych zasad. Na dziewięć miesięcy przed słynną w Internecie sprawą Dimitra Sklarowa zdawaliśmy sobie sprawę, że tylko kwestią czasu jest opracowanie przez jakiegoś hakera metody transmisji plików e-bookowych do otwartego formatu. Wiedzieliśmy także, że wydanie chronionego kodem e-booka o Richardzie Stallmanie było równoważne z wydrukowaniem książki z napisem na okładce "Ukradnij mnie". + +Po rozmowie z Henningiem zatelefonowałem do Stallmana. Chcąc uczynić "marchewkę" bardziej smakowitą, dyskutowałem z nim o dalszych możliwych kompromisach. Co będzie, jeżeli wydawca opublikuje książkę w podwójnej wersji z dwiema różnymi licencjami, tak jak Sun Microsystem postąpił z Open Office, pakietem wolnego oprogramowania biurowego? Wydawca mógłby wydać wersję e-bookową w normalnym formacie, korzystając ze wszystkich standardowych obostrzeń związanych z oprogramowaniem tego rodzaju, oraz mniej estetyczną, kopiowalną wersję HTML-ową. + +Stallman orzekł, że w zasadzie nie sprzeciwia się pomysłowi rozszczepienia licencji, ale nie chce, aby wersja wolna była gorsza od płatnej. Poza tym stwierdził, że pomysł jest dość kłopotliwy. Podwójna licencja jedynie dlatego została zastosowana do Sunowskiego Open Office, że on nie miał żadnego wpływu na tę decyzję. Jednakże w tym przypadku on, Stallman, może mieć wpływ na wynik, gdyż może odmówić współpracy. + +Zasugerowałem kilka innych rozwiązań, ale bez żadnego efektu. Udało mi się jedynie przekonać go, by zawarte w licencji e-booka zezwolenie na udostępnianie ograniczyć jedynie do rozpowszechniania niekomercyjnego. + +Na koniec zasugerował, abym zawiadomił wydawcę, iż obiecałem mu, że książka będzie wolno dostępna. Na to nie mogłem przystać, ale stwierdziłem, że praca bez jego współpracy wydaje mi się niemożliwa do skończenia. Wydawał się być usatysfakcjonowany i zakończył rozmowę swym zwyczajowym "Szczęśliwego hakowania". + +Ja i Hening spotkaliśmy się z Tracy następnego dnia. Powiedziała, że firma jest skłonna zgodzić się na wydanie niezakodowanych fragmentów książki, które będzie można swobodnie kopiować, ale ich wielkość ogranicza do 500 słów. Henning stwierdził, że to nie wystarczy do spełnienia obietnicy złożonej przeze mnie Stallmanowi. Tracy wspomniała o zobowiązaniach jej firmy wobec takich dostawców sieciowych jak Amazon.com. Zgoda na jednorazowe odkrycie zawartości e-booka oznaczałaby ryzyko narażenia się na pretensje partnerów handlowych. Zakładając, że nie zmienią się stanowiska wydawcy i Stallmana, musiałem podjąć decyzję. Mogłem wykorzystać dwa już przeprowadzone wywiady i złamać obietnicę daną Stallmanowi lub postąpić zgodnie z etyką dziennikarską i wycofać się z ustnej obietnicy danej wydawcy, rezygnując z pisania książki. + +Po spotkaniu poszedłem z agentem do pubu na Third Avenue. Z jego telefonu komórkowego zadzwoniłem do Stallmana, a ponieważ nikt nie odebrał, nagrałem się na automatyczną sekretarkę. Henning zostawił mnie samego, abym miał czas na zebranie myśli. Po chwili wrócił i podając mi telefon komórkowy, powiedział: + +"To Stallman" + +Od samego początku rozmowa przebiegała marnie. Przekazałem, co Tracy mówiła o zobowiązaniach zewnętrznych wydawcy. + +"Tak - stwierdził Stallman beznamiętnie. - A co mnie obchodzą ich przeklęte zobowiązania i kontrakty z innymi?" + +Stwierdziłem, że wymaganie, by jeden z głównych domów wydawniczych ryzykował bitwę prawną z partnerami z powodu zawierającego 30 000 słów e-booka, to zbyt wiele. + +"Nie rozumiesz, że właśnie o to chodzi? - powiedział Stallman. - Właśnie po to to robię. Potrzebne jest symboliczne zwycięstwo. Chcę, aby dokonali wyboru między wolnością i biznesem". + +Słowa "symboliczne zwycięstwo" odbijały się echem w moje głowie, gdy wzrokiem bezwiednie błądziłem po oknie, przyglądając się pieszym przesuwającym się po chodniku. Wchodząc do baru, byłem zadowolony, że znajduje się on zaledwie o przecznicę od rogu ulicy upamiętnionego w roku 1976 piosenką Ramonesa 53rd and 3rd, którą lubiłem grać, gdy byłem muzykiem. Tak samo jak owa opisana tam "męska prostytutka" czułem, że wszystko, co wcześniej miało sens, właśnie się rozpada. Ironia losu była niemal namacalna. Po tygodniach spokojnego przyglądania się zmaganiom innych sam znalazłem się w sytuacji kogoś usiłującego dokonać rzeczy niemal niemożliwej: namówienia do kompromisu Richarda Stallmana. + +Gdy nadal uśmiechając się i chrząkając, starałem się usprawiedliwić stanowisko wydawcy i przekonać Stallmana o mojej sympatii do niego, on, jak drapieżnik wyczuwający krew, zaatakował: + +"Ach, to tak? Starasz się mnie przycisnąć do muru? Zamierzasz po prostu przekonać mnie do ich racji?" + +Wróciłem do sprawy podwójnej licencji. + +"To znaczy licencji" - uciął krótko. + +"Tak licencji. Copyright. Prawo autorskie. Cokolwiek" - powiedziałem, czując się jak ranny zwierz zostawiający za sobą krwawy ślad. + +"Aha, więc dlaczego po prostu nie robisz tego, co ci mówię" - wrzasnął. + +Musiałem do końca wyciągać przeróżne argumenty w obronie stanowiska wydawcy, bo w moich notatkach pozostała wzmianka, że Stallman rzucił na koniec: "A co mi do tego? To, co robią, to diabelstwo, a ja czortów wspierać nie będę. Żegnam". + +Gdy tylko skończyłem rozmowę, mój agent wsunął mi w rękę szklankę świeżo nalanego Guinnessa. "Myślę, że to ci się przyda - powiedział ze śmiechem. - Widziałem, że pod koniec diabli cię brali". + +Rzeczywiście trząsłem się ze złości. I nie mogłem przestać, dopóki nie opróżniłem ponad połowy Guinnessa. Szlag mnie trafił, gdy usłyszałem, że jestem wysłannikiem "diabła". Byłem wściekły tym bardziej, że jeszcze trzy miesiące temu w mieszkaniu w Oakland rozmyślałem, o czym będę teraz pisał. A teraz siedziałem w miejscu, które dotąd znałem jedynie z rockowych piosenek, spotykałem się wydawcami, piłem piwo z agentem, którego do dnia wczorajszego nigdy na oczy nie widziałem. Było to tak surrealistyczne jak oglądanie odbicia własnego życia na filmie wyświetlanym wstecz. + +Po jakimś czasie mój organizm jednak odreagował i poczucie absurdu zamieniło się w niepohamowany wybuch śmiechu. W oczach mojego agenta zapewne wyglądało to na nerwowe załamanie kolejnego przewrażliwionego autora. A ja po prostu zacząłem doceniać absurdalne piękno mojej sytuacji. Interes wyjdzie lub nie, ale i tak zbierałem materiał na doskonałą historię. Gdy wybuchy mego konwulsyjnego śmiechu przycichły, wzniosłem toast. + +"Witam na froncie, przyjacielu - powiedziałem, stukając się z agentem kuflami. - "Cieszmy się, miast smucić". + +Gdyby to rzeczywiście była sztuka odgrywana na scenie, miałaby swe romantyczne interludia. Wyczerpani napięciem ostatniego spotkania, zostaliśmy zaproszeni przez Tracy na drinka z jej współpracownikami. Opuściliśmy bar na Third Avenue i skierowaliśmy się w stronę East Village, by spotkać się z nimi. + +Rozmawiając z Tracy, starannie unikałem tematów biznesowych. Rozmowa była przyjemna, relaksująca. Przed rozstaniem umówiliśmy się na spotkanie następnego wieczoru. I znów wieczór był tak przyjemny, że Stallman i e-book stały się odległym wspomnieniem. + +Po powrocie do Oakland dzwoniłem do różnych zaprzyjaźnionych dziennikarzy i znajomych. Opowiadałem o kłopotliwym położeniu, w jakim się znalazłem. Większość wyrzucała mi, że zbyt dużo obiecałem Stallmanowi na wstępnym spotkaniu. Były wykładowca szkoły dziennikarskiej radził, bym zignorował komentarz Stallmana na temat "hipokryty" i po prostu napisał, co mam do napisania. Dziennikarze, którzy znali stallmanowskie podejście do mediów, dawali dowody sympatii, ale jak jeden mąż mówili to samo: sam musisz się z tym uporać. + +Postanowiłem odłożyć książkę na drugi plan. Nawet z dwoma dotychczasowymi wywiadami nie posunąłem się zbytnio do przodu. Poza tym dawało mi to szansę rozmawiania z Tracy bez wcześniejszego ustalania spraw z Henningiem. Umówiliśmy się na spotkania jeszcze przed Bożym Narodzeniem: raz ona przyleciała na zachodnie wybrzeże, raz ja poleciałem do Nowego Jorku. Przed końcem stycznia spakowałem laptopa, wszystkie notatki i wylądowałem na lotnisku JFK. Pobraliśmy się 11 maja. To sporo jak na jedną nienapisaną książkę. + +Latem zacząłem rozmyślać nad notatkami z wywiadów i napisaniem na ich podstawie artykułu. Nie miałem żadnych wyrzutów sumienia, gdyż ustalając warunki wywiadów, nic nie mówiliśmy o klasycznych mediach drukowanych. Przyznaję, że czułem się swobodniej, gdyż przez kilka miesięcy sprawa w ogóle nie była poruszana. Od czasu naszej rozmowy telefonicznej otrzymałem od Stallmana tylko dwa e-maile. W obu dawał mi burę za użycie terminu "Linux" zamiast "GNU/ Linux", co mi się przydarzyło w kilku artykułach pisanych dla magazynu WWW Upside Today. Poza tym miałem spokój. W czerwcu, mniej więcej w tydzień po przemówieniu na Uniwersytecie Nowojorskim, przymierzyłem się do napisania o Stallmanie artykułu prasowego na około 5000 słów. Tym razem poszło gładko. Upływ czasu spowodował, że emocje opadły i pisałem spokojnie. + +W lipcu, w rok od otrzymania pierwszego e-maila od Tracy, zadzwonił Henning. Powiedział, że O'Reilly & Associates, wydawnictwo z Sebastopola w Kalifornii, jest zainteresowane biografią Stallmana. Ucieszyło mnie to. Ze wszystkich wydawnictw na świecie O'Reilly, które wydało The Cathedral and the Bazaar Erica Raymonda, zdawało się najlepiej wyczuwać problem, który zniweczył pierwszą próbę napisania książki o Stallmanie. Jako reporter często korzystałem z wydanego przez O'Reilly Open Sources jako źródła informacji historycznych. Wiedziałem, że różne rozdziały tej książki, w tym rozdział napisany przez Stallmana, zostały opublikowane z licencją zezwalającą na redystrybucję. Takie informacje mogły być przydatne, gdyby ponownie doszło do dyskusji na temat wydania elektronicznego. + +I rzeczywiście, sprawa wróciła. Od Henninga dowiedziałem się, że wydawnictwo zamierza wydać książkę w dwóch wersjach, klasycznej oraz w nowej serii subskrybowanych książek elektronicznych Safari Tech Books Online. Henning ostrzegł mnie, że licencja użytkownika Safari zawierała pewne ograniczenia3, ale O'Reilly jest skłonne zezwolić użytkownikom na kopiowanie i rozpowszechnianie tekstu niezależnie od rodzaju publikacji. W zasadzie jako autor mogłem wybierać między Open Publication License i GNU Free Documentation License. + +Sprawdziłem zawartość, pochodzenie i podteksty obu licencji. Open Publication License (OPL)4 daje czytelnikom prawo reprodukcji i rozpowszechniania pracy w całości lub w częściach w dowolnej postaci "fizycznej lub elektronicznej" z warunkiem objęcia kopii tą samą licencją. Pozwala także, pod pewnymi warunkami, na dokonywanie modyfikacji tekstu. Na koniec licencja ta zawiera kilka punktów ograniczeń do wyboru przez autora, który może ograniczyć tworzenie "istotnie zmienionych wersji" i książek pochodnych bez uzyskania jego wcześniejszej zgody. + +Natomiast GNU Free Documentation License (GFDL)5 pozwala na kopiowanie i rozpowszechnianie dokumentu w dowolnej postaci, jeżeli tylko zachowana zostanie pierwotna licencja. Pozwala także na modyfikowanie dokumentu pod pewnymi warunkami. Jednak w przeciwieństwie do OPL nie zawiera opcji pozwalających autorowi na ograniczanie wprowadzania zmian. Nie zezwala także na odrzucanie przez autora modyfikacji, które mogą prowadzić do powstania produktu konkurencyjnego. Narzuca także określoną postać przedniej i tylnej okładki, jeżeli ktoś inny niż właściciel praw autorskich zamierza opublikować więcej niż 100 egzemplarzy. + +Badając licencje, odwiedziłem także witrynę WWW projektu GNU i jej stronę Various Licenses and Comments About Them (Różne licencje i komentarze o nich)6 i 7. Znalazłem tam krytyczną opinię Stallmana na temat Open Publication License. Dotyczyła ona tworzenia wersji zmodyfikowanych i możliwości wybierania przez autora punktów ograniczających wprowadzanie zmian. Według Stallmana, jeżeli autor nie zamierzał wprowadzać żadnych ograniczeń, lepiej było zdecydować się na GFDL, gdyż minimalizowało to ryzyko wynikające z możliwości, jakie dawały opcje nie wybrane. + +W obu licencjach zezwolenie na dokonywanie modyfikacji wynikało z ich pochodzenia. W obu przypadkach prawo modyfikowania tekstu miało dać możliwość poprawiania instrukcji i podręczników i umożliwienie innym korzystania z wprowadzonych poprawek. Ponieważ moja książka nie miała być podręcznikiem, niewiele mnie obchodziły klauzule dotyczące modyfikacji. Zależało mi jedynie na tym, aby użytkownicy wersji elektronicznej mieli taką samą wolność rozpowszechnia kopii jak ci, którzy kupią książkę drukowaną. Uważając obie licencje za spełniające moje wymagania, podpisałem umowę przysłaną przez wydawnictwo O'Reilly. + +Jednak nadal intrygowała mnie możliwość nieograniczonego modyfikowania tekstu. Podczas moich poprzednich negocjacji z Tracy zastanawiałem się, jaki wpływ na książkę elektroniczną mogą mieć warunki licencji w stylu GPL. Doszedłem do wniosku, że w najgorszym razie taka licencja zapewni niezłą reklamę, zaś w najlepszym - skłoni czytelników do udziału w procesie tworzenia książki. Jako autor miałem ochotę pozwolić ludziom na wnoszenie poprawek, aby tylko moje nazwisko pozostawało na stronie tytułowej. Ciekawiła mnie także możliwość obserwowania ewolucji książki. Wyobrażałem sobie następne wydania jak rodzaj elektronicznej wersji Talmudu, gdzie mój oryginalny tekst, umieszczony w środkowej kolumnie, byłby otoczony objaśniającymi komentarzami umieszczonymi na obu marginesach. + +Inspiracją tej wizji był Project Xanadu (http://www.xanadu.com), legendarna koncepcja programistyczna Teda Nelsona z roku 1960. Na Open Source Conference, zorganizowanej przez O'Reilly w roku 1999, widziałem pierwszą demonstrację projektu Udanax będącego odrostem Xanadu i to, co widziałem, zachwyciło mnie. Podczas prezentacji dokument pierwotny i pracę pochodną pokazano w dwóch sąsiednich kolumnach zwykłego tekstu. E-bookowa biografia Stallmana nie miała stać się Udanaxem, ale dawała taką możliwość technologiczną, więc nie należało użytkownikom odbierać szansy takiej zabawy8. + +Gdy Laurie Petrycki, moja redaktorka w O'Reilly pozwoliła mi na wybieranie między OPL i GFDL, mogłem znów popuścić wodze fantazji. Do września 2001, gdy podpisałem kontrakt z O'Reilly, stało się jasne, że e-booki się nie przyjęły. Wiele wydawnictw, w tym wydawnictwo Tracy, straciło zainteresowanie ich wydawaniem. Zadziwiło mnie to i zaciekawiło. Czy ta forma przetrwałaby, gdyby została użyta nie jako inna postać publikacji lecz jako narzędzie do budowania więzi społecznych? + +Po podpisaniu umowy poinformowałem Stallmana, że sprawa książki znów jest aktualna. Wspomniałem, że O'Reilly daje mi możliwość wyboru między Open Publication License i the GNU Free Documentation License. Stwierdziłem, że skłaniam się raczej ku OPL tylko z tego powodu, aby nie dać innym wydawnictwom możliwości wydania tej samej książki w innych okładkach. Stallman na obronę GFDL podał argument, że O'Reilly już kilkakrotnie z tej licencji korzystało. Zaproponowałem umowę: wybiorę GFDK, jeżeli Stallman zgodzi się na większą liczbę wywiadów i przyczyni się do rozreklamowania książki. Przystał na wywiady, ale zastrzegł, że jego ewentualny udział w reklamowaniu książki będzie zależał od jej treści. Uważając to za uczciwe postawienie sprawy, umówiłem się na wywiad w Cambridge 17 grudnia 2001. + +Postarałem się na skoordynowanie terminu wywiadu ze służbową podróżą Tracy do Bostonu. Na dwa dni przed podróżą Tracy zaproponowała, aby zaprosić Stallmana na obiad. + +"Tak, czy inaczej, to przecież on nas połączył" - stwierdziła. + +Wysłałem do niego e-mail z propozycją i natychmiast otrzymałem akceptującą odpowiedź. Po przyjeździe następnego dnia do Bostonu spotkałem się z Tracy w hotelu, gdzie się zatrzymała, i zamówiłem taksówkę do MIT. Gdy znaleźliśmy się na Tech Squre, jeszcze przed zapukaniem do drzwi usłyszeliśmy Stallmana zajętego dyskusją. + +"Myślę, że nie będziecie mieć nic przeciwko" - powiedział, otwierając drzwi na tyle, abyśmy oboje mogli wejść i zobaczyć osobę, z którą rozmawiał. Była to młoda, około + +25-letnia kobieta. Na imię miała Sarah. + +"Pozwoliłem sobie zaprosić kogoś jeszcze do towarzystwa przy obiedzie" - powiedział, zerkając na mnie z chytrym uśmieszkiem, takim samym, jakim mnie obdarzył w restauracji w Palo Alto. + +Prawdę mówiąc, nie byłem zbytnio zaskoczony. Już kilka tygodni wcześniej przez matkę Stallmana dotarły do mnie wieści, że ma on nową przyjaciółkę. "W ostatnim miesiącu razem byli w Japonii, gdzie Richard pojechał odebrać nagrodę Takeda" - powiedziała mi pani Lippman9. + +W drodze do restauracji dowiedziałem się, w jaki sposób Sarah i Richard się poznali. Ciekawe, że te okoliczności nie były mi obce. Pracując nad powieścią, Sarah usłyszała o Stallmanie i jego interesującej osobowości. Postanowiła, że posłuży jej jako wzór dla jednej z powieściowych postaci. Chcąc dowiedzieć się, jak w rzeczywistości wygląda pierwowzór jej bohatera, poprosiła go o wywiad. Potem wszystko potoczyło się szybko. Jak powiedziała, byli razem od początku roku 2001. + +"Szczerze podziwiam sposób, w jaki Richard zbudował cały ruch polityczny poświęcony zaspokojeniu tego, co przepełniało całe jego jestestwo" - powiedziała Sarah, wyjaśniając, co ją przyciągnęło do Stallmana. + +Moja żona natychmiast spytała: "A cóż to było?" + +"Miażdżąca samotność". + +Podczas obiadu panie zajęły się własną rozmową, ja zaś spędziłem większość czasu, starając się dociec, czy ostatnie 12 miesięcy nieco zmiękczyło Stallmana. Nie spostrzegłem niczego, co mogłoby sugerować taką zmianę osobowości. Stał się może nieco bardziej figlarny i jego oczy dość często spoczywały na piersiach mojej żony, ale poza tym pozostał tak samo "kłujący jak jeż". W pewnym momencie moja żona powiedziała dość stanowczo "Broń Boże" jedynie po to, by usłyszeć typowe Stallmanowskie upomnienie: + +"Z przykrością muszę ci powiedzieć, że nie ma żadnego Boga". + +Jednakże gdy po obiedzie Sarah nas opuściła, obniżył nieco gardę. Gdy szliśmy do pobliskiej księgarni, przyznał, że 12 ostatnich miesięcy diametralnie zmieniło jego spojrzenie na życie. "Myślałem, że moim przeznaczeniem jest spędzić życie w samotności - powiedział. - Cieszę się, że się myliłem". + +Przed pożegnaniem wręczył mi swoją "rozrywkową" wizytówkę z adresem, telefonem i wyliczeniem ulubionych przyjemności (dobre książki, dobre jedzenie, egzotyczna muzyka i taniec), abym o tym pamiętał, umawiając się na następny wywiad. + +"Rozrywkowa" wizytówka Stallmana wręczona mi podczas wieczornego obiadu + +Następnego dnia, po kolejnym posiłku za sumę, która niech pozostanie w niepamięci, zdawał się być w jeszcze bardziej lirycznym nastroju. Wspominając swe debaty z Currier House na temat korzyści i niedogodności, jakie by przyniosła szczepionka dająca nieśmiertelność, wyraził nadzieję, że naukowcy kiedyś znajdą klucz do tej tajemnicy. "Teraz, gdy zażyłem nieco szczęścia, chciałbym mieć go więcej" - powiedział. + +Kiedy wspomniałem komentarz Sarah na temat "miażdżącej samotności", stwierdził, że nie widzi związku między samotnością w sensie fizycznym i duchowym a samotnością hakera. Jednakże, gdy później wróciliśmy do tego tematu, przyznał, że samotność lub obawa przed wieczną samotnością była główną siłą pchającą go do działania w pierwszym okresie projektu GNU. + +"Moja fascynacja komputerami nie była od czegokolwiek uzależniona - rzekł. - Moje zainteresowanie nie byłoby mniejsze, gdybym był popularny, a kobiety tłoczyłyby się wokół mnie. Jednakże jest prawdą, że na mój charakter głęboko wpłynął fakt, że nigdy nie miałem domu, a gdy znalazłem jeden, zaraz go straciłem, gdy znalazłem drugi, rychło legł w gruzach. Tym, który straciłem, była sypialnia w internacie, a tym, który został zburzony, było AI Lab. Poczucie niepewności wynikające z braku domu i przynależności do jakiejś społeczności było przemożne. Walczyłem, by odzyskać to, co straciłem." + +Po tym wywiadzie bezwiednie wytworzyło się we mnie pewne poczucie emocjonalnej symetrii. Słuchając Sarah mówiącej o tym, co ją pociąga w Stallmanie, i słuchając jego opisu uczuć, które pchnęły go do stworzenia ruchu wolnego oprogramowania, rozmyślałem nad tym, co skłoniło mnie do napisania tej książki. Od lipca 2000 nauczyłem się doceniać zarówno uwodzicielską, jak i odpychającą stronę charakteru Stallmana. Jak Eben Moglen przede mną tak i ja uznałem, że błędem jest traktowanie tej osobowości jako istniejącej obok i wyabstrahowanej z ruchu wolnego oprogramowania. Są to rzeczy, zjawiska wzajemnie się kształtujące i często nierozdzielne. + +Jestem pewien, że nie każdy czytelnik w tym samym stopniu odczuwa pokrewieństwo duchowe ze Stallmanem, niektórzy po przeczytaniu tej książki zapewne w ogóle się od niego odżegnają, ale większość chyba go zaakceptuje. Niewiele jest osób o osobowości tak pełnej humanizmu. Mam szczerą nadzieję, że inni, wsparci licencją GFLD, poczują nieprzepartą ochotę do uzupełnienia tego wstępnego portretu i rzucą nowe światło na osobę Richarda M. Stallmana. diff --git a/res/.svn/all-wcprops b/res/.svn/all-wcprops new file mode 100644 index 0000000..9b456d9 --- /dev/null +++ b/res/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 44 +/svnroot/align/!svn/ver/33/trunk/maligna/res +END diff --git a/res/.svn/entries b/res/.svn/entries new file mode 100644 index 0000000..92731c9 --- /dev/null +++ b/res/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/res +https://align.svn.sourceforge.net/svnroot/align + + + +2009-04-15T10:26:53.293198Z +33 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +net +dir + diff --git a/res/net/.svn/all-wcprops b/res/net/.svn/all-wcprops new file mode 100644 index 0000000..b438e91 --- /dev/null +++ b/res/net/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 48 +/svnroot/align/!svn/ver/33/trunk/maligna/res/net +END diff --git a/res/net/.svn/entries b/res/net/.svn/entries new file mode 100644 index 0000000..c6488af --- /dev/null +++ b/res/net/.svn/entries @@ -0,0 +1,38 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/res/net +https://align.svn.sourceforge.net/svnroot/align + + + +2009-04-15T10:26:53.293198Z +33 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +sourceforge +dir + diff --git a/res/net/sourceforge/.svn/all-wcprops b/res/net/sourceforge/.svn/all-wcprops new file mode 100644 index 0000000..68132c3 --- /dev/null +++ b/res/net/sourceforge/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/33/trunk/maligna/res/net/sourceforge +END diff --git a/res/net/sourceforge/.svn/entries b/res/net/sourceforge/.svn/entries new file mode 100644 index 0000000..f7bed45 --- /dev/null +++ b/res/net/sourceforge/.svn/entries @@ -0,0 +1,38 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/res/net/sourceforge +https://align.svn.sourceforge.net/svnroot/align + + + +2009-04-15T10:26:53.293198Z +33 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +align +dir + diff --git a/res/net/sourceforge/align/.svn/all-wcprops b/res/net/sourceforge/align/.svn/all-wcprops new file mode 100644 index 0000000..65e0d1b --- /dev/null +++ b/res/net/sourceforge/align/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 66 +/svnroot/align/!svn/ver/33/trunk/maligna/res/net/sourceforge/align +END diff --git a/res/net/sourceforge/align/.svn/entries b/res/net/sourceforge/align/.svn/entries new file mode 100644 index 0000000..10e8189 --- /dev/null +++ b/res/net/sourceforge/align/.svn/entries @@ -0,0 +1,38 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/res/net/sourceforge/align +https://align.svn.sourceforge.net/svnroot/align + + + +2009-04-15T10:26:53.293198Z +33 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +res +dir + diff --git a/res/net/sourceforge/align/res/.svn/all-wcprops b/res/net/sourceforge/align/res/.svn/all-wcprops new file mode 100644 index 0000000..b1ef6b6 --- /dev/null +++ b/res/net/sourceforge/align/res/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/align/!svn/ver/33/trunk/maligna/res/net/sourceforge/align/res +END diff --git a/res/net/sourceforge/align/res/.svn/entries b/res/net/sourceforge/align/res/.svn/entries new file mode 100644 index 0000000..81e45be --- /dev/null +++ b/res/net/sourceforge/align/res/.svn/entries @@ -0,0 +1,41 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/res/net/sourceforge/align/res +https://align.svn.sourceforge.net/svnroot/align + + + +2009-04-15T10:26:53.293198Z +33 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +test +dir + +xml +dir + diff --git a/res/net/sourceforge/align/res/test/.svn/all-wcprops b/res/net/sourceforge/align/res/test/.svn/all-wcprops new file mode 100644 index 0000000..3200042 --- /dev/null +++ b/res/net/sourceforge/align/res/test/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 75 +/svnroot/align/!svn/ver/32/trunk/maligna/res/net/sourceforge/align/res/test +END +simpletext.tmx +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/54/trunk/maligna/res/net/sourceforge/align/res/test/simpletext.tmx +END diff --git a/res/net/sourceforge/align/res/test/.svn/entries b/res/net/sourceforge/align/res/test/.svn/entries new file mode 100644 index 0000000..9b551db --- /dev/null +++ b/res/net/sourceforge/align/res/test/.svn/entries @@ -0,0 +1,103 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/res/net/sourceforge/align/res/test +https://align.svn.sourceforge.net/svnroot/align + + + +2009-04-15T07:14:58.474012Z +32 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +simpletext.al +file + + + + +2008-08-20T21:15:18.000000Z +2385445cc2d05adb02a9cae790bd4761 +2009-04-15T07:14:58.474012Z +32 +jarekl + + + + + + + + + + + + + + + + + + + + + +528 + +simpletext.tmx +file +54 + + + +2011-02-16T18:31:34.000000Z +49a615907286a285be3a4aeb0fdcf322 +2011-04-11T08:54:45.302219Z +54 +jarekl + + + + + + + + + + + + + + + + + + + + + +623 + diff --git a/res/net/sourceforge/align/res/test/.svn/text-base/simpletext.al.svn-base b/res/net/sourceforge/align/res/test/.svn/text-base/simpletext.al.svn-base new file mode 100755 index 0000000..d6a30d3 --- /dev/null +++ b/res/net/sourceforge/align/res/test/.svn/text-base/simpletext.al.svn-base @@ -0,0 +1,25 @@ + + + + + First sentence. + Second sentence. + + + Pierwsze zdanie. + + + + + + + Drugie zdanie. + + + + + + + + + \ No newline at end of file diff --git a/res/net/sourceforge/align/res/test/.svn/text-base/simpletext.tmx.svn-base b/res/net/sourceforge/align/res/test/.svn/text-base/simpletext.tmx.svn-base new file mode 100644 index 0000000..76a428d --- /dev/null +++ b/res/net/sourceforge/align/res/test/.svn/text-base/simpletext.tmx.svn-base @@ -0,0 +1,28 @@ + + +
+ + + + Pierwsze zdanie. + + + 0.1 + First sentence. + + + + + Second sentence. + + + + + Erste Satz. + + + Zweite Satz. + + + + diff --git a/res/net/sourceforge/align/res/test/simpletext.al b/res/net/sourceforge/align/res/test/simpletext.al new file mode 100755 index 0000000..d6a30d3 --- /dev/null +++ b/res/net/sourceforge/align/res/test/simpletext.al @@ -0,0 +1,25 @@ + + + + + First sentence. + Second sentence. + + + Pierwsze zdanie. + + + + + + + Drugie zdanie. + + + + + + + + + \ No newline at end of file diff --git a/res/net/sourceforge/align/res/test/simpletext.tmx b/res/net/sourceforge/align/res/test/simpletext.tmx new file mode 100755 index 0000000..76a428d --- /dev/null +++ b/res/net/sourceforge/align/res/test/simpletext.tmx @@ -0,0 +1,28 @@ + + +
+ + + + Pierwsze zdanie. + + + 0.1 + First sentence. + + + + + Second sentence. + + + + + Erste Satz. + + + Zweite Satz. + + + + diff --git a/res/net/sourceforge/align/res/xml/.svn/all-wcprops b/res/net/sourceforge/align/res/xml/.svn/all-wcprops new file mode 100644 index 0000000..3d71ecf --- /dev/null +++ b/res/net/sourceforge/align/res/xml/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 74 +/svnroot/align/!svn/ver/33/trunk/maligna/res/net/sourceforge/align/res/xml +END diff --git a/res/net/sourceforge/align/res/xml/.svn/entries b/res/net/sourceforge/align/res/xml/.svn/entries new file mode 100644 index 0000000..61007f2 --- /dev/null +++ b/res/net/sourceforge/align/res/xml/.svn/entries @@ -0,0 +1,137 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/res/net/sourceforge/align/res/xml +https://align.svn.sourceforge.net/svnroot/align + + + +2009-04-15T10:26:53.293198Z +33 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +al.xsd +file + + + + +2008-08-20T21:15:18.000000Z +4043768a69bb106feb3f52d86d667eb3 +2009-04-15T10:26:53.293198Z +33 +jarekl + + + + + + + + + + + + + + + + + + + + + +880 + +tmx.xsd +file + + + + +2008-08-20T21:15:18.000000Z +8edb93c4948968b4a21d34aa4841f10b +2009-04-15T10:26:53.293198Z +33 +jarekl + + + + + + + + + + + + + + + + + + + + + +8268 + +xml.xsd +file + + + + +2008-08-20T21:15:18.000000Z +99892c95707b8c6de80f1c2c282ac750 +2009-04-15T10:26:53.293198Z +33 +jarekl + + + + + + + + + + + + + + + + + + + + + +5840 + diff --git a/res/net/sourceforge/align/res/xml/.svn/text-base/al.xsd.svn-base b/res/net/sourceforge/align/res/xml/.svn/text-base/al.xsd.svn-base new file mode 100755 index 0000000..18de7a0 --- /dev/null +++ b/res/net/sourceforge/align/res/xml/.svn/text-base/al.xsd.svn-base @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/net/sourceforge/align/res/xml/.svn/text-base/tmx.xsd.svn-base b/res/net/sourceforge/align/res/xml/.svn/text-base/tmx.xsd.svn-base new file mode 100755 index 0000000..a021b19 --- /dev/null +++ b/res/net/sourceforge/align/res/xml/.svn/text-base/tmx.xsd.svn-base @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/net/sourceforge/align/res/xml/.svn/text-base/xml.xsd.svn-base b/res/net/sourceforge/align/res/xml/.svn/text-base/xml.xsd.svn-base new file mode 100755 index 0000000..bb367cc --- /dev/null +++ b/res/net/sourceforge/align/res/xml/.svn/text-base/xml.xsd.svn-base @@ -0,0 +1,146 @@ + + + + + + See http://www.w3.org/XML/1998/namespace.html and + http://www.w3.org/TR/REC-xml for information about this namespace. + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. + + Note that local names in this namespace are intended to be defined + only by the World Wide Web Consortium or its subgroups. The + following names are currently defined in this namespace and should + not be used with conflicting semantics by any Working Group, + specification, or document instance: + + base (as an attribute name): denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification. + + id (as an attribute name): denotes an attribute whose value + should be interpreted as if declared to be of type ID. + The xml:id specification is not yet a W3C Recommendation, + but this attribute is included here to facilitate experimentation + with the mechanisms it proposes. Note that it is _not_ included + in the specialAttrs attribute group. + + lang (as an attribute name): denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification. + + space (as an attribute name): denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification. + + Father (in any context at all): denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: + + In appreciation for his vision, leadership and dedication + the W3C XML Plenary on this 10th day of February, 2000 + reserves for Jon Bosak in perpetuity the XML name + xml:Father + + + + + This schema defines attributes and an attribute group + suitable for use by + schemas wishing to allow xml:base, xml:lang, xml:space or xml:id + attributes on elements they define. + + To enable this, such a schema must import this schema + for the XML namespace, e.g. as follows: + <schema . . .> + . . . + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/xml.xsd"/> + + Subsequently, qualified reference to any of the attributes + or the group defined below will have the desired effect, e.g. + + <type . . .> + . . . + <attributeGroup ref="xml:specialAttrs"/> + + will define a type which will schema-validate an instance + element with any of those attributes + + + + In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + http://www.w3.org/2005/08/xml.xsd. + At the date of issue it can also be found at + http://www.w3.org/2001/xml.xsd. + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML Schema + itself, or with the XML namespace itself. In other words, if the XML + Schema or XML namespaces change, the version of this document at + http://www.w3.org/2001/xml.xsd will change + accordingly; the version at + http://www.w3.org/2005/08/xml.xsd will not change. + + + + + + Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility. See + RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry + at http://www.iana.org/assignments/lang-tag-apps.htm for + further information. + + The union allows for the 'un-declaration' of xml:lang with + the empty string. + + + + + + + + + + + + + + + + + + + + + + + + See http://www.w3.org/TR/xmlbase/ for + information about this attribute. + + + + + + See http://www.w3.org/TR/xml-id/ for + information about this attribute. + + + + + + + + + + \ No newline at end of file diff --git a/res/net/sourceforge/align/res/xml/al.xsd b/res/net/sourceforge/align/res/xml/al.xsd new file mode 100755 index 0000000..18de7a0 --- /dev/null +++ b/res/net/sourceforge/align/res/xml/al.xsd @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/net/sourceforge/align/res/xml/tmx.xsd b/res/net/sourceforge/align/res/xml/tmx.xsd new file mode 100755 index 0000000..a021b19 --- /dev/null +++ b/res/net/sourceforge/align/res/xml/tmx.xsd @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/net/sourceforge/align/res/xml/xml.xsd b/res/net/sourceforge/align/res/xml/xml.xsd new file mode 100755 index 0000000..bb367cc --- /dev/null +++ b/res/net/sourceforge/align/res/xml/xml.xsd @@ -0,0 +1,146 @@ + + + + + + See http://www.w3.org/XML/1998/namespace.html and + http://www.w3.org/TR/REC-xml for information about this namespace. + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. + + Note that local names in this namespace are intended to be defined + only by the World Wide Web Consortium or its subgroups. The + following names are currently defined in this namespace and should + not be used with conflicting semantics by any Working Group, + specification, or document instance: + + base (as an attribute name): denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification. + + id (as an attribute name): denotes an attribute whose value + should be interpreted as if declared to be of type ID. + The xml:id specification is not yet a W3C Recommendation, + but this attribute is included here to facilitate experimentation + with the mechanisms it proposes. Note that it is _not_ included + in the specialAttrs attribute group. + + lang (as an attribute name): denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification. + + space (as an attribute name): denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification. + + Father (in any context at all): denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: + + In appreciation for his vision, leadership and dedication + the W3C XML Plenary on this 10th day of February, 2000 + reserves for Jon Bosak in perpetuity the XML name + xml:Father + + + + + This schema defines attributes and an attribute group + suitable for use by + schemas wishing to allow xml:base, xml:lang, xml:space or xml:id + attributes on elements they define. + + To enable this, such a schema must import this schema + for the XML namespace, e.g. as follows: + <schema . . .> + . . . + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/xml.xsd"/> + + Subsequently, qualified reference to any of the attributes + or the group defined below will have the desired effect, e.g. + + <type . . .> + . . . + <attributeGroup ref="xml:specialAttrs"/> + + will define a type which will schema-validate an instance + element with any of those attributes + + + + In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + http://www.w3.org/2005/08/xml.xsd. + At the date of issue it can also be found at + http://www.w3.org/2001/xml.xsd. + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML Schema + itself, or with the XML namespace itself. In other words, if the XML + Schema or XML namespaces change, the version of this document at + http://www.w3.org/2001/xml.xsd will change + accordingly; the version at + http://www.w3.org/2005/08/xml.xsd will not change. + + + + + + Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility. See + RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry + at http://www.iana.org/assignments/lang-tag-apps.htm for + further information. + + The union allows for the 'un-declaration' of xml:lang with + the empty string. + + + + + + + + + + + + + + + + + + + + + + + + See http://www.w3.org/TR/xmlbase/ for + information about this attribute. + + + + + + See http://www.w3.org/TR/xml-id/ for + information about this attribute. + + + + + + + + + + \ No newline at end of file diff --git a/result/.svn/all-wcprops b/result/.svn/all-wcprops new file mode 100644 index 0000000..25e89ff --- /dev/null +++ b/result/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 47 +/svnroot/align/!svn/ver/17/trunk/maligna/result +END diff --git a/result/.svn/entries b/result/.svn/entries new file mode 100644 index 0000000..06a73f5 --- /dev/null +++ b/result/.svn/entries @@ -0,0 +1,34 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/result +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:14:26.928518Z +17 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +content +dir + +length +dir + diff --git a/result/content/.svn/all-wcprops b/result/content/.svn/all-wcprops new file mode 100644 index 0000000..0aa722c --- /dev/null +++ b/result/content/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content +END diff --git a/result/content/.svn/entries b/result/content/.svn/entries new file mode 100644 index 0000000..e6d9360 --- /dev/null +++ b/result/content/.svn/entries @@ -0,0 +1,37 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/result/content +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +normal-translation +dir + +poisson-translation +dir + +translation +dir + diff --git a/result/content/normal-translation/.svn/all-wcprops b/result/content/normal-translation/.svn/all-wcprops new file mode 100644 index 0000000..3053818 --- /dev/null +++ b/result/content/normal-translation/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 74 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/normal-translation +END +stallman-ch1.al +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/normal-translation/stallman-ch1.al +END diff --git a/result/content/normal-translation/.svn/entries b/result/content/normal-translation/.svn/entries new file mode 100644 index 0000000..3cc8a68 --- /dev/null +++ b/result/content/normal-translation/.svn/entries @@ -0,0 +1,40 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/result/content/normal-translation +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +stallman-ch1.al +file + + + + +2008-07-28T22:53:32.000000Z +d67df389a0b36ccae51876ad894a9580 +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/result/content/normal-translation/.svn/text-base/stallman-ch1.al.svn-base b/result/content/normal-translation/.svn/text-base/stallman-ch1.al.svn-base new file mode 100755 index 0000000..31950ee --- /dev/null +++ b/result/content/normal-translation/.svn/text-base/stallman-ch1.al.svn-base @@ -0,0 +1,1376 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + + I fear the Greeks. + + + + + + Even when they bring gifts. + + + + + Obawiam się Greków, nawet gdy przynoszą dary + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + Upon arrival, he found only four pages in the printer's tray. + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + + + + + + Stallman wondered. + + + + + Urządzenie było darem Xerox Corporation. + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + The machine had been a donation from the Xerox Corporation. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + The results had been immediately pleasing. + + + + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + The new machine was also more precise. + + + + + + Circles came out looking like circles, not ovals. + + + + + + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + Był to ze pod każdym względem dar, który należało docenić. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + + + + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + + + + + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + + + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + As fixes go, Stallman's was oblique but elegant. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + + + + + + He simply looked for a way to update the old fix or " hack" for the new system. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + + + + + + New things would get added on. + + + + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + Był to zwiastun HTML-a, lingua franca Word Wide Web. + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Dla Reida była to procedura doskonała. + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + + + + + + During that visit, he made sure to stop by the computer-science department. + + + + + + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + When asked directly about the request, however, Sproull draws a blank. + + + + + + "I can't make a factual comment," writes Sproull via email. + + + + + + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + + Who knows? + + + + + + All I remember is wanting to get out of there." + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Pojawiło się w postaci daru. + Stallman musiał przełknąć dwie gorzkie pigułki. + + + It had come disguised as a gift. + + + + + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + + + + + + "In this case I was the victim. [My lab and I] were victims." + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/result/content/normal-translation/stallman-ch1.al b/result/content/normal-translation/stallman-ch1.al new file mode 100755 index 0000000..31950ee --- /dev/null +++ b/result/content/normal-translation/stallman-ch1.al @@ -0,0 +1,1376 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + + I fear the Greeks. + + + + + + Even when they bring gifts. + + + + + Obawiam się Greków, nawet gdy przynoszą dary + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + Upon arrival, he found only four pages in the printer's tray. + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + + + + + + Stallman wondered. + + + + + Urządzenie było darem Xerox Corporation. + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + The machine had been a donation from the Xerox Corporation. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + The results had been immediately pleasing. + + + + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + The new machine was also more precise. + + + + + + Circles came out looking like circles, not ovals. + + + + + + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + Był to ze pod każdym względem dar, który należało docenić. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + + + + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + + + + + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + + + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + As fixes go, Stallman's was oblique but elegant. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + + + + + + He simply looked for a way to update the old fix or " hack" for the new system. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + + + + + + New things would get added on. + + + + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + Był to zwiastun HTML-a, lingua franca Word Wide Web. + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Dla Reida była to procedura doskonała. + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + + + + + + During that visit, he made sure to stop by the computer-science department. + + + + + + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + When asked directly about the request, however, Sproull draws a blank. + + + + + + "I can't make a factual comment," writes Sproull via email. + + + + + + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + + Who knows? + + + + + + All I remember is wanting to get out of there." + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Pojawiło się w postaci daru. + Stallman musiał przełknąć dwie gorzkie pigułki. + + + It had come disguised as a gift. + + + + + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + + + + + + "In this case I was the victim. [My lab and I] were victims." + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/result/content/poisson-translation/.svn/all-wcprops b/result/content/poisson-translation/.svn/all-wcprops new file mode 100644 index 0000000..4b94b09 --- /dev/null +++ b/result/content/poisson-translation/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 75 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/poisson-translation +END +stallman-ch1.al +K 25 +svn:wc:ra_dav:version-url +V 91 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/poisson-translation/stallman-ch1.al +END +gpl.al +K 25 +svn:wc:ra_dav:version-url +V 82 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/poisson-translation/gpl.al +END +poznan.al +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/poisson-translation/poznan.al +END diff --git a/result/content/poisson-translation/.svn/entries b/result/content/poisson-translation/.svn/entries new file mode 100644 index 0000000..d52e13e --- /dev/null +++ b/result/content/poisson-translation/.svn/entries @@ -0,0 +1,64 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/result/content/poisson-translation +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +gpl.al +file + + + + +2008-07-30T06:38:24.000000Z +9103a1954307c2ff53c14758a470e3b8 +2008-08-20T23:12:34.302965Z +16 +jarekl + +poznan.al +file + + + + +2008-07-26T01:00:03.000000Z +605978588201b9447ba00092e4ead305 +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-ch1.al +file + + + + +2008-07-30T06:43:03.000000Z +53583a7c436329d776682114d0af5cd6 +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/result/content/poisson-translation/.svn/text-base/gpl.al.svn-base b/result/content/poisson-translation/.svn/text-base/gpl.al.svn-base new file mode 100755 index 0000000..c47bee7 --- /dev/null +++ b/result/content/poisson-translation/.svn/text-base/gpl.al.svn-base @@ -0,0 +1,1813 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + 0. + + + TERMS AND CONDITIONS + + + + + + 0. + + + + + + Definitions. + + + + + Definicje + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + + + + + + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/result/content/poisson-translation/.svn/text-base/poznan.al.svn-base b/result/content/poisson-translation/.svn/text-base/poznan.al.svn-base new file mode 100755 index 0000000..3816745 --- /dev/null +++ b/result/content/poisson-translation/.svn/text-base/poznan.al.svn-base @@ -0,0 +1,314 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + + + + + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + + + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + + + + + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + + + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + + + + + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + + + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + + + + + Jego powierzchnia wynosi 285 ha. + + + Seine Fläche beträgt 285 ha. + + + + + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + + + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + + + + + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + + + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + + + + + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + + + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + + + + + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + + + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + + + + + Wędkować można zarówno z brzegu, jak i łodzi. + + + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + + + + + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + + + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + + + + + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + + + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + + + + + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + + + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + + + + + Jezioro Malta jest zbiornikiem sztucznym. + + + + + + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + + + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + + + + + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + + + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + + + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + + + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + + + + + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + + + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + + + + + Akwen zajmuje powierzchnię 36,7 ha. + + + Der See hat eine Fläche von 36,7 ha. + + + + + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + + + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + + + + + Długość linii brzegowej wynosi 3300 m. + + + Die Länge der Uferlinie beträgt 3300 m. + + + + + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + + + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + + + + + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + + + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + + + + + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + + + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + + + + + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + + + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + + + + + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + + + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + + + + + Ośrodek może przyjąć ok. 10 tys.osób. + + + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + + + + + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + + + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + + + + + Powierzchnia akwenu wynosi 34,9 ha. + + + Die Fläche des Sees beträgt 34,9 ha. + + + + + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + + + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + + + + + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + + + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + + + + + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + + + Der See wird vom Polnischen Angelverein in Poznań genutzt. + + + + + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + + + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + + + + + Jezioro zaliczane jest do typu sielawowego. + + + In dem See überwiegt die Kleine Maräne. + + + + + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + + + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + + + + + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + + + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + + + + + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + + + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + + + + + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/result/content/poisson-translation/.svn/text-base/stallman-ch1.al.svn-base b/result/content/poisson-translation/.svn/text-base/stallman-ch1.al.svn-base new file mode 100755 index 0000000..d5408be --- /dev/null +++ b/result/content/poisson-translation/.svn/text-base/stallman-ch1.al.svn-base @@ -0,0 +1,1451 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + Even when they bring gifts. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + Upon arrival, he found only four pages in the printer's tray. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + + + + + Urządzenie było darem Xerox Corporation. + + + Stallman wondered. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + The machine had been a donation from the Xerox Corporation. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + + + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + + + The new machine was also more precise. + + + + + Był to ze pod każdym względem dar, który należało docenić. + + + Circles came out looking like circles, not ovals. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + In engineering terms, user diligence was built into the system. + + + + + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + + + + + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + + + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + + + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + + + + + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + He simply looked for a way to update the old fix or " hack" for the new system. + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + + + + + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + + + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + + + + + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + During that visit, he made sure to stop by the computer-science department. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + + + + + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + + + + + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + + + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + + + Who knows? + All I remember is wanting to get out of there." + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + + + + + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + Pojawiło się w postaci daru. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Stallman musiał przełknąć dwie gorzkie pigułki. + + + It had come disguised as a gift. + + + + + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/result/content/poisson-translation/gpl.al b/result/content/poisson-translation/gpl.al new file mode 100755 index 0000000..c47bee7 --- /dev/null +++ b/result/content/poisson-translation/gpl.al @@ -0,0 +1,1813 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + 0. + + + TERMS AND CONDITIONS + + + + + + 0. + + + + + + Definitions. + + + + + Definicje + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + + + + + + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/result/content/poisson-translation/poznan.al b/result/content/poisson-translation/poznan.al new file mode 100755 index 0000000..3816745 --- /dev/null +++ b/result/content/poisson-translation/poznan.al @@ -0,0 +1,314 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + + + + + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + + + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + + + + + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + + + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + + + + + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + + + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + + + + + Jego powierzchnia wynosi 285 ha. + + + Seine Fläche beträgt 285 ha. + + + + + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + + + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + + + + + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + + + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + + + + + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + + + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + + + + + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + + + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + + + + + Wędkować można zarówno z brzegu, jak i łodzi. + + + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + + + + + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + + + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + + + + + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + + + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + + + + + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + + + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + + + + + Jezioro Malta jest zbiornikiem sztucznym. + + + + + + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + + + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + + + + + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + + + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + + + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + + + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + + + + + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + + + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + + + + + Akwen zajmuje powierzchnię 36,7 ha. + + + Der See hat eine Fläche von 36,7 ha. + + + + + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + + + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + + + + + Długość linii brzegowej wynosi 3300 m. + + + Die Länge der Uferlinie beträgt 3300 m. + + + + + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + + + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + + + + + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + + + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + + + + + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + + + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + + + + + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + + + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + + + + + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + + + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + + + + + Ośrodek może przyjąć ok. 10 tys.osób. + + + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + + + + + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + + + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + + + + + Powierzchnia akwenu wynosi 34,9 ha. + + + Die Fläche des Sees beträgt 34,9 ha. + + + + + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + + + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + + + + + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + + + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + + + + + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + + + Der See wird vom Polnischen Angelverein in Poznań genutzt. + + + + + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + + + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + + + + + Jezioro zaliczane jest do typu sielawowego. + + + In dem See überwiegt die Kleine Maräne. + + + + + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + + + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + + + + + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + + + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + + + + + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + + + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + + + + + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/result/content/poisson-translation/stallman-ch1.al b/result/content/poisson-translation/stallman-ch1.al new file mode 100755 index 0000000..d5408be --- /dev/null +++ b/result/content/poisson-translation/stallman-ch1.al @@ -0,0 +1,1451 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + Even when they bring gifts. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + Upon arrival, he found only four pages in the printer's tray. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + + + + + Urządzenie było darem Xerox Corporation. + + + Stallman wondered. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + The machine had been a donation from the Xerox Corporation. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + + + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + + + The new machine was also more precise. + + + + + Był to ze pod każdym względem dar, który należało docenić. + + + Circles came out looking like circles, not ovals. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + In engineering terms, user diligence was built into the system. + + + + + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + + + + + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + + + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + + + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + + + + + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + He simply looked for a way to update the old fix or " hack" for the new system. + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + + + + + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + + + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + + + + + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + During that visit, he made sure to stop by the computer-science department. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + + + + + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + + + + + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + + + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + + + Who knows? + All I remember is wanting to get out of there." + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + + + + + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + Pojawiło się w postaci daru. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Stallman musiał przełknąć dwie gorzkie pigułki. + + + It had come disguised as a gift. + + + + + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/result/content/translation/.svn/all-wcprops b/result/content/translation/.svn/all-wcprops new file mode 100644 index 0000000..35942f1 --- /dev/null +++ b/result/content/translation/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/translation +END +stallman-ch1.al +K 25 +svn:wc:ra_dav:version-url +V 83 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/translation/stallman-ch1.al +END +gpl.al +K 25 +svn:wc:ra_dav:version-url +V 74 +/svnroot/align/!svn/ver/16/trunk/maligna/result/content/translation/gpl.al +END diff --git a/result/content/translation/.svn/entries b/result/content/translation/.svn/entries new file mode 100644 index 0000000..cd4b302 --- /dev/null +++ b/result/content/translation/.svn/entries @@ -0,0 +1,52 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/result/content/translation +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +gpl.al +file + + + + +2008-07-29T22:25:40.000000Z +1ff5fd833e4deedc499d4b4bdde66130 +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-ch1.al +file + + + + +2008-08-14T00:07:37.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/result/content/translation/.svn/text-base/gpl.al.svn-base b/result/content/translation/.svn/text-base/gpl.al.svn-base new file mode 100755 index 0000000..57fddb2 --- /dev/null +++ b/result/content/translation/.svn/text-base/gpl.al.svn-base @@ -0,0 +1,1810 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/result/content/translation/.svn/text-base/stallman-ch1.al.svn-base b/result/content/translation/.svn/text-base/stallman-ch1.al.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/result/content/translation/gpl.al b/result/content/translation/gpl.al new file mode 100755 index 0000000..57fddb2 --- /dev/null +++ b/result/content/translation/gpl.al @@ -0,0 +1,1810 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/result/content/translation/stallman-ch1.al b/result/content/translation/stallman-ch1.al new file mode 100755 index 0000000..e69de29 diff --git a/result/length/.svn/all-wcprops b/result/length/.svn/all-wcprops new file mode 100644 index 0000000..71f1c36 --- /dev/null +++ b/result/length/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 54 +/svnroot/align/!svn/ver/16/trunk/maligna/result/length +END diff --git a/result/length/.svn/entries b/result/length/.svn/entries new file mode 100644 index 0000000..6a0c36b --- /dev/null +++ b/result/length/.svn/entries @@ -0,0 +1,34 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/result/length +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +normal +dir + +poisson +dir + diff --git a/result/length/normal/.svn/all-wcprops b/result/length/normal/.svn/all-wcprops new file mode 100644 index 0000000..668292e --- /dev/null +++ b/result/length/normal/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 61 +/svnroot/align/!svn/ver/16/trunk/maligna/result/length/normal +END +stallman-ch1.al +K 25 +svn:wc:ra_dav:version-url +V 77 +/svnroot/align/!svn/ver/16/trunk/maligna/result/length/normal/stallman-ch1.al +END +gpl.al +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/align/!svn/ver/16/trunk/maligna/result/length/normal/gpl.al +END diff --git a/result/length/normal/.svn/entries b/result/length/normal/.svn/entries new file mode 100644 index 0000000..e695d83 --- /dev/null +++ b/result/length/normal/.svn/entries @@ -0,0 +1,52 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/result/length/normal +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +gpl.al +file + + + + +2008-07-29T22:15:36.000000Z +2526a3886b968c44ffa87a89fe664aee +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-ch1.al +file + + + + +2008-07-28T22:44:28.000000Z +4e142835b31eb49b758d35067e50323a +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/result/length/normal/.svn/text-base/gpl.al.svn-base b/result/length/normal/.svn/text-base/gpl.al.svn-base new file mode 100755 index 0000000..ad38b1b --- /dev/null +++ b/result/length/normal/.svn/text-base/gpl.al.svn-base @@ -0,0 +1,1810 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + + + 5. + + + + + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + 5. + + + Conveying Modified Source Versions. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/result/length/normal/.svn/text-base/stallman-ch1.al.svn-base b/result/length/normal/.svn/text-base/stallman-ch1.al.svn-base new file mode 100755 index 0000000..5bae6c2 --- /dev/null +++ b/result/length/normal/.svn/text-base/stallman-ch1.al.svn-base @@ -0,0 +1,1423 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + Even when they bring gifts. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + Upon arrival, he found only four pages in the printer's tray. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + + + + + Urządzenie było darem Xerox Corporation. + + + Stallman wondered. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + The machine had been a donation from the Xerox Corporation. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + + + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + The new machine was also more precise. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + + + Circles came out looking like circles, not ovals. + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Był to ze pod każdym względem dar, który należało docenić. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + + + + + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + + + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + + + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + He simply looked for a way to update the old fix or " hack" for the new system. + + + + + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + + + + + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + + + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + + + + + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + During that visit, he made sure to stop by the computer-science department. + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + + + + + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + + + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + + + Who knows? + All I remember is wanting to get out of there." + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + + + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + + + + + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + Pojawiło się w postaci daru. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Stallman musiał przełknąć dwie gorzkie pigułki. + + + It had come disguised as a gift. + + + + + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + Sooner or later, they reasoned, the software would become public knowledge. + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/result/length/normal/gpl.al b/result/length/normal/gpl.al new file mode 100755 index 0000000..ad38b1b --- /dev/null +++ b/result/length/normal/gpl.al @@ -0,0 +1,1810 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + + + 5. + + + + + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + 5. + + + Conveying Modified Source Versions. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/result/length/normal/stallman-ch1.al b/result/length/normal/stallman-ch1.al new file mode 100755 index 0000000..5bae6c2 --- /dev/null +++ b/result/length/normal/stallman-ch1.al @@ -0,0 +1,1423 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + Even when they bring gifts. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + Upon arrival, he found only four pages in the printer's tray. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + + + + + Urządzenie było darem Xerox Corporation. + + + Stallman wondered. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + The machine had been a donation from the Xerox Corporation. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + + + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + The new machine was also more precise. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + + + Circles came out looking like circles, not ovals. + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Był to ze pod każdym względem dar, który należało docenić. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + + + + + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + + + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + + + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + He simply looked for a way to update the old fix or " hack" for the new system. + + + + + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + + + + + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + + + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + + + + + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + During that visit, he made sure to stop by the computer-science department. + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + + + + + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + + + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "They would have been insane to give away the source code." + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + + + Who knows? + All I remember is wanting to get out of there." + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + + + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + + + + + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + Pojawiło się w postaci daru. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Stallman musiał przełknąć dwie gorzkie pigułki. + + + It had come disguised as a gift. + + + + + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + Sooner or later, they reasoned, the software would become public knowledge. + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/result/length/poisson/.svn/all-wcprops b/result/length/poisson/.svn/all-wcprops new file mode 100644 index 0000000..a609df3 --- /dev/null +++ b/result/length/poisson/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/align/!svn/ver/16/trunk/maligna/result/length/poisson +END +stallman-ch1.al +K 25 +svn:wc:ra_dav:version-url +V 78 +/svnroot/align/!svn/ver/16/trunk/maligna/result/length/poisson/stallman-ch1.al +END +gpl.al +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/align/!svn/ver/16/trunk/maligna/result/length/poisson/gpl.al +END +poznan.al +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/16/trunk/maligna/result/length/poisson/poznan.al +END diff --git a/result/length/poisson/.svn/entries b/result/length/poisson/.svn/entries new file mode 100644 index 0000000..6fb7b29 --- /dev/null +++ b/result/length/poisson/.svn/entries @@ -0,0 +1,64 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/result/length/poisson +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +gpl.al +file + + + + +2008-07-30T06:29:56.000000Z +12bfac3cb6d060e07bfa7d21e6c41940 +2008-08-20T23:12:34.302965Z +16 +jarekl + +poznan.al +file + + + + +2007-09-26T18:44:19.000000Z +0325d6b575dc4b1d10d3ba1d7c51a96b +2008-08-20T23:12:34.302965Z +16 +jarekl + +stallman-ch1.al +file + + + + +2008-07-30T06:43:35.000000Z +39abe5c90d8b7860ab3064694aaacb2c +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/result/length/poisson/.svn/text-base/gpl.al.svn-base b/result/length/poisson/.svn/text-base/gpl.al.svn-base new file mode 100755 index 0000000..b380305 --- /dev/null +++ b/result/length/poisson/.svn/text-base/gpl.al.svn-base @@ -0,0 +1,1815 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + + + + + + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/result/length/poisson/.svn/text-base/poznan.al.svn-base b/result/length/poisson/.svn/text-base/poznan.al.svn-base new file mode 100755 index 0000000..9bf9eef --- /dev/null +++ b/result/length/poisson/.svn/text-base/poznan.al.svn-base @@ -0,0 +1,309 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + + + + + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + + + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + + + + + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + + + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + + + + + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + + + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + + + + + Jego powierzchnia wynosi 285 ha. + + + Seine Fläche beträgt 285 ha. + + + + + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + + + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + + + + + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + + + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + + + + + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + + + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + + + + + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + + + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + + + + + Wędkować można zarówno z brzegu, jak i łodzi. + + + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + + + + + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + + + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + + + + + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + + + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + + + + + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + + + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + + + + + Jezioro Malta jest zbiornikiem sztucznym. + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + + + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + + + + + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + + + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + + + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + + + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + + + + + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + + + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + + + + + Akwen zajmuje powierzchnię 36,7 ha. + + + Der See hat eine Fläche von 36,7 ha. + + + + + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + + + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + + + + + Długość linii brzegowej wynosi 3300 m. + + + Die Länge der Uferlinie beträgt 3300 m. + + + + + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + + + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + + + + + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + + + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + + + + + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + + + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + + + + + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + + + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + + + + + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + + + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + + + + + Ośrodek może przyjąć ok. 10 tys.osób. + + + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + + + + + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + + + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + + + + + Powierzchnia akwenu wynosi 34,9 ha. + + + Die Fläche des Sees beträgt 34,9 ha. + + + + + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + + + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + + + + + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + + + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + + + + + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + + + Der See wird vom Polnischen Angelverein in Poznań genutzt. + + + + + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + + + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + + + + + Jezioro zaliczane jest do typu sielawowego. + + + In dem See überwiegt die Kleine Maräne. + + + + + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + + + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + + + + + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + + + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + + + + + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + + + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + + + + + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/result/length/poisson/.svn/text-base/stallman-ch1.al.svn-base b/result/length/poisson/.svn/text-base/stallman-ch1.al.svn-base new file mode 100755 index 0000000..2debfd5 --- /dev/null +++ b/result/length/poisson/.svn/text-base/stallman-ch1.al.svn-base @@ -0,0 +1,1428 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + Even when they bring gifts. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + Upon arrival, he found only four pages in the printer's tray. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + + + + + Urządzenie było darem Xerox Corporation. + + + Stallman wondered. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + The machine had been a donation from the Xerox Corporation. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + + + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + The new machine was also more precise. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + + + Circles came out looking like circles, not ovals. + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Był to ze pod każdym względem dar, który należało docenić. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + + + + + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + + + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + He simply looked for a way to update the old fix or " hack" for the new system. + + + + + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + + + + + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + + + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + + + + + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + During that visit, he made sure to stop by the computer-science department. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + + + + + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + "They would have been insane to give away the source code." + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + + + Who knows? + All I remember is wanting to get out of there." + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + + + + + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + Pojawiło się w postaci daru. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Stallman musiał przełknąć dwie gorzkie pigułki. + + + It had come disguised as a gift. + + + + + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/result/length/poisson/gpl.al b/result/length/poisson/gpl.al new file mode 100755 index 0000000..b380305 --- /dev/null +++ b/result/length/poisson/gpl.al @@ -0,0 +1,1815 @@ + + + + + POWSZECHNA LICENCJA PUBLICZNA GNU + + + GNU GENERAL PUBLIC LICENSE + + + + + Wersja 3, 29 czerwca 2007 r. + + + Version 3, 29 June 2007 + + + + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> + + + + + Zezwala się kopiować i rozpowszechniać wierne kopie niniejszego dokumentu licencyjnego, bez prawa wprowadzania do niego zmian. + + + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + + + + Preambuła + + + Preamble + + + + + Powszechna Licencja Publiczna GNU jest wolną, opartą na zasadzie “copyleft”, licencją na oprogramowanie i na innego rodzaju utwory. + + + The GNU General Public License is a free, copyleft license for software and other kinds of works. + + + + + Licencje na większość programów komputerowych i na inne utwory zostały stworzone po to, aby ograniczyć swobodę dzielenia się nimi i dokonywania w nich zmian. + + + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. + + + + + Natomiast celem Powszechnej Licencji Publicznej GNU jest zagwarantowanie swobody udostępniania i zmieniania wszystkich wersji programu - sprawienie, by oprogramowanie pozostało wolnym dla wszystkich użytkowników. + + + By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + + + + + Jako Fundacja Wolnego Oprogramowania stosujemy Powszechną Licencję Publiczną GNU do większości naszego oprogramowania. + Licencję tę można także stosować do wszystkich innych utworów udostępnionych na tych samych zasadach przez ich twórców. + + + We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. + + + + + Ty także możesz ją stosować do swoich programów. + + + You can apply it to your programs, too. + + + + + Kiedy mówimy o wolnym oprogramowaniu, chodzi nam o swobodę, nie o cenę. + + + When we speak of free software, we are referring to freedom, not price. + + + + + Nasze Powszechne Licencje Publiczne zostały zaprojektowane tak, aby zapewnić ci swobodę rozpowszechniania kopii wolnego oprogramowania (a jeżeli chcesz - swobodę pobierania wynagrodzenia z tego tytułu), zagwarantować, że otrzymasz kod źródłowy lub uzyskasz do niego dostęp, że będziesz mógł zmieniać oprogramowanie lub użyć jego fragmentów w nowych wolnych programach, a także że będziesz miał świadomość, że masz do tego wszystkiego prawo. + + + Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + + + + + Aby chronić twoje prawa, musimy zagwarantować, że nikt inny nie będzie mógł zakwestionować twoich praw ani domagać się, żebyś z nich zrezygnował. + + + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. + + + + + W związku z tym, jeżeli rozpowszechniasz kopie takiego oprogramowania lub modyfikujesz je, spoczywa na tobie odpowiedzialność za poszanowanie wolności innych. + + + Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + + + + + Na przykład, jeżeli rozpowszechniasz kopie takich programów, czy to odpłatnie, czy też nieodpłatnie, musisz przekazać odbiorcom dokładnie te same prawa, jakie sam otrzymałeś. + + + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. + + + + + Musisz zagwarantować, że oni także otrzymają kod źródłowy lub uzyskają do niego dostęp. + + + You must make sure that they, too, receive or can get the source code. + + + + + Musisz również pokazać im niniejsze warunki, tak aby mogli poznać swoje prawa. + + + And you must show them these terms so they know their rights. + + + + + Twórcy oprogramowania korzystający z Powszechnej Licencji Publicznej GNU chronią swoje prawa dwuetapowo: (1) zastrzegają prawa autorskie do oprogramowania oraz (2) oferują ci niniejszą Licencję, udzielając ci prawnego zezwolenia na kopiowanie, rozpowszechnianie i/lub modyfikację tego oprogramowania. + + + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + + + + + Powszechna Licencja Publiczna chroni programistów i twórców, wyraźnie stwierdzając, że na wolne oprogramowanie nie jest udzielana żadna gwarancja. + + + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. + + + + + Dla dobra zarówno użytkowników, jak i twórców, Powszechna Licencja Publiczna wymaga, aby zmodyfikowane wersje zostały oznaczone jako zmienione, aby problemy z nimi nie zostały omyłkowo przypisane twórcom poprzednich wersji. + + + For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + + + + + Niektóre urządzenia zaprojektowane są tak, aby użytkownicy nie mieli możliwości instalacji ani uruchamiania zmodyfikowanych wersji zainstalowanego w nich oprogramowania, mimo że sam producent ma taką możliwość. + + + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. + + + + + Jest to zasadniczo niezgodne z celem ochrony swobody użytkowników w zakresie zmiany oprogramowania. + + + This is fundamentally incompatible with the aim of protecting users' freedom to change the software. + + + + + Nadużycia takie są systematycznie notowane w obszarze produktów używanych przez osoby fizyczne, czyli dokładnie w tym obszarze, gdzie jest to całkowicie nie do przyjęcia. + + + The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. + + + + + W związku z tym niniejszą wersję Powszechnej Licencji Publicznej przygotowaliśmy w taki sposób, aby zabraniała ona takich praktyk. + + + Therefore, we have designed this version of the GPL to prohibit the practice for those products. + + + + + Jeżeli problemy tego rodzaju zaistnieją w istotnym wymiarze także w innych obszarach, jesteśmy gotowi rozszerzyć to postanowienie na takie obszary w przyszłych wersjach Powszechnej Licencji Publicznej w sposób niezbędny do ochrony wolności użytkowników. + + + If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + + + + + Każdy program jest stale zagrożony istnieniem patentów na oprogramowanie. + + + Finally, every program is threatened constantly by software patents. + + + + + Państwa nie powinny dopuszczać do tego, aby patenty ograniczały rozwój i możliwość używania oprogramowania na komputerach ogólnego przeznaczenia, jednak w krajach, które na to pozwalają, chcielibyśmy w szczególności uniknąć zagrożenia, że zastosowanie patentu do wolnego programu spowoduje, że stanie się on faktycznie programem prawnie zastrzeżonym. + + + States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. + + + + + Aby tego uniknąć, zgodnie z Powszechną Licencją Publiczną nie można użyć patentów do pozbawienia wolności oprogramowania. + + + To prevent this, the GPL assures that patents cannot be used to render the program non-free. + + + + + Poniżej przedstawione zostały dokładne zasady i warunki dopuszczalnego kopiowania, rozpowszechniania i modyfikacji. + + + The precise terms and conditions for copying, distribution and modification follow. + + + + + ZASADY I WARUNKI + + + TERMS AND CONDITIONS + + + + + 0. + + + 0. + + + + + Definicje + + + Definitions. + + + + + „Niniejsza Licencja” odnosi się do wersji 3 Powszechnej Licencji Publicznej GNU. + + + “This License” refers to version 3 of the GNU General Public License. + + + + + „Prawo autorskie” oznacza także inne prawa na dobrach niematerialnych, zbliżone do prawa autorskiego, jak na przykład ochrona topografii układów scalonych. + + + “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + + + + „Program” odnosi się do wszelkich utworów podlegających prawu autorskiemu, licencjonowanych na podstawie niniejszej Licencji. + + + “The Program” refers to any copyrightable work licensed under this License. + + + + + Do każdego licencjobiorcy zwracamy się per „ty”. „Licencjobiorcy” oraz „odbiorcy” mogą być osobami fizycznymi lub organizacjami. + + + Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + + + + + „Modyfikacja” utworu oznacza kopiowanie jego części lub zmianę jego całości lub części w sposób wymagający zezwolenia autorskiego, niebędący jednak wykonaniem dokładnej kopii. + + + To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. + + + + + Uzyskany w ten sposób utwór zwany jest „zmodyfikowaną wersją” poprzedniego utworu lub utworem „opartym na” poprzednim utworze. + + + The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + + + + + „Utwór objęty licencją” oznacza niezmodyfikowany Program lub utwór oparty na Programie. + + + A “covered work” means either the unmodified Program or a work based on the Program. + + + + + „Propagowanie” utworu oznacza robienie z nim wszystkiego, co bez zezwolenia byłoby podstawą do bezpośredniego lub pośredniego pociągnięcia cię do odpowiedzialności za naruszenie odpowiednich przepisów o prawie autorskim, z wyjątkiem uruchomienia tego utworu na komputerze lub modyfikacji jego kopii prywatnej. + + + To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. + + + + + Propagowanie obejmuje kopiowanie, rozpowszechnianie (w wersji zmodyfikowanej lub niezmodyfikowanej), publiczne udostępnianie, a w niektórych krajach także inne czynności. + + + Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + + + + „Przekazywanie” utworu oznacza wszelkiego rodzaju propagowanie, które umożliwia innym stronom sporządzenie lub otrzymanie kopii. + + + To “convey” a work means any kind of propagation that enables other parties to make or receive copies. + + + + + Zwykła interakcja z użytkownikiem poprzez sieć komputerową, bez transferu kopii, nie jest przekazaniem. + + + Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + + + + Interaktywny interfejs użytkownika wyświetla „Zastrzeżenia Prawne” w zakresie, w jakim zawiera on wygodną i dobrze widoczną funkcję (1) wyświetlającą odpowiednie zastrzeżenia prawne oraz (2) informującą użytkownika, że na utwór nie udziela się gwarancji (z wyłączeniem zakresu, w jakim gwarancje te są udzielane) i że licencjobiorcy mogą przekazywać utwór zgodnie z niniejszą Licencją, oraz wskazującą, jak można wyświetlić kopię tej Licencji. + + + An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. + + + + + Jeżeli interfejs zawiera listę komend lub opcji użytkownika, np. menu, to niniejsze kryterium spełnione być musi przez jedną z głównych pozycji z tej listy. + + + If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + + + + + 1. + + + 1. + + + + + Kod źródłowy + + + Source Code. + + + + + „Kod źródłowy” utworu oznacza formę utworu preferowaną do wprowadzania do niej modyfikacji. „Kod wynikowy” oznacza utwór w formie niebędącej formą źródłową. + + + The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + + + + + „Standardowy Interfejs” oznacza interfejs, który albo jest zgodny z oficjalnym standardem stworzonym przez uznane ciało normatywne, albo - w przypadku interfejsów określonych dla danego języka programowania - jest interfejsem powszechnie stosowanym przez programistów pracujących w tym języku. + + + A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + + + + „Biblioteki Systemowe” wykonywalnego utworu obejmują wszystko, poza utworem jako całością, (a) co jest włączone do zwykłej formy pakietu Głównego Składnika, lecz co nie jest częścią tego Głównego Składnika, oraz (b) czego wyłącznym celem jest umożliwienie, aby utwór mógł być używany wraz z tym Głównym Składnikiem, lub wdrożenie Standardowego Interfejsu, dla którego powszechnie dostępna jest implementacja w formie kodu źródłowego. + + + The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. + + + + + „Główny Składnik” w tym kontekście oznacza główny, podstawowy składnik (jądro, system okienkowy itp.) danego systemu operacyjnego (jeżeli występuje), na którym uruchomiony jest wykonywalny utwór, lub kompilator użyty do produkcji utworu albo interpreter kodu wynikowego użyty do jego uruchomienia. + + + A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + + + + „Odpowiednie Źródło” utworu w formie kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, instalacji oraz (w przypadku dzieła wykonywalnego) uruchomienia kodu wynikowego oraz do modyfikacji utworu, włączając w to skrypty do sterowania powyższymi czynnościami. + + + The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. + + + + + Odpowiednie Źródło nie obejmuje Bibliotek Systemowych utworu, narzędzi ogólnego przeznaczenia, ani ogólnie dostępnych wolnych programów, które używane są w niezmodyfikowanej formie do realizacji tych czynności, lecz które nie są częścią utworu. + + + However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. + + + + + Przykładowo, Odpowiednie Źródło obejmuje pliki definicji interfejsu powiązane z plikami źródłowymi utworu oraz kod źródłowy dla współdzielonych bibliotek i dynamicznie powiązanych podprogramów, które zgodnie z projektem utworu są niezbędne do jego funkcjonowania, na przykład dzięki prywatnemu transferowi danych lub przepływowi kontrolnemu pomiędzy tymi podprogramami a innymi elementami utworu. + + + For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + + + + Odpowiednie Źródło nie musi obejmować niczego, co użytkownicy mogą odtworzyć automatycznie z innych części Odpowiedniego Źródła. + + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + + + + Odpowiednim Źródłem utworu w formie kodu źródłowego jest sam utwór. + + + The Corresponding Source for a work in source code form is that same work. + + + + + 2. + + + 2. + + + + + Podstawowe zezwolenia + + + Basic Permissions. + + + + + Wszelkie prawa przyznane niniejszą Licencją udzielone są na okres obowiązywania majątkowych praw autorskich do Programu i są nieodwołalne, z zastrzeżeniem spełnienia określonych poniżej warunków. + + + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. + + + + + Niniejsza Licencja wyraźnie potwierdza twoje nieograniczone prawo do uruchamiania niezmodyfikowanego Programu. + + + This License explicitly affirms your unlimited permission to run the unmodified Program. + + + + + Dane wyjściowe uzyskane w wyniku uruchomienia utworu objętego licencją są także objęte niniejszą Licencją, tylko jeżeli dane wyjściowe, biorąc pod uwagę ich treść, również stanowią utwór objęty licencją. + + + The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. + + + + + Niniejsza licencja potwierdza twoje prawa wynikające z dozwolonego użytku lub podobnych uprawnień wynikających z odpowiednich przepisów prawa autorskiego. + + + This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + + + + Możesz bezwarunkowo wykonywać, uruchamiać i propagować utwory objęte licencją, których nie przekazujesz, tak długo, jak twoja licencja zachowuje ważność. + + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. + + + + + Możesz przekazywać utwory objęte licencją innym osobom, wyłącznie aby wprowadziły one modyfikacje przeznaczone tylko dla ciebie lub aby umożliwiły ci uruchamianie tych utworów, pod warunkiem że spełnisz warunki niniejszej Licencji dotyczące przekazywania wszelkich materiałów, do których nie posiadasz prawa autorskiego. + + + You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. + + + + + Osoby, które w opisany powyżej sposób wykonują lub uruchamiają dla ciebie utwory objęte licencją, muszą robić to wyłącznie w twoim imieniu, pod twoim kierownictwem i kontrolą, na warunkach zakazujących im sporządzania kopii twoich materiałów z zastrzeżonym prawem autorskim poza zakresem waszych relacji. + + + Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + + + + Przekazywanie w innych okolicznościach dozwolone jest wyłącznie na warunkach wskazanych poniżej. + + + Conveying under any other circumstances is permitted solely under the conditions stated below. + + + + + Nie jest dozwolone udzielanie dalszych sublicencji, gdyż w związku z punktem 10 nie jest to konieczne. + + + Sublicensing is not allowed; section 10 makes it unnecessary. + + + + + 3. + + + 3. + + + + + Ochrona praw użytkowników przed zabezpieczeniami technicznymi utworów + + + Protecting Users' Legal Rights From Anti-Circumvention Law. + + + + + Żaden utwór objęty licencją nie zostanie uznany za „skuteczny środek techniczny” na podstawie jakiegokolwiek właściwego przepisu prawa spełniającego zobowiązania wynikające z art. 11 traktatu w sprawie praw autorskich (WIPO) z dnia 20 grudnia 1996 r. ani podobnych przepisów prawa zabraniających lub ograniczających obchodzenie takich środków. + + + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + + + + + Przekazując utwór objęty licencją, zrzekasz się wszelkich praw do tego, by zakazać obchodzenia środków technologicznych w zakresie, w jakim takie obchodzenie realizowane jest poprzez korzystanie z wynikających z niniejszej Licencji praw do utworu objętego licencją, oraz zrzekasz się wszelkich zamiarów ograniczania funkcjonowania lub modyfikacji utworu, jako sposobu wyegzekwowania, na szkodę użytkowników utworu, praw twoich lub innych osób do nałożenia zakazu obchodzenia środków technologicznych. + + + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + + + + + 4. + + + 4. + + + + + Przekazywanie wiernych kopii + + + Conveying Verbatim Copies. + + + + + Możesz przekazywać wierne kopie kodu źródłowego Programu w otrzymanej formie i na dowolnym nośniku pod warunkiem, że w widoczny i odpowiedni sposób na każdej kopii zamieścisz odpowiednią informację o prawie autorskim. + Musisz też pozostawić w stanie nienaruszonym wszystkie informacje stwierdzające, że do kodu ma zastosowanie niniejsza Licencja oraz wszystkie postanowienia niebędące zezwoleniami dodane zgodnie z punktem 7. + + + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + + + + + Ponadto musisz pozostawić w stanie nienaruszonym wszystkie informacje o braku jakiejkolwiek gwarancji oraz wydać każdemu odbiorcy egzemplarz niniejszej Licencji wraz z Programem. + + + + + + Za każdą przekazaną kopię możesz, ale nie musisz, pobrać cenę zakupu. + Możesz także oferować płatne usługi wsparcia lub płatną ochronę gwarancyjną. + + + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + + + + + 5. + + + 5. + + + + + Przekazywanie zmodyfikowanych wersji Źródła + + + Conveying Modified Source Versions. + + + + + Możesz przekazać utwór oparty na Programie lub modyfikacje niezbędne do stworzenia tego utworu z Programu w formie kodu źródłowego na zasadach określonych w punkcie 4, z zastrzeżeniem, że spełniasz także wszystkie poniższe warunki: + + + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + + + + a) Utwór musi zawierać dobrze widoczną informację o tym, że zmodyfikowałeś go oraz o dacie modyfikacji. + + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + + + + b) Utwór musi zawierać dobrze widoczną informacje o tym, że został rozpowszechniony zgodnie z niniejszą Licencją oraz ewentualnie z warunkami dodatkowymi z punktu 7. + + + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. + + + + + Niniejszy warunek stanowi modyfikację wymogu dotyczącego „pozostawienia w stanie nienaruszonym wszystkich informacji” z punktu 4. + + + This requirement modifies the requirement in section 4 to “keep intact all notices”. + + + + + c) Na mocy niniejszej Licencji musisz udzielić licencji na cały utwór każdej osobie, która wejdzie w posiadanie jego kopii. + + + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. + + + + + W związku z tym niniejsza Licencja, wraz z ewentualnymi warunkami dodatkowymi z punktu 7, będzie miała zastosowanie do całości utworu oraz do wszystkich jego części, niezależnie od tego, jak zostały one podzielone na części wchodzące w skład całego utworu. + + + This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. + + + + + Niniejsza Licencja nie pozwala na licencjonowanie utworu w żaden inny sposób, jednak nie powoduje nieważności takiego zezwolenia, jeżeli uzyskałeś je odrębnie. + + + This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + + + + d) Jeżeli utwór posiada interaktywne interfejsy użytkownika, to w każdym z tych interfejsów muszą być wyświetlane Zastrzeżenia Prawne. + Jeżeli jednak Program posiada interaktywne interfejsy użytkownika, w których nie są wyświetlane Zastrzeżenia Prawne, to twój utwór nie musi zapewniać takiego wyświetlania. + + + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + + + + Połączenie utworu objętego licencją z innymi oddzielnymi, niezależnymi utworami, które ze swojej natury nie są rozszerzeniem utworu objętego licencją i które nie są z nim połączone tak, by tworzyły większy program, na jednym nośniku, na którym jest on przechowywany lub rozpowszechniany, zwana jest „agregatem”, pod warunkiem że takie połączenie i wynikające z niego prawo autorskie nie są używane do ograniczania dostępu ani praw użytkowników tego połączenia w zakresie większym niż dozwolony przez poszczególne utwory. + + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. + + + + + Włączenie utworu objętego licencją do agregatu nie powoduje objęcia pozostałych części agregatu niniejszą Licencją. + + + Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + + + + + 6. + + + 6. + + + + + Przekazywanie form niebędących źródłem + + + Conveying Non-Source Forms. + + + + + Możesz przekazać utwór objęty licencją w formie kodu wynikowego na zasadach określonych w punktach 4 i 5, pod warunkiem że przekażesz także możliwe do maszynowego odczytania Odpowiednie Źródło, zgodnie z rozumieniem niniejszej Licencji, na jeden z następujących sposobów: + + + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + + + + a) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z Odpowiednim Źródłem na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania. + + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + + + + b) Przekażesz kod wynikowy w fizycznym produkcie lub włączony do fizycznego produktu (co odnosi się także do fizycznego nośnika, na którym jest on rozpowszechniany) razem z pisemnym zobowiązaniem, ważnym przez co najmniej trzy lata i tak długo, jak oferujesz dla tego modelu produktu części zamienne lub usługi wsparcia klienta, do: (1) wręczenia każdej osobie posiadającej kod wynikowy, kopii Odpowiedniego Źródła całego oprogramowania produktu objętego niniejszą Licencją na trwałym nośniku fizycznym stosowanym zwykle do wymiany oprogramowania, za cenę nie wyższą niż twój rozsądny koszt faktycznego przekazania tego źródła, lub (2) do darmowego udostępnienia takiej osobie kopii Odpowiedniego Źródła na serwerze sieciowym. + + + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + + + + c) Przekażesz indywidualne kopie kodu wynikowego razem z kopią pisemnego zobowiązania do dostarczenia Odpowiedniego Źródła. + + + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. + + + + + Ta możliwość dozwolona jest tylko okazjonalnie, dla dystrybucji niekomercyjnej i jedynie wówczas, gdy otrzymałeś kod wynikowy wraz z takim zobowiązaniem, zgodnie z podpunktem 6b. + + + This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + + + + d) Przekażesz kod wynikowy poprzez zaoferowanie dostępu z określonego miejsca (bezpłatnie lub za opłatą) i zaoferowanie podobnego dostępu do Odpowiedniego Źródła w ten sam sposób, z tego samego miejsca i bez dodatkowej opłaty. + + + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. + + + + + Odbiorcy nie muszą być zobowiązani do kopiowania Odpowiedniego Źródła wraz z kodem wynikowym. + + + You need not require recipients to copy the Corresponding Source along with the object code. + + + + + Jeżeli miejsce, z którego kopiuje się kod wynikowy, jest serwerem sieciowym, to Odpowiednie Źródło może znajdować się na innym serwerze (prowadzonym przez ciebie lub przez osobę trzecią) oferującym takie same możliwości kopiowania, pod warunkiem że zapewnisz, że przy kodzie wynikowym znajdować się będą jasne wskazówki dotyczące lokalizacji Odpowiedniego Źródła. + + + If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. + + + + + Niezależnie od serwera, na którym umieszczone jest Odpowiednie Źródło, to na tobie spoczywa obowiązek zapewnienia, żeby było ono dostępne przez tak długi okres, jaki będzie potrzebny do spełnienia niniejszych wymagań. + + + Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + + + + e) Przekażesz kod wynikowy przy wykorzystaniu transmisji peer-to-peer, pod warunkiem że poinformujesz odbiorców o tym, gdzie publicznie i za darmo dostępne są: kod wynikowy utworu oraz jego Odpowiednie Źródło, zgodnie z podpunktem 6d. + + + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + + + + Odłączalna część kodu wynikowego, którego kod źródłowy jako Biblioteka Systemowa wyłączony jest z Odpowiedniego Źródła, nie musi być załączona przy przekazywaniu utworu w kodzie wynikowym. + + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + + + + „Produkt Użytkownika” to albo (1) „produkt konsumencki”, co oznacza każdy materialny przedmiot własności osobistej używany zwykle do celów osobistych, rodzinnych lub domowych, albo (2) każdy produkt, który został zaprojektowany lub sprzedany w celu włączenia go do miejsca zamieszkania. + + + A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. + + + + + Przy określaniu, czy produkt jest produktem konsumenckim, czy nie, wszelkie wątpliwości będą rozstrzygane na korzyść objęcia licencją. + + + In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. + + + + + Dla określonego produktu otrzymanego przez określonego użytkownika „normalne użycie” oznacza typowy lub powszechny sposób używania produktu tej klasy, niezależnie od statusu danego użytkownika lub sposobu, w jaki dany użytkownik faktycznie używa, spodziewa się używać lub ma używać ten produkt. + + + For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. + + + + + Dany produkt jest produktem konsumenckim niezależnie od tego, czy posiada istotne zastosowanie komercyjne, przemysłowe lub niekonsumenckie, chyba że zastosowania te stanowią jedyny istotny sposób używania tego produktu. + + + A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + + + + „Informacja Instalacyjna” dla Produktu Użytkownika oznacza jakiekolwiek metody, procedury, klucze autoryzacyjne lub inne informacje wymagane do zainstalowania i uruchomienia zmodyfikowanych wersji utworu objętego licencją w tym Produkcie Użytkownika ze zmodyfikowanej wersji jego Odpowiedniego Źródła. + + + “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. + + + + + Informacje te muszą być wystarczające do zapewnienia, że funkcjonowanie w sposób ciągły zmodyfikowanego kodu wynikowego nie zostanie w żadnym przypadku przerwane ani zakłócone wyłącznie z powodu wprowadzenia modyfikacji. + + + The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + + + + Jeżeli zgodnie z niniejszym punktem przekazujesz utwór w formie kodu wynikowego w Produkcie Użytkownika lub wraz z Produktem Użytkownika albo wyraźnie w celu jego użycia w Produkcie Użytkownika, a przekazanie realizowane jest w ramach transakcji, w której na odbiorcę przenosi się, wieczyście (bezterminowo) lub na pewien oznaczony okres (niezależnie od tego, jak ta transakcja jest opisana), prawo do posiadania i używania Produktu Użytkownika, to Odpowiednie Źródło przekazywane zgodnie z niniejszym punktem musi zostać przekazane wraz z Informacją Instalacyjną. + + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. + + + + + Wymóg ten nie ma jednak zastosowania, jeżeli ani ty, ani osoba trzecia nie macie możliwości instalacji zmodyfikowanego kodu obiektowego w Produkcie Użytkownika (na przykład jeżeli utwór został zainstalowany w pamięci ROM). + + + But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + + + + Wymóg dostarczenia Informacji Instalacyjnej nie obejmuje wymogu dalszego świadczenia usług wsparcia, dalszego obejmowania gwarancją ani dostarczania aktualizacji w odniesieniu do utworu, który został zmodyfikowany lub zainstalowany przez odbiorcę, ani w odniesieniu do Produktu Użytkownika, w którym utwór ten został zmodyfikowany lub zainstalowany. + + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. + + + + + Dostęp do sieci może zostać zablokowany, w przypadku gdy sama modyfikacja w istotny i niekorzystny sposób wpływa na funkcjonowanie sieci lub narusza zasady i protokoły komunikacji w sieci. + + + Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + + + + Przekazane Odpowiednie Źródło i dostarczona Informacja Instalacyjna zgodnie z niniejszym punktem muszą mieć postać publicznie udokumentowanego formatu (z publicznie dostępną implementacją w formie kodu źródłowego), a do ich rozpakowania, odczytania lub skopiowania nie może być wymagane żadne specjalne hasło ani klucz. + + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + + + + + 7. + + + 7. + + + + + Warunki dodatkowe + + + Additional Terms. + + + + + „Dodatkowe zezwolenia” to postanowienia, które uzupełniają warunki niniejszej Licencji, wprowadzając wyjątki od jednego lub wielu jej postanowień. + + + “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. + + + + + Dodatkowe zezwolenia dotyczące całego Programu będą traktowane tak, jakby były włączone do niniejszej Licencji w zakresie, w jakim są one ważne i skuteczne zgodnie z przepisami właściwego prawa. + + + Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. + + + + + Jeżeli dodatkowe zezwolenia dotyczą tylko części Programu, to część ta może być używana oddzielnie na podstawie tych zezwoleń, przy czym całość Programu podlega niniejszej Licencji bez uwzględniania tych dodatkowych zezwoleń. + + + If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + + + + Przekazując kopię utworu objętego licencją, możesz, wedle własnego uznania, usunąć z tej kopii lub z jej części dowolne dodatkowe zezwolenia. + + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. + + + + + (Dodatkowe zezwolenia mogą same stanowić, że ich usunięcie jest konieczne w pewnych przypadkach modyfikacji utworu). + + + (Additional permissions may be written to require their own removal in certain cases when you modify the work.) + + + + + Możesz także wprowadzić dodatkowe zezwolenia dotyczące materiałów dodanych przez ciebie do utworu objętego licencją, do których masz lub możesz udzielić odpowiedniego zezwolenia na mocy prawa autorskiego. + + + You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + + + + Niezależnie od innych postanowień niniejszej Licencji, wobec materiałów dodanych przez ciebie do utworu objętego licencją możesz (jeżeli masz do tego prawo przyznane przez podmioty uprawnione z tytułu majątkowych praw autorskich do tych materiałów) dodać do warunków niniejszej Licencji postanowienia: + + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + + + + a) informujące o braku gwarancji lub ograniczające odpowiedzialność w sposób inny niż postanowienia w punktach 15 i 16 niniejszej Licencji; lub + + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + + + + b) wymagające, w granicach rozsądku, zachowania w tych materiałach lub w Zastrzeżeniach Prawnych wyświetlanych przez utwór zawierający te materiały, pewnych informacji prawnych lub informacji o ich autorstwie; lub + + + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + + + + c) zakazujące nieprawidłowego określania pochodzenia tych materiałów lub wymagające, by zmodyfikowane wersje takich materiałów były oznaczone, w sposób rozsądny, jako różne od wersji oryginalnej; lub + + + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + + + + d) ograniczające używanie nazw/nazwisk licencjodawców lub twórców materiałów do celów reklamowych; lub + + + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + + + + e) odmawiające udzielenia praw - wynikających z przepisów dotyczących znaków towarowych - do używania pewnych nazw handlowych, znaków towarowych dotyczących zarówno towarów, jak i usług; lub + + + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + + + + f) wymagające ochrony licencjodawców oraz twórców tych materiałów - przez każdą osobę przekazującą materiały (lub ich zmodyfikowane wersje) z kontraktowym przyjęciem odpowiedzialności wobec odbiorcy - przed wszelkiego rodzaju odpowiedzialnością, jaką to kontraktowe przyjęcie odpowiedzialności nakłada bezpośrednio na tych licencjodawców i twórców. + + + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + + + + Wszelkie inne dodatkowe warunki niebędące zezwoleniami są uznawane za „dodatkowe ograniczenia” w rozumieniu punktu 10. + + + All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. + + + + + Jeżeli Program w kształcie, w jakim go otrzymałeś, lub jakakolwiek jego część zawiera informację stwierdzającą, że podlega niniejszej Licencji, oraz postanowienie, które jest dodatkowym ograniczeniem, to możesz to postanowienie usunąć. + + + If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. + + + + + Jeżeli treść licencji zawiera dodatkowe ograniczenie, lecz pozwala na dalsze licencjonowanie lub przekazywanie zgodnie z niniejszą Licencją, to do utworu objętego licencją możesz dodać materiały podlegające warunkom owego dokumentu licencji, pod warunkiem że przy takim dalszym licencjonowaniu lub przekazaniu dodatkowe ograniczenie zostanie usunięte. + + + If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + + + + Jeżeli zgodnie z niniejszym punktem dodasz postanowienia dotyczące utworu objętego licencją, to w odpowiednich plikach źródłowych musisz umieścić tekst tych dodatkowych postanowień odnoszących się do tych plików lub informację wskazującą, gdzie takie postanowienia można znaleźć. + + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + + + + Dodatkowe warunki będące lub niebędące zezwoleniami mogą zostać ujęte w formie osobno zapisanej licencji lub mogą zostać wskazane jako wyjątki. + Powyższe wymogi obowiązywać będą niezależnie od przyjętego rozwiązania. + + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + + + + + 8. + + + 8. + + + + + Wygaśnięcie + + + Termination. + + + + + Poza przypadkami wyraźnie wskazanymi w niniejszej Licencji, nie możesz propagować ani modyfikować utworu objętego licencją. + + + You may not propagate or modify a covered work except as expressly provided under this License. + + + + + We wszystkich pozostałych przypadkach, każda próba propagowania lub modyfikacji jest nieważna i powoduje automatycznie wygaśnięcie twoich praw wynikających z niniejszej Licencji (w tym wszelkich licencji patentowych udzielonych zgodnie z trzecim akapitem punktu 11). + + + Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + + + + Jeżeli jednak zaprzestaniesz naruszania niniejszej Licencji, to twoja licencja od danego posiadacza praw autorskich (podmiotu uprawnionego z autorskich praw majątkowych) zostanie przywrócona: (a) tymczasowo do momentu, gdy posiadacz prawa autorskiego wyraźnie i ostatecznie cofnie udzieloną ci licencję, albo (b) trwale, jeżeli posiadacz prawa autorskiego, przy wykorzystaniu rozsądnych środków, nie zawiadomi cię o naruszeniu w terminie do 60 dni od momentu zaprzestania. + + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + + + + Ponadto twoja licencja od danego posiadacza praw autorskich zostanie trwale przywrócona, jeżeli właściciel praw autorskich zawiadomi cię o naruszeniu przy wykorzystaniu rozsądnych środków, jeżeli jest to pierwszy przypadek otrzymania przez ciebie od tego właściciela praw autorskich zawiadomienia o naruszeniu niniejszej Licencji (dla dowolnego utworu) i jeżeli zaprzestaniesz naruszania licencji w terminie do 30 dni po otrzymaniu takiego zawiadomienia. + + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + + + + Wygaśnięcie twoich praw na podstawie niniejszego punktu nie powoduje wygaśnięcia licencji stron, które otrzymały od ciebie kopie lub prawa na podstawie tej Licencji. + + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. + + + + + Jeżeli twoje prawa wygasły i nie zostały trwale przywrócone, to nie jesteś również uprawniony do otrzymania nowych licencji na ten sam materiał na podstawie punktu 10. + + + If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + + + + + 9. + + + 9. + + + + + Brak wymogu akceptacji przy otrzymaniu kopii + + + Acceptance Not Required for Having Copies. + + + + + Nie musisz zaakceptować tej Licencji, aby otrzymać lub uruchomić kopię Programu. + + + You are not required to accept this License in order to receive or run a copy of the Program. + + + + + Analogicznie, propagowanie pomocnicze utworu objętego licencją, następujące wyłącznie w konsekwencji uzyskania kopii drogą transmisji peer-to-peer, także nie wymaga akceptacji. + + + Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. + + + + + Niemniej jednak tylko niniejsza Licencja zezwala ci na propagowanie lub modyfikowanie utworów objętych licencją. + + + However, nothing other than this License grants you permission to propagate or modify any covered work. + + + + + Jeżeli nie przyjmiesz niniejszej Licencji, to działania takie będą stanowiły naruszenie prawa autorskiego. + + + These actions infringe copyright if you do not accept this License. + + + + + W związku z tym, modyfikując lub propagując utwór objęty licencją, potwierdzasz, że zaakceptowałeś niniejszą Licencję na wykonywanie tych czynności. + + + Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + + + + + 10. + + + 10. + + + + + Automatyczne udzielenie licencji kolejnym odbiorcom + + + Automatic Licensing of Downstream Recipients. + + + + + Za każdym razem, gdy przekazujesz utwór objęty licencją, odbiorca automatycznie uzyskuje od pierwotnych licencjodawców licencję na uruchamianie, modyfikowanie i propagowanie tego utworu na warunkach określonych w niniejszej Licencji. + + + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. + + + + + Nie jesteś odpowiedzialny za egzekwowanie przestrzegania tej Licencji przez osoby trzecie. + + + You are not responsible for enforcing compliance by third parties with this License. + + + + + „Transakcja podmiotu” to transakcja przenosząca kontrolę organizacji lub generalnie wszystkich aktywów jednej organizacji bądź transakcja podziału organizacji lub transakcja połączenia organizacji. + + + An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. + + + + + Jeżeli propagowanie utworu objętego licencją wynika z transakcji podmiotu, to każda strona tej transakcji, która otrzymuje kopię utworu, otrzymuje także wszelkie licencje do utworu, jakimi dysponował poprzednik tej strony, lub których mógł udzielić na mocy poprzedniego akapitu, a ponadto prawo do posiadania Odpowiedniego Źródła utworu od poprzednika, jeżeli poprzednik posiada je lub może je uzyskać, dokładając rozsądnych starań. + + + If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + + + + Nie możesz narzucać dodatkowych ograniczeń na korzystanie przez odbiorcę z praw udzielonych w niniejszej Licencji lub przez nią potwierdzonych. + + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + + + + + Przykładowo, nie możesz nakładać opłaty licencyjnej, honorarium autorskiego ani innej opłaty za korzystanie z praw przyznanych niniejszą licencją i nie możesz wszczynać postępowań sądowych (w tym także zgłaszać powództwa wzajemnego ani dokonywać przypozwania w postępowaniu sądowym), zarzucając, że jakiekolwiek zastrzeżenie patentowe zostało naruszone poprzez wykonywanie, używanie, sprzedaż, oferowanie na sprzedaż lub importowanie Programu albo dowolnej jego części. + + + For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + + + + + 11. + + + 11. + + + + + Patenty + + + Patents. + + + + + „Kontrybutor” to posiadacz prawa autorskiego udzielający niniejszą Licencją prawa do używania Programu lub utworu, na którym oparty jest Program. + + + A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. + + + + + Utwór, na który udziela się w taki sposób licencji, nazywany jest „wersją kontrybutora”. + + + The work thus licensed is called the contributor's “contributor version”. + + + + + „Zasadnicze prawa patentowe” kontrybutora to wszystkie prawa patentowe będące własnością lub znajdujące się pod kontrolą kontrybutora, uzyskane przed datą niniejszego dokumentu lub później, które zostałyby naruszone przez pewien, dozwolony przez niniejszą Licencję, sposób wykonywania, używania lub sprzedaży wersji kontrybutora, przy czym nie obejmują one praw, które zostałyby naruszone tylko w konsekwencji dalszej modyfikacji wersji kontrybutora. + + + A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. + + + + + Dla celów niniejszej definicji „kontrola” obejmuje prawo do udzielania dalszych licencji na patent w sposób zgodny z wymogami niniejszej Licencji. + + + For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + + + + Każdy kontrybutor udziela ci niewyłącznej, ważnej na całym świecie i zwolnionej z honorarium autorskiego licencji patentowej, na mocy zasadniczych praw patentowych kontrybutora, do wykonywania, używania, sprzedaży, oferowania na sprzedaż, importowania oraz innego uruchamiania, modyfikacji i propagowania treści wersji kontrybutora. + + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + + + + W trzech poniższych akapitach termin „licencja patentowa” oznacza każdą otwarcie wyrażoną zgodę lub zobowiązanie, niezależnie od jej sformułowania, do nieegzekwowania praw patentowych (na przykład otwarcie wyrażoną zgodę na wykorzystanie patentu lub zobowiązanie do powstrzymania się od działań prawnych w przypadku naruszenia praw patentowych). + + + In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). + + + + + „Udzielenie” takiej licencji patentowej pewnej osobie oznacza wyrażenie takiej zgody lub zobowiązania do nieegzekwowania praw patentowych od tej osoby. + + + To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + + + + Jeżeli przekazujesz utwór objęty licencją, świadomie polegając na udzielonej licencji patentowej, a Odpowiednie Źródło utworu nie jest dla nikogo dostępne do darmowego kopiowania zgodnie z warunkami niniejszej Licencji na publicznie dostępnym serwerze sieciowym lub poprzez inne środki dostępu, wtedy musisz albo (1) zapewnić dostępność Odpowiedniego Źródła, albo (2) doprowadzić do pozbycia się praw wynikających z licencji patentowej na dany utwór, albo (3) zapewnić rozszerzenie licencji patentowej na dalszych odbiorców w sposób zgodny z wymogami niniejszej Licencji. + + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. + + + + + „Świadome poleganie” oznacza, że masz faktyczną wiedzę, że gdyby nie było licencji patentowej, to przekazywanie przez ciebie w danym kraju utworu objętego licencją lub używanie tego utworu przez twojego odbiorcę w danym kraju naruszałoby w tym kraju jeden lub więcej konkretnych patentów, co do których masz powody uważać, że wciąż obowiązują. + + + “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + + + + Jeżeli na mocy jednej transakcji lub porozumienia albo w związku z taką transakcją lub porozumieniem przekazujesz utwór objęty licencją bądź, powodując jego przekazanie, propagujesz je i udzielasz licencji patentowej niektórym ze stron otrzymującym to utwór objęty licencją, dając im prawo do używania, propagowania, modyfikowania lub przekazywania określonej kopii utworu objętego licencją, to udzielona przez ciebie licencja patentowa zostaje automatycznie rozszerzona na wszystkich odbiorców utworu objętego licencją oraz wszystkich utworów na nim opartych. + + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + + + + Licencja patentowa jest „wybiórcza”, jeżeli w jej zakresie brakuje jednego lub więcej praw przyznanych niniejszą Licencją lub jeżeli zabrania ona korzystania z takiego prawa lub praw albo jeżeli jej udzielenie uwarunkowane jest niewykorzystaniem takiego prawa lub praw. + + + A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. + + + + + Nie możesz przekazać utworu objętego licencją, jeżeli jesteś stroną porozumienia z osobą trzecią prowadzącą działalność polegającą na rozpowszechnianiu oprogramowania, w ramach którego dokonujesz płatności na rzecz tej osoby w zależności od zasięgu twoich działań w zakresie przekazywania utworu i w ramach którego osoba ta udziela wszystkim stronom, które otrzymają od ciebie utwór objęty licencją, wybiórczej licencji patentowej: (a) powiązanej z przekazanymi przez ciebie kopiami utworu objętego licencją (lub kopiami tych kopii) lub (b) głównie na produkty lub kompilacje zawierające utwory objęte licencją i w związku z nimi, chyba że porozumienie takie zawarłeś przed dniem 28 marca 2007 r. lub dana licencja patentowa została udzielona przed tym dniem. + + + You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + + + + Żadne z postanowień niniejszej Licencji nie będzie interpretowane jako wyłączenie lub ograniczenie jakiejkolwiek domyślnej licencji lub innych środków ochrony przed naruszeniem, jakie mogą ci przysługiwać na mocy przepisów odpowiedniego prawa patentowego. + + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + + + + + 12. + + + 12. + + + + + Zakaz ograniczania praw (wolności) osób trzecich + + + No Surrender of Others' Freedom. + + + + + Jeżeli narzucone ci zostaną (czy to przez nakaz sądu, umowę, czy w inny sposób) warunki sprzeczne z warunkami niniejszej Licencji, to taka okoliczność nie zwalnia cię z obowiązku przestrzegania postanowień niniejszej Licencji. + + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. + + + + + Jeśli nie możesz przekazywać utworu objętego licencją w taki sposób, aby wypełniać jednocześnie swoje obowiązki z tytułu niniejszej Licencji i inne stosowne obowiązki, to w efekcie nie możesz przekazywać tego utworu wcale. + + + If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. + + + + + Na przykład, jeżeli zgodzisz się na warunki zobowiązujące cię do pobierania honorarium autorskiego za dalsze przekazywanie Programu od osób, którym go przekazujesz, to jedynym sposobem na spełnienie tych warunków i jednocześnie postanowień Licencji byłoby całkowite zaprzestanie przekazywania tego Programu. + + + For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + + + + + 13. + + + 13. + + + + + Używanie z Powszechną Licencją Publiczną GNU Affero + + + Use with the GNU Affero General Public License. + + + + + Niezależnie od innych postanowień niniejszej Licencji, możesz powiązać lub połączyć każdy utwór objęty licencją z utworem objętym wersją 3 Powszechnej Licencji Publicznej GNU Affero, w jeden połączony utwór, oraz przekazywać utwór, który powstał w ten sposób. + + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. + + + + + Warunki niniejszej Licencji będą dalej obowiązywały dla części stanowiącej utwór objęty licencją, natomiast do samego połączonego utworu stosowane będą specjalne wymagania punktu 13 Powszechnej Licencji Publicznej GNU Affero dotyczące interakcji w sieci. + + + The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + + + + + 14. + + + 14. + + + + + Poprawione wersje niniejszej Licencji + + + Revised Versions of this License. + + + + + W miarę potrzeb Fundacja Wolnego Oprogramowania może publikować poprawione oraz/lub nowe wersje Powszechnej Licencji Publicznej GNU. + + + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. + + + + + Takie nowe wersje będą napisane w duchu podobnym do obecnej wersji, ale mogą różnić się w szczegółach poruszających nowe problemy lub zagadnienia. + + + Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + + + + Każdej wersji nadaje się wyróżniający ją numer. + + + Each version is given a distinguishing version number. + + + + + Jeżeli Program zawiera informację, że objęty jest pewną określoną wersją Powszechnej Licencji Publicznej GNU oraz „dowolną z późniejszych wersji”, to masz do wyboru stosować się do zasad i warunków tej określonej wersji lub do dowolnej późniejszej wersji wydanej przez Fundację Wolnego Oprogramowania. + + + If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. + + + + + Jeżeli Program nie podaje numeru wersji niniejszej Powszechnej Licencji Publicznej GNU, to możesz wybrać dowolną wersję kiedykolwiek opublikowaną przez Fundację Wolnego Oprogramowania. + + + If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + + + + + Jeżeli Program zawiera informację, że przedstawiciel może podjąć decyzję o tym, która z przyszłych wersji Powszechnej Licencji Publicznej GNU będzie miała zastosowanie, to publiczne oświadczenie tego przedstawiciela o akceptacji danej wersji daje ci bezterminowo prawo do stosowania tej właśnie wersji w odniesieniu do Programu. + + + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + + + + Na mocy późniejszych wersji licencji możesz uzyskać dodatkowe lub inne zezwolenia/prawa. + + + Later license versions may give you additional or different permissions. + + + + + Niemniej jednak twoja decyzja o stosowaniu późniejszej wersji nie nałoży żadnych dodatkowych obowiązków ani na twórcę, ani na posiadacza prawa autorskiego. + + + However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + + + + + 15. + + + 15. + + + + + Zastrzeżenia dotyczące gwarancji + + + Disclaimer of Warranty. + + + + + W ZAKRESIE DOZWOLONYM PRZEZ WŁAŚCIWE PRZEPISY PRAWA, PROGRAM NIE JEST OBJĘTY GWARANCJĄ. + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + + + + + O ILE NA PIŚMIE NIE STANOWI SIĘ INACZEJ, POSIADACZE PRAW AUTORSKICH ORAZ/LUB INNE STRONY DOSTARCZAJĄ PROGRAM W STANIE, W JAKIM JEST (WERSJA „AS IS”) BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŻONEJ OTWARCIE, ANI DOMYŚLNEJ, W TYM MIĘDZY INNYMI BEZ DOMYŚLNYCH GWARANCJI CO DO PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + + + + TY SAM PONOSISZ CAŁE RYZYKO DOTYCZĄCE JAKOŚCI I DZIAŁANIA PROGRAMU. + + + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + + + + + GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, TO TY PONOSISZ KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB KOREKTY. + + + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + + 16. + + + 16. + + + + + Ograniczenie odpowiedzialności + + + Limitation of Liability. + + + + + O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA ORAZ/LUB PRZEKAZUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI ZEZWOLENIAMI W ŻADNYM WYPADKU NIE BĘDZIE ODPOWIEDZIALNA WOBEC CIEBIE ZA SZKODY - W TYM SZKODY OGÓLNE, SPECJALNE, UBOCZNE LUB WTÓRNE - WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻNOŚCI UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH LUB POWSTANIE DANYCH NIEPRAWIDŁOWYCH ALBO ZA STRATY PONIESIONE PRZEZ CIEBIE LUB OSOBY TRZECIE, JAK TEŻ ZA NIEWSPÓŁDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI DANY POSIADACZ BĄDŹ INNA OSOBA ZOSTALI POWIADOMIENI O MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD. + + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + + 17. + + + 17. + + + + + Interpretacja punktów 15 i 16 + + + Interpretation of Sections 15 and 16. + + + + + Jeżeli powyższe zastrzeżenia dotyczące gwarancji oraz ograniczenie odpowiedzialności nie mogą mieć mocy prawnej w danym kraju zgodnie z ich treścią, to właściwe sądy powinny zastosować przepisy prawa danego kraju, które możliwie w największym stopniu wyrażają całkowite wyłączenie odpowiedzialności cywilnej w związku z Programem, chyba że Program zawiera gwarancję lub akceptację odpowiedzialności w zamian za wynagrodzenie. + + + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + + + + + KONIEC ZASAD I WARUNKÓW + + + END OF TERMS AND CONDITIONS + + + + + Jak stosować niniejsze warunki do twoich nowych programów + + + How to Apply These Terms to Your New Programs + + + + + Jeśli opracowujesz nowy program i chciałbyś, aby stał się on jak najbardziej użyteczny dla ogółu, najlepiej osiągniesz to, nadając twojemu programowi charakter wolnego oprogramowania, które każdy może rozpowszechniać dalej i zmieniać zgodnie z warunkami niniejszej Licencji. + + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + + + + + W tym celu do programu dołącz poniższe informacje. + + + To do so, attach the following notices to the program. + + + + + Najbezpieczniej będzie zamieścić je na początku każdego pliku źródłowego - dzięki temu najskuteczniej można wyrazić fakt nieudzielania gwarancji. + Każdy plik powinien zawierać przynajmniej linię z informacją o przysługiwaniu w stosunku do utworu autorskich praw majątkowych („nota copyright-’owa”) i odnośnik, gdzie można znaleźć pełną informację. + + + It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + + + + <jedna linia z nazwą programu i krótką informacją, do czego on służy> + + + <one line to give the program's name and a brief idea of what it does.> + + + + + Copyright (C) <rok> <imię i nazwisko twórcy> + + + Copyright (C) <year> <name of author> + + + + + Niniejszy program jest wolnym oprogramowaniem - możesz go rozpowszechniać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU wydanej przez Fundację Wolnego Oprogramowania, według wersji 3 tej Licencji lub dowolnej z późniejszych wersji. + + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + + + + Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ ŻADNEJ GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. + + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + + Bliższe informacje na ten temat można uzyskać z Powszechnej Licencji Publicznej GNU. + + + See the GNU General Public License for more details. + + + + + Kopia Powszechnej Licencji Publicznej GNU powinna zostać ci dostarczona razem z tym programem. + + + You should have received a copy of the GNU General Public License along with this program. + + + + + Jeżeli nie została dostarczona, odwiedź <http://www.gnu.org/licenses/>. + + + If not, see <http://www.gnu.org/licenses/>. + + + + + Podaj też informacje o sposobie kontaktowania się z tobą pocztą elektroniczną lub zwykłą. + + + Also add information on how to contact you by electronic and paper mail. + + + + + Jeśli dany program wykorzystuje połączenie terminalowe, spraw, aby w momencie wchodzenia w tryb interaktywny wyświetlał on komunikat, jak w poniższym przykładzie: + + + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + + + + <program> Copyright (C) <rok> <imię i nazwisko twórcy> + + + <program> Copyright (C) <year> <name of author> + + + + + Na ten program nie udziela się ABSOLUTNIE ŻADNEJ GWARANCJI; dalsze informacje uzyskasz, wpisując „show w”. + + + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + + + + + To jest wolne oprogramowanie i możesz rozpowszechniać je dalej na określonych warunkach; dalsze informacje uzyskasz, wpisując „show c”. + + + This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + + + + + Powyższe hipotetyczne polecenia „show w” i „show c” winny powodować wyświetlenie odpowiednich części Powszechnej Licencji Publicznej. + + + The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. + + + + + Oczywiście polecenia w twoim programie mogą być inne; w przypadku interfejsu graficznego używa się okna „O programie”. + + + Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + + + + + Powinieneś też poprosić swego pracodawcę (jeśli pracujesz jako programista) lub swoją szkołę o podpisanie, w razie potrzeby, „Zrzeczenie się majątkowych praw autorskich” do programu. + + + You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. + + + + + Więcej informacji na ten temat oraz na temat stosowania i przestrzegania Powszechnej Licencji Publicznej GNU znajdziesz na stronie <http://www.gnu.org/licenses/>. + + + For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. + + + + + Powszechna Licencja Publiczna GNU nie zezwala na włączanie twojego programu do programów prawnie zastrzeżonych. + + + The GNU General Public License does not permit incorporating your program into proprietary programs. + + + + + Jeśli twój program jest biblioteką podprogramów, możesz rozważyć, czy nie będzie korzystniej zezwolić, aby prawnie zastrzeżone aplikacje mogły korzystać z twojej biblioteki. + + + If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. + + + + + Jeśli właśnie to jest twoją intencją, zamiast niniejszej Licencji użyj Powszechnej Licencji Publicznej GNU dla Bibliotek. + + + If this is what you want to do, use the GNU Lesser General Public License instead of this License. + + + + + Najpierw jednak przeczytaj <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + diff --git a/result/length/poisson/poznan.al b/result/length/poisson/poznan.al new file mode 100755 index 0000000..9bf9eef --- /dev/null +++ b/result/length/poisson/poznan.al @@ -0,0 +1,309 @@ + + + + + Położenie Poznania w obrębie Pojezierza Wielkopolskiego sprawia, że na obszarze miasta, obok gęstej sieci rzek, znajdują się duże, naturalnie ukształtowane jeziora oraz liczne, niewielkie oczka polodowcowe. + + + Dank der Lage der Stadt Poznań inmitten der Großpolnischen Seeplatte gibt es innerhalb der Stadt außer einem dichten Netz von Flüssen große, natürlich gestaltete Seen und zahlreiche kleine postglaziale Seeaugen. + + + + + Jest tu także ok. 150 sztucznych zbiorników wodnych, a wśród nich największe - Malta i Rusałka, które upiększają tereny rekreacyjne. + + + Es gibt hier auch etwa 150 künstliche Wasserreservoirs, von denen die größten - Malta und Rusałka - die Erholungsgebiete verschönern. + + + + + Ze względu na powierzchnię, walory przyrodnicze, znaczenie ekologiczne, rekreacyjne i gospodarcze szczególnie ważne dla miasta są jeziora: Kierskie i Strzeszyńskie oraz (wymienione wcześniej) Malta i Rusałka. + + + Hinsichtlich ihrer Fläche, natürlicher Werte, ökologischer, Erholungs - und wirtschaftlicher Bedeutung sind für die Stadt die Seen: Kierskie und Strzeszyńskie sowie (die vorgenannten) Malta und Rusałka am wichtigsten. + + + + + Jezioro Kierskie jest największym naturalnym zbiornikiem wodnym położonym w granicach Poznania. + + + Der Kierskie - See ist das größte natürliche Wasserreservoir, das sich innerhalb von Poznań befindet. + + + + + Jego powierzchnia wynosi 285 ha. + + + Seine Fläche beträgt 285 ha. + + + + + Średnia głębokość akwenu to 10,1 m, ale są miejsca, gdzie dochodzi ona do 37,6 m. + + + Die Durchschnittstiefe des Sees beträgt 10,1 m, aber es gibt Stellen, wo er 37,6 m tief ist. + + + + + Przeszło 12 - kilometrowa linia brzegowa zapewnia doskonałe warunki turystyczne i rekreacyjne. + + + Eine über 12 Kilometer lange Uferlinie sichert ausgezeichnete Bedingungen für Erholung und Tourismus. + + + + + Wśród lasów liściastych, wzdłuż wschodniego brzegu jeziora, usytuowane są dróżki spacerowe, które zachodnim klinem zieleni prowadzą aż do Parku Sołackiego. + + + In Laubwäldern entlang dem östlichen Seeufer gibt es Spazierwege, die durch de westlichen Grünkeil bis in den Sołacki - Park führen. + + + + + Przez cały rok jezioro jest dostępne dla wędkarzy, którzy mogą liczyć przede wszystkim na sielawę, ale także np. na węgorza, sandacza, szczupaka, okonia, amura białego, karpia czy leszcza. + + + Ein ganzes Jahr über ist der See für Angler geöffnet, die vor allem Kleine Maränen, aber auch z. B. auf Aale, Zander, Hechte, Barsche, Weiße Amure, Karpfen oder Brassen fangen können. + + + + + Wędkować można zarówno z brzegu, jak i łodzi. + + + Angeln kann man sowohl vom Ufer, als auch vom Boot aus. + + + + + Materiał zarybieniowy dla wędkarzy wprowadzany jest corocznie przez Polski Związek Wędkarski. + + + Jedes Jahr werden hier vom Polnischen Angelverein Jungfische ausgesetzt. + + + + + Nad Jeziorem Kierskim znajdują się dwa strzeżone kąpieliska: w Krzyżownikach i Kiekrzu, oraz liczne ośrodki wypoczynkowe i szkoleniowe. + + + Am Kierskie - See gibt es zwei bewachte Badestellen: in Krzyżowniki und Kiekrz, sowie zahlreiche Erholungs - und Schulungszentren. + + + + + Ponieważ nad Jeziorem Kierskim działają prężne ośrodki żeglarstwa (w zimie sportu bojerowego), charakterystycznym elementem krajobrazu są przystanie żeglarskie. + + + Da am Kierskie - See viele Segelsportzentren (im Winter Eissegelsportzentren) tätig sind, sind Anlegestellen ein markantes Landschaftselement. + + + + + Jezioro Malta jest zbiornikiem sztucznym. + Powstało w 1952 r. przez spiętrzenie wód rzeki Cybiny. + + + Der Stausee Malta wurde 1952 durch den Aufstau der Cybina geschaffen. + + + + + Po zakończonej w 1990 r.rekultywacji, jezioro Malta osiągnęło powierzchnię 64,0 ha. + Średnia głębokość akwenu wynosi 3,13 m, ale są miejsca, w których sięga ona 5,0 m. + + + Der Malta - See nimmt eine Fläche von 64 ha ein, seine maximale Tiefe beträgt 5 m (im Bereich der Regattastrecke - 3,7 m). + + + + + Jezioro Rusałka jest sztucznym zbiornikiem wodnym. + + + Der Rusałka - See ist ein künstliches Wasserreservoir. + + + + + Powstało w 1943 r. przez spiętrzenie rzeki Bogdanki. + + + Er entstand im Jahre 1943 durch Stauung des Flusses Bogdanka. + + + + + Jezioro położone jest w zachodnim klinie zieleni - na Golęcinie. + + + Der See liegt im westlichen Grünkeil - im Stadtviertel Golęcin. + + + + + Akwen zajmuje powierzchnię 36,7 ha. + + + Der See hat eine Fläche von 36,7 ha. + + + + + Średnia głębokość jeziora to 1,9 m, maksymalna - 9,0 m. + + + Die Durchschnittstiefe des Sees beträgt 1,9 m, die maximale Tiefe - 9,0 m. + + + + + Długość linii brzegowej wynosi 3300 m. + + + Die Länge der Uferlinie beträgt 3300 m. + + + + + Jezioro Rusałka należy do ogólnie dostępnych wód Polskiego Związku Wędkarskiego, jednak - z uwagi na jego położenie - obowiązuje na nim zakaz wędkowania w porze nocnej i spiningowania. + + + Der Rusałka - See gehört zu den allgemein zugänglichen Gewässern des Polnischen Angelvereins, doch - wegen seiner Lage - gilt dort das Verbot des Nachtangelns und des Spinnangelns. + + + + + Rusałka zalicza się do jezior typu sandaczowego, ale w akwenie pływają także karpie, węgorze, leszcze, liny, amury białe, szczupaki, płocie i wiele innych gatunków. + + + Der Rusałka - See ist ein Zandersee, doch hier schwimmen auch solche Fische wie Karpfen, Aale, Brassen, Schleien, Weiße Amure, Hechte, Rotaugen und viele andere Gattungen. + + + + + Bliskie położenie jeziora od centrum miasta i atrakcyjne tereny wokół niego sprawiają, że jezioro jest bardzo popularnym miejscem letniego wypoczynku mieszkańców Poznania i turystów. + + + Dank der Lage des Sees unweit vom Stadtzentrum und attraktiven Gebieten um den See ist er eine beliebte Sommererholungsstelle der Einwohner von Poznań und Touristen. + + + + + W sezonie letnim nad jeziorem czynny jest Ośrodek Sportu i Rekreacji, który sprawuje opiekę nad kąpieliskiem strzeżonym. + + + In der Sommersaison ist am See ein Sport - und Erholungszentrum geöffnet, das für die bewachte Badestelle sorgt. + + + + + Kąpielisko wyposażone jest w pomosty, rynnową zjeżdżalnię do wody o dł. 93 m, wypożyczalnię sprzętu pływającego, szatnie oraz zaplecze gastronomiczne. + + + Die Badestelle verfügt über Laufstege, eine 93m - Rinnenrutsche, ein Wassersportgeräte - Verleih, Umkleidekabinen und Gaststättenbetriebe. + + + + + Ośrodek może przyjąć ok. 10 tys.osób. + + + Das Sport - und Erholungszentrum kann etwa 10 Tsd. Personen aufnehmen. + + + + + Jezioro Strzeszyńskie jest naturalnym zbiornikiem wodnym, oddalonym o ok. 10 km od centrum Poznania. + + + Der Strzeszyńskie - See ist ein natürliches Wasserreservoir, das etwa 10 km vom Zentrum der Stadt Poznań entfernt ist. + + + + + Powierzchnia akwenu wynosi 34,9 ha. + + + Die Fläche des Sees beträgt 34,9 ha. + + + + + Średnia głębokość jeziora to 8,2 m, a w najgłębszym miejscu pomiary wskazują 17,8 m. + + + Seine Durchschnittstiefe - 8,2 m, wobei an der tiefsten Stelle die Messungen 17,8 m zeigen. + + + + + Linia brzegowa o długości 4,5 km, to teren porośnięty głównie lasami liściastymi i sosnowymi, wykorzystywany przede wszystkim do celów rekreacyjnych. + + + Die Uferlinie mit einer Länge von 4,5 km ist ein hauptsächlich mit Laub - und Kieferwald bewachsenes Gebiet, das vor allem für Erholungszwecke genutzt wird. + + + + + Jezioro użytkowane jest przez Polski Związek Wędkarski w Poznaniu. + + + Der See wird vom Polnischen Angelverein in Poznań genutzt. + + + + + Dbając o jak najlepsze warunki do wędkowania, związek prowadzi prace związane z zarybianiem i odłowami. + + + In der Sorge für die besten Angelbedingungen werden vom Angelverein Jungfische ausgesetzt und es wird abgefischt. + + + + + Jezioro zaliczane jest do typu sielawowego. + + + In dem See überwiegt die Kleine Maräne. + + + + + Oprócz sielawy występuje w nim także: karp, węgorz, leszcz, lin, szczupak, krąp, ukleja, płoć, okoń, sieja, karaś i kiełb. + + + Darüber hinaus kommen hier auch: Karpfen, Aale, Brassen, Schleien, Hechte, Güster, Ukeleien, Rotaugen, Barsche, Maränen, Goldkarauschen und Gründlinge vor. + + + + + W okresie letnim Jezioro Strzeszyńskie jest bardzo atrakcyjnym miejscem rekreacyjnym. + + + Im Sommer ist Strzeszyńskie - See ein sehr attraktiver Erholungsort. + + + + + Położony nad jeziorem ośrodek dysponuje kąpieliskiem na 10 tys.osób, motelem oraz restauracją czynną przez cały rok. + + + Das am See gelegene Erholungszentrum verfügt über eine Badestelle für 10 Tsd. Personen, ein Motel und ein Restaurant, das ein ganzes Jahr über geöffnet ist. + + + + + W skład obiektu wchodzą również domki letniskowe oraz camping na ok. 150 osób. + + + Zum Objekt gehören auch Ferienhäuser und ein Campingplatz für etwa 150 Personen. + + + diff --git a/result/length/poisson/stallman-ch1.al b/result/length/poisson/stallman-ch1.al new file mode 100755 index 0000000..2debfd5 --- /dev/null +++ b/result/length/poisson/stallman-ch1.al @@ -0,0 +1,1428 @@ + + + + + Rozdział 1. + + + Chapter 1 + + + + + Gdy potrzebna drukarka + + + For Want of a Printer + + + + + Obawiam się Greków, nawet gdy przynoszą dary + + + I fear the Greeks. + Even when they bring gifts. + + + + + - Wergiliusz + + + ---Virgil + + + + + Eneida + + + The Aeneid + + + + + Nowa drukarka znowu się zacięła. + + + The new printer was jammed, again. + + + + + Richard M. Stallman, programista w Laboratorium Sztucznej Inteligencji1 w Massachusetts Institute of Technology2 (zwanym w skrócie AI Lab), dotkliwe odczuł odkrycie tego uszkodzenia. + + + Richard M. Stallman, a staff software programmer at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory (AI Lab), discovered the malfunction the hard way. + + + + + W godzinę po posłaniu do druku 50-stronicowego pliku 27-letni Stallman oderwał się na chwilę od zajmującej go pracy i poszedł po dokumenty. + + + An hour after sending off a 50-page file to the office laser printer, Stallman, 27, broke off a productive work session to retrieve his documents. + Upon arrival, he found only four pages in the printer's tray. + + + + + Po dotarciu do drukarki znalazł tylko cztery wydrukowane strony, co gorsza - nie były to strony z jego dokumentu, co oznaczało, że jego plik w całości nadal tkwił w przepastnej plątaninie sieci AI Lab. + + + To make matters even more frustrating, the four pages belonged to another user, meaning that Stallman's print job and the unfinished portion of somebody else's print job were still trapped somewhere within the electrical plumbing of the lab's computer network. + + + + + Ryzyko oczekiwania na wykonanie zadania przez maszynę jest częścią codziennej pracy programisty, więc Stallman dość spokojnie przyjął rozczarowanie, które go spotkało. + + + Waiting for machines is an occupational hazard when you're a software programmer, so Stallman took his frustration with a grain of salt. + + + + + Jest jednak różnica między oczekiwaniem, aż maszyna zakończy działanie, a czekaniem na to, czy w ogóle raczy je rozpocząć. + + + Still, the difference between waiting for a machine and waiting on a machine is a sizable one. + + + + + Wielokrotnie był zmuszony czekać na kartki dość wolno "wypluwane" przez drukarkę. + + + It wasn't the first time he'd been forced to stand over the printer, watching pages print out one by one. + + + + + Jako kogoś, kto spędził znaczną część życia na poprawianiu efektywności urządzeń technicznych i oprogramowania nimi sterującego, zawsze korciło go, by otworzyć pokrywę, zajrzeć do wnętrza działającej maszynerii i poszukać przyczyn problemu. + + + As a person who spent the bulk of his days and nights improving the efficiency of machines and the software programs that controlled them, Stallman felt a natural urge to open up the machine, look at the guts, and seek out the root of the problem. + + + + + Niestety, jego sprawność i zdolności programisty nie sięgały zagadnień techniczno-inżynieryjnych. + + + Unfortunately, Stallman's skills as a computer programmer did not extend to the mechanical-engineering realm. + + + + + Gdy wreszcie wyjął z drukarki świeżo wydrukowane strony, zaczął się zastanawiać, w jaki sposób mógłby na przyszłość uniknąć tego problemu. + + + As freshly printed documents poured out of the machine, Stallman had a chance to reflect on other ways to circumvent the printing jam problem. + + + + + Niedawno zespół AI Lab z otwartymi ramionami powitał nową drukarkę. + + + How long ago had it been that the staff members at the AI Lab had welcomed the new printer with open arms? + + + + + Urządzenie było darem Xerox Corporation. + + + Stallman wondered. + + + + + Prototyp najnowszego modelu był zmodyfikowaną wersją popularnej fotokopiarki. + + + The machine had been a donation from the Xerox Corporation. + + + + + Zamiast dokumentami przeznaczonymi do kopiowania, urządzenie było "karmione" danymi produkowanymi przez oprogramowanie i dostarczanymi przez kabel sieciowy. + + + A cutting edge prototype, it was a modified version of the popular Xerox photocopier. + + + + + Dane te były następnie przekształcane w profesjonalnie wyglądające wydrukowane dokumenty. + + + Only instead of making copies, it relied on software data piped in over a computer network to turn that data into professional-looking documents. + + + + + Maszyna, zaprojektowana przez znane w świecie biuro badawczo-projektowe Xerox Palo Alto Research Facility, była pierwszym zwiastunem urządzeń desktop publishing3, które do końca dekady miały zająć znaczące miejsce na rynku komputerowym. + + + Created by engineers at the world-famous Xerox Palo Alto Research Facility, it was, quite simply, an early taste of the desktop-printing revolution that would seize the rest of the computing industry by the end of the decade. + + + + + Nagleni instynktowną potrzebą skorzystania z najnowszego urządzenia, programiści z AI Lab szybko zintegrowali je ze skomplikowaną infrastrukturą swej sieci komputerowej. + + + Driven by an instinctual urge to play with the best new equipment, programmers at the AI Lab promptly integrated the new machine into the lab's sophisticated computing infrastructure. + + + + + Natychmiast osiągnięto zadawalające rezultaty. + + + The results had been immediately pleasing. + + + + + Nowe urządzenie Xeroxa było znacznie szybsze od poprzednio używanej starej drukarki laserowej. + + + Unlike the lab's old laser printer, the new Xerox machine was fast. + + + + + Zadrukowane kartki opuszczały nową drukarkę w tempie jedna na sekundę, co np. dawne 20-minutowe drukowanie skracało do 2 minut. + + + Pages came flying out at a rate of one per second, turning a 20-minute print job into a 2-minute print job. + The new machine was also more precise. + + + + + Nowa drukarka działała również o wiele precyzyjniej: koła było okrągłe, a nie owalne, linie proste były naprawdę liniami prostymi, a nie sinusoidami o niewielkiej amplitudzie. + + + Circles came out looking like circles, not ovals. + Straight lines came out looking like straight lines, not low-amplitude sine waves. + + + + + Był to ze pod każdym względem dar, który należało docenić. + + + It was, for all intents and purposes, a gift too good to refuse. + + + + + Jednakże po kilku tygodniach zaczęły dawać o sobie znać słabe punkty urządzenia. + + + It wasn't until a few weeks after its arrival that the machine's flaws began to surface. + + + + + Głównym była skłonność do zawieszania się wskutek zaklinowania papieru. + + + Chief among the drawbacks was the machine's inherent susceptibility to paper jams. + + + + + Programiści o zdolnościach inżynierskich wkrótce zrozumieli przyczynę. + + + Engineering-minded programmers quickly understood the reason behind the flaw. + + + + + Urządzenie, będące niegdyś fotokopiarką, było przeznaczone do działania pod czyimś nadzorem. + + + As a photocopier, the machine generally required the direct oversight of a human operator. + + + + + Osoba ta zawsze była "pod ręką" i jeżeli zdarzało się zaklinowanie papieru, mogła od razu usunąć przyczynę zacięcia. + Przyjmując to za rzecz oczywistą, inżynierowie Xeroxa skupiali uwagę na rozwiązywaniu innych problemów, ten pomijając. + + + Figuring that these human operators would always be on hand to fix a paper jam, if it occurred, Xerox engineers had devoted their time and energies to eliminating other pesky problems. + + + + + W ich założeniach czujna obecność użytkownika było częścią systemu. + + + In engineering terms, user diligence was built into the system. + + + + + Zamieniając urządzenie w drukarkę, w subtelny sposób zmienili również relację między nim i użytkownikiem. + + + In modifying the machine for printer use, Xerox engineers had changed the user-machine relationship in a subtle but profound way. + + + + + Poprzednio służyło jednej osobie, teraz przez sieć komputerową miało służyć wielu. + + + Instead of making the machine subservient to an individual human operator, they made it subservient to an entire networked population of human operators. + + + + + Użytkownik nie stał już nad drukarką i nie nadzorował jej działania, lecz gdzieś z daleka z dowolnego miejsca sieci wysyłał polecenie drukowania. + + + Instead of standing directly over the machine, a human user on one end of the network sent his print command through an extended bucket-brigade of machines, expecting the desired content to arrive at the targeted destination and in proper form. + It wasn't until he finally went to check up on the final output that he realized how little of the desired content had made it through. + + + + + Przechodząc przez wiele urządzeń, docierało ono do celu, gdzie miało się przekształcić w drukowane dokumenty. + + + Stallman himself had been of the first to identify the problem and the first to suggest a remedy. + + + + + Użytkownik nie miał żadnego kontaktu z drukarką aż do czasu, gdy po dotarciu do niej w celu odebrania wydruku przekonywał się, że jedynie niewielka jego część została wykonana. + + + Years before, when the lab was still using its old printer, Stallman had solved a similar problem by opening up the software program that regulated the printer on the lab's PDP-11 machine. + + + + + Stallman był jednym z pierwszych, którzy ustalili przyczynę kłopotów, i pierwszym, który zaproponował, jak się ich pozbyć. + Rozwiązał już podobny problem kilka lat temu, gdy laboratorium używało jeszcze starej drukarki. + + + Stallman couldn't eliminate paper jams, but he could insert a software command that ordered the PDP-11 to check the printer periodically and report back to the PDP-10, the lab's central computer. + + + + + Nie mógł usunąć mechanicznych przyczyn zacinania się papieru, ale dogrzebał się do wnętrza programu, który na PDP-11 sterował działaniem drukarki i umieścił tam polecenie okresowego sprawdzania jej stanu oraz wysyłania raportu do głównego komputera sieci PDP-10. + + + + + + Aby być pewnym, że niefrasobliwość użytkownika, którego wydruk zawiesił działanie drukarki, nie spowoduje ogólnego zatoru wstrzymującego drukowanie całej kolejki, dopisał polecenia wysyłające zawiadomienie o awarii do wszystkich, których pliki czekały na wydrukowanie. + + + To ensure that one user's negligence didn't bog down an entire line of print jobs, Stallman also inserted a software command that instructed the PDP-10 to notify every user with a waiting print job that the printer was jammed. + + + + + Komunikat był prosty, coś w rodzaju: "Drukarka się zacięła. + Zajmij się tym", ale ponieważ był wysyłany do osób najbardziej zainteresowanych problemem, awarię zwykle szybko usuwano. + + + The notice was simple, something along the lines of "The printer is jammed, please fix it," and because it went out to the people with the most pressing need to fix the problem, chances were higher that the problem got fixed in due time. + + + + + Było to obejście problemu, a nie jego rozwiązanie, ale obejście eleganckie i skuteczne. + + + As fixes go, Stallman's was oblique but elegant. + + + + + Nie potrafił rozwiązać problemu mechanicznego, ale zrobił to, co mógł zrobić najlepszego, zamykając w pętli drukarkę i zainteresowanych użytkowników. + + + It didn't fix the mechanical side of the problem, but it did the next best thing by closing the information loop between user and machine. + + + + + Dzięki kilku dodatkowym wierszom programu pracownicy AI Lab mogli zaoszczędzić tygodniowo średnio od 10 do 15 minut traconych poprzednio na zbędne wędrowanie do drukarki i z powrotem. + + + Thanks to a few additional lines of software code, AI Lab employees could eliminate the 10 or 15 minutes wasted each week in running back and forth to check on the printer. + + + + + W języku programistów można powiedzieć, że rozwiązanie Stallmana było wykorzystaniem skumulowanej inteligencji sieci. + + + In programming terms, Stallman's fix took advantage of the amplified intelligence of the overall network. + + + + + "Jeżeli otrzymasz komunikat, nie możesz być pewny, że ktoś inny usunie zacięcie" - logicznie wnioskował Stallman. "Na pewno pójdziesz do drukarki. + + + "If you got that message, you couldn't assume somebody else would fix it," says Stallman, recalling the logic. "You had to go to the printer. + + + + + W ten sposób w ciągu minuty zjawią się tam dwie lub trzy zainteresowane osoby i zajmą się problemem. + + + A minute or two after the printer got in trouble, the two or three people who got messages arrive to fix the machine. + + + + + Z tych dwóch lub trzech osób przynajmniej jedna będzie wiedziała, co należy zrobić". + + + Of those two or three people, one of them, at least, would usually know how to fix the problem." + + + + + Takie inteligentne rozwiązywanie problemów było znakiem firmowym AI Lab i grupy pracujących tam programistów. + + + Such clever fixes were a trademark of the AI Lab and its indigenous population of programmers. + + + + + Najlepsi z nich pogardzali terminem "programista" i woleli nazywać się hakerami. + + + Indeed, the best programmers at the AI Lab disdained the term programmer, preferring the more slangy occupational title of hacker instead. + + + + + Ta nazwa obejmowała bezmiar różnych działań, wszystko - od radosnej twórczej zabawy, po poważne prace ulepszające istniejące systemy komputerowe. + + + The job title covered a host of activities-everything from creative mirth making to the improvement of existing software and computer systems. + + + + + W sposób niejawny zawierała w sobie także pamiętną z czasów pionierskich jankeską pomysłowość i zaradność. + + + Implicit within the title, however, was the old-fashioned notion of Yankee ingenuity. + + + + + Bycie hakerem oznaczało akceptację poglądu, że napisanie programu to dopiero początek. + + + To be a hacker, one had to accept the philosophy that writing a software program was only the beginning. + + + + + Prawdziwym testem hakerskich umiejętności jest ulepszenie kodu4. + + + Improving a program was the true test of a hacker's skills.1 + + + + + Taka filozofia bardzo odpowiadała firmom w rodzaju Xeroxa, które chętnie darowały swoje urządzenia i oprogramowanie instytucjom będącym znanymi skupiskami hakerów. + + + Such a philosophy was a major reason why companies like Xerox made it a policy to donate their machines and software programs to places where hackers typically congregated. + + + + + Z poprawek przez nich wprowadzanych korzystano potem, wprowadzając na rynek nowe wersje i uaktualnienia. + + + If hackers improved the software, companies could borrow back the improvements, incorporating them into update versions for the commercial marketplace. + + + + + Zgodnie z terminologią firm, społeczności hakerskie były zwiększającym wartość społecznym kapitałem oraz dodatkowym działem badawczo-rozwojowym dostępnym za śmiesznie małe pieniądze. + + + In corporate terms, hackers were a leveragable community asset, an auxiliary research-and-development division available at minimal cost. + + + + + Z powodu tej filozofii dawania i brania Stallman, po wykryciu zacinania się papieru w nowej drukarce Xeroxa, ze spokojem zaczął się zastanawiać, jak stary sposób omijania problemu przenieść do nowego systemu. + + + It was because of this give-and-take philosophy that when Stallman spotted the print-jam defect in the Xerox laser printer, he didn't panic. + He simply looked for a way to update the old fix or " hack" for the new system. + + + + + Jednakże przyglądając się oprogramowaniu nowej drukarki laserowej, zrobił niepokojące odkrycie. + + + In the course of looking up the Xerox laser-printer software, however, Stallman made a troubling discovery. + + + + + Do drukarki nie dołączono oprogramowania, a przynajmniej nie było go w postaci czytelnej dla niego i jego kolegów. + + + The printer didn't have any software, at least nothing Stallman or a fellow programmer could read. + + + + + Dotychczas większość firm grzecznościowo publikowała kody źródłowe pozwalające poznać poszczególne polecenia sterujące urządzeniem. + + + Until then, most companies had made it a form of courtesy to publish source-code files-readable text files that documented the individual software commands that told a machine what to do. + + + + + W tym przypadku Xerox dostarczył oprogramowanie w wersji prekompilowanej lub binarnej. + + + Xerox, in this instance, had provided software files in precompiled, or binary, form. + + + + + Programiści mogli bez kłopotu otworzyć pliki, ale nie będąc ekspertami od dekodowania długich ciągów zer i jedynek, patrzyli na nie jak na nieznany szyfr. + + + Programmers were free to open the files up if they wanted to, but unless they were an expert in deciphering an endless stream of ones and zeroes, the resulting text was pure gibberish. + + + + + Choć Stallman wiele wiedział o komputerach, nie znał się na odczytywaniu plików binarnych. + + + Although Stallman knew plenty about computers, he was not an expert in translating binary files. + + + + + Jednakże jako haker miał do dyspozycji inne źródła informacji. + + + As a hacker, however, he had other resources at his disposal. + + + + + Wiedział, że to tylko kwestia czasu, kiedy gdzieś w świecie jakiś haker na uniwersytecie lub w firmie rozszyfruje oprogramowanie nowej drukarki laserowej Xeroxa wraz z plikami pełnego kodu źródłowego. + Wiedział także, że udostępni te pliki innym, gdyż pogląd o konieczności dzielenia się z innymi zdobytymi informacjami jest centralnym elementem filozofii hakerskiej. + + + The notion of information sharing was so central to the hacker culture that Stallman knew it was only a matter of time before some hacker in some university lab or corporate computer room proffered a version of the laser-printer source code with the desired source-code files. + + + + + Po kilkakrotnym zacięciu się drukarki Stallman przypomniał sobie sytuację sprzed lat. + + + After the first few printer jams, Stallman comforted himself with the memory of a similar situation years before. + + + + + W laboratorium potrzebny był program obsługi sieci zwiększający wydajność współpracy PDP-11 z PDP-10. + + + The lab had needed a cross-network program to help the PDP-11 work more efficiently with the PDP-10. + + + + + Hakerzy z AI Lab byli gotowi zająć się tym problemem, ale Stallman, absolwent Harvardu, przypomniał sobie, że podobny program został tam napisany przez programistów z działu badań komputerowych. + + + The lab's hackers were more than up to the task, but Stallman, a Harvard alumnus, recalled a similar program written by programmers at the Harvard computer-science department. + + + + + W Harvardzie używano takich samych maszyn PDP-10 i PDP-11, ale z innym systemem operacyjnym. + + + The Harvard computer lab used the same model computer, the PDP-10, albeit with a different operating system. + + + + + W Harvardzie przestrzegano również zasady, że instalowaniu jakichkolwiek programów na PDP-10 musi towarzyszyć ujawnianie ich kodów źródłowych. + + + The Harvard computer lab also had a policy requiring that all programs installed on the PDP-10 had to come with published source-code files. + + + + + Korzystając ze swych kontaktów z wydziałem komputerowym Harvardu, Stallman sporządził kopię pliku źródłowego interesującego go programu i zabrał do AI Lab. + + + Taking advantage of his access to the Harvard computer lab, Stallman dropped in, made a copy of the cross-network source code, and brought it back to the AI Lab. + + + + + Potem przekształcił go do postaci wymaganej przez stosowany tam system operacyjny. + + + He then rewrote the source code to make it more suitable for the AI Lab's operating system. + + + + + Bez zbędnego krzyku i zamieszania AI Lab załatało istotną dziurę w swojej strukturze informatycznej. + + + With no muss and little fuss, the AI Lab shored up a major gap in its software infrastructure. + + + + + Stallman przy okazji zrobił kilka poprawek i dodał kilka nowych przydatnych funkcji, których brakowało w wersji opracowanej w Harvardzie. + + + Stallman even added a few features not found in the original Harvard program, making the program even more useful. "We wound up using it for several years," Stallman says. + + + + + Zwiększyło to użyteczność programu, z którego - jak powiedział Stallman - "mogliśmy korzystać przez kilka lat". + W latach siedemdziesiątych takie postępowanie można było porównać do pożyczenia od sąsiada jakiegoś narzędzia lub torby cukru. + + + From the perspective of a 1970s-era programmer, the transaction was the software equivalent of a neighbor stopping by to borrow a power tool or a cup of sugar from a neighbor. + + + + + Jedyną różnicą było to, że sporządzając kopię programu, Stallman nie pozbawił Harvardu możliwości korzystania z jego wersji oryginalnej. + + + The only difference was that in borrowing a copy of the software for the AI Lab, Stallman had done nothing to deprive Harvard hackers the use of their original program. + + + + + Hakerzy z Harvardu odnieśli przy tym dodatkową korzyść, gdyż w zamian za udostępnienie kodu źródłowego mogli swobodnie korzystać z poprawek wprowadzonych przez Stallmana. + + + If anything, Harvard hackers gained in the process, because Stallman had introduced his own additional features to the program, features that hackers at Harvard were perfectly free to borrow in return. + + + + + Nikt z Harvardu nie zainteresował się poprawionym programem, ale Stallman przypomina sobie programistę z prywatnej firmy Bolt & Beranek, który skorzystał z ulepszonego kodu, dodając do niego kilka zmian, które z kolei Stallman mógł ewentualnie swobodnie zintegrować z wersją działającą w AI Lab. + + + Although nobody at Harvard ever came over to borrow the program back, Stallman does recall a programmer at the private engineering firm, Bolt, Beranek & Newman, borrowing the program and adding a few additional features, which Stallman eventually reintegrated into the AI Lab's own source-code archive. + + + + + "Program mógłby się rozwijać jak miasto" - mówi Stallman, wspominając infrastrukturę informatyczną AI Lab. - "Części mogłyby być wymieniane i rekonstruowane, a nowe elementy dodawane. + + + "A program would develop the way a city develops," says Stallman, recalling the software infrastructure of the AI Lab. "Parts would get replaced and rebuilt. + New things would get added on. + + + + + Można by, spoglądając na jakiś element, mówić ŤHmm... sądząc po stylu, musiało to być napisane w połowie lat siedemdziesiątychť". + + + But you could always look at a certain part and say, `Hmm, by the style, I see this part was written back in the early 60s and this part was written in the mid-1970s.'" + + + + + Dzięki takiemu nakładaniu się warstw intelektualnych hakerzy z AI Lab i innych ośrodków mogli tworzyć rzeczy działające doskonale. + + + Through this simple system of intellectual accretion, hackers at the AI Lab and other places built up robust creations. + + + + + Na zachodnim wybrzeżu naukowcy komputerowi z UC Berkeley współpracujący z kilkoma inżynierami systemowymi z AT&T zbudowali w ten sposób pełny system operacyjny. + + + On the west coast, computer scientists at UC Berkeley, working in cooperation with a few low-level engineers at AT&T, had built up an entire operating system using this system. + + + + + Nazwany Uniksem, oparty na starszym, bardziej akademickim i poważanym systemie Multics, był dostępny dla każdego, kto zechciał zapłacić za taśmę do wykonania kopii i przesyłkę. + + + Dubbed Unix, a play on an older, more academically respectable operating system called Multics, the software system was available to any programmer willing to pay for the cost of copying the program onto a new magnetic tape and shipping it. + + + + + Nie wszyscy programiści uczestniczący w tym przedsięwzięciu uważali się za hakerów, ale większość podzielała poglądy Richarda Stallmana. + + + Not every programmer participating in this culture described himself as a hacker, but most shared the sentiments of Richard M. Stallman. + + + + + Jeżeli jakieś rozwiązanie problemu było dla jednego użytkownika, mogło przydać się również innemu. + + + If a program or software fix was good enough to solve your problems, it was good enough to solve somebody else's problems. + + + + + Dlaczego więc nie podzielić się nim z innymi, choćby dla zyskania dobrego samopoczucia? + + + Why not share it out of a simple desire for good karma? + + + + + Fakt, że Xerox nie ma ochoty na użyczenie kodów źródłowych, na początku niezbyt zdenerwował Stallmana. + + + The fact that Xerox had been unwilling to share its source-code files seemed a minor annoyance at first. + + + + + Starając się dotrzeć do kodów, zrazu nawet nie niepokoił Xeroxa. "Podarowali nam drukarkę laserową" - myślał - "czy wypada ich niepokoić dodatkowymi żądaniami?" + + + In tracking down a copy of the source-code files, Stallman says he didn't even bother contacting Xerox. "They had already given us the laser printer," Stallman says. "Why should I bug them for more?" + + + + + Jednakże po kilku nieudanych próbach dotarcia do plików źródłowych stawał się coraz bardziej podejrzliwy. + + + When the desired files failed to surface, however, Stallman began to grow suspicious. + + + + + Rok wcześniej starł się z doktorantem z Carnegie Mellon University5. + + + The year before, Stallman had experienced a blow up with a doctoral student at Carnegie Mellon University. + + + + + Student Brian Reid był autorem użytecznego programu do formatowania tekstu o nazwie Scribe. + + + The student, Brian Reid, was the author of a useful text-formatting program dubbed Scribe. + + + + + Był to jeden z pierwszych programów pozwalających użytkownikowi na dołączanie do dokumentu przesyłanego przez sieć własnych definicji kształtu czcionek i stylów. + Był to zwiastun HTML-a, lingua franca Word Wide Web. + + + One of the first programs that gave a user the power to define fonts and type styles when sending a document over a computer network, the program was an early harbinger of HTML, the lingua franca of the World Wide Web. + + + + + W roku 1979 Reid zdecydował się sprzedać Scribe'a działającej w rejonie Pittsburga firmie programistycznej Unilogic. + + + In 1979, Reid made the decision to sell Scribe to a Pittsburgh-area software company called Unilogic. + + + + + Studencki rozdział w życiu Reida kończył się i, jak twierdził, starał się przekazać program komuś, kto będzie go rozwijał, strzegąc jednocześnie przed przedostaniem się do domeny publicznej. + + + His graduate-student career ending, Reid says he simply was looking for a way to unload the program on a set of developers that would take pains to keep it from slipping into the public domain. + + + + + Jakby tego było mało, Reid zgodził się na umieszczenie w kodzie kilku zależnych od czasu funkcji - bomb z opóźnionym zapłonem, które powodowały deaktywację swobodnie rozprowadzanych kopii, jeżeli użytkownicy w ciągu 90 dni nie wnieśli stosownej opłaty. + + + To sweeten the deal, Reid also agreed to insert a set of time-dependent functions- "time bombs" in software-programmer parlance-that deactivated freely copied versions of the program after a 90-day expiration date. + + + + + Jeżeli taka opłata została wniesiona, firma wysyłała kod wyłączający "podłożone ładunki". + + + To avoid deactivation, users paid the software company, which then issued a code that defused the internal time-bomb feature. + + + + + Dla Reida była to procedura doskonała. + + + For Reid, the deal was a win-win. + + + + + Scribe nie stał się publicznie dostępny, a Unilogic odzyskał zainwestowane pieniądze. + + + Scribe didn't fall into the public domain, and Unilogic recouped on its investment. + + + + + Natomiast dla Stallmana była to oczywista zdrada etosu programisty. + + + For Stallman, it was a betrayal of the programmer ethos, pure and simple. + + + + + Zamiast honorować ideę dzielenia się wiedzą Reid pokazał firmom, w jaki sposób zmusić programistów do płacenia za dostęp do informacji. + + + Instead of honoring the notion of share-and-share alike, Reid had inserted a way for companies to compel programmers to pay for information access. + + + + + Mijały tygodnie i próby Stallmana uzyskania dostępu do kodów źródłowych oprogramowania drukarki Xeroxa odbijały się od muru zmowy milczenia. + Wreszcie pojął, że teraz gra odbywa się według nowego scenariusza: "chcesz wiedzieć, to płać". + + + As the weeks passed and his attempts to track down Xerox laser-printer source code hit a brick wall, Stallman began to sense a similar money-for-code scenario at work. + + + + + Zanim jednak zdążył się na ten temat wypowiedzieć lub zacząć działać, pocztą pantoflową dotarły do niego dobre wieści. + + + Before Stallman could do or say anything about it, however, good news finally trickled in via the programmer grapevine. + + + + + Dowiedział się, że jeden z pracowników wydziału nauk komputerowych Carnegie Mellon University przed miesiącem odszedł z Xerox Palo Alto Research Center. + + + Word had it that a scientist at the computer-science department at Carnegie Mellon University had just departed a job at the Xerox Palo Alto Research Center. + + + + + Jak wieść niosła, nie dość, że przedtem pracował nad oprogramowaniem do interesującej Stallmana drukarki, to po przeniesieniu się na uniwersytet ponoć kontynuował tę pracę, traktując ją jako część swoich naukowych zadań. + + + Not only had the scientist worked on the laser printer in question, but according to rumor, he was still working on it as part of his research duties at Carnegie Mellon. + + + + + Odkładając na bok swoje uprzednie podejrzenia, Stallman postanowił zatem odszukać tego osobnika podczas kolejnej wizyty w campusie Carnegie Mellon. + + + Casting aside his initial suspicion, Stallman made a firm resolution to seek out the person in question during his next visit to the Carnegie Mellon campus. + + + + + Nie musiał długo czekać. + + + He didn't have to wait long. + + + + + W Carnegie Mellon też istniało laboratorium zajmujące się badaniami nad sztuczną inteligencją, więc w ciągu kilku miesięcy nadarzyła się okazja do złożenia tam roboczej wizyty. + + + Carnegie Mellon also had a lab specializing in artificial-intelligence research, and within a few months, Stallman had a business-related reason to visit the Carnegie Mellon campus. + During that visit, he made sure to stop by the computer-science department. + + + + + Odwiedził wówczas wydział komputerowy, gdzie w biurze skierowano go do człowieka prowadzącego projekt Xeroxa. + + + Department employees directed him to the office of the faculty member leading the Xerox project. + + + + + Dotarłszy do wskazanego pokoju, zastał profesora przy pracy. + + + When Stallman reached the office, he found the professor working there. + + + + + Rozmowa inżyniera z inżynierem była uprzejma lecz daremna. + + + In true engineer-to-engineer fashion, the conversation was cordial but blunt. + + + + + Przedstawiwszy się krótko jako gość z MIT, poprosił o udostępnienie kopii kodów źródłowych drukarki laserowej, aby mógł poprawić jej współdziałanie z PDP-11. + + + After briefly introducing himself as a visitor from MIT, Stallman requested a copy of the laser-printer source code so that he could port it to the PDP-11. + + + + + Ku jego zaskoczeniu profesor odmówił spełnienia prośby. + + + To his surprise, the professor refused to grant his request. + + + + + "Powiedział, że zgodnie z daną obietnicą nie może mi dać kopii" - wspomina Stallman. + + + "He told me that he had promised not to give me a copy," Stallman says. + + + + + Pamięć jest ciekawą rzeczą. + + + Memory is a funny thing. + + + + + Dwadzieścia lat po tym fakcie taśma pamięci Stallmana pełna jest pustych miejsc. + + + Twenty years after the fact, Stallman's mental history tape is notoriously blank in places. + + + + + Nie pamięta, po co pojechał wtedy do Carnegie Mellon, ani pory roku, kiedy wizyta miała miejsce, nie pamięta także profesora, ani doktoranta, z którymi wtedy rozmawiał. + + + Not only does he not remember the motivating reason for the trip or even the time of year during which he took it, he also has no recollection of the professor or doctoral student on the other end of the conversation. + + + + + Według Reida rozmówcą Stallmana mógł być Robert Sproull, dawniejszy pracownik badawczy Xerox PARC, a obecny dyrektor Sun Loboratories, oddziału badawczego konglomeratu komputerowo-technologicznego Sun Microsystems. + + + According to Reid, the person most likely to have fielded Stallman's request is Robert Sproull, a former Xerox PARC researcher and current director of Sun Laboratories, a research division of the computer-technology conglomerate Sun Microsystems. + + + + + W latach siedemdziesiątych Sproull kierował w Xerox PARC tworzeniem programów obsługi interesującego nas typu drukarek laserowych. + + + During the 1970s, Sproull had been the primary developer of the laser-printer software in question while at Xerox PARC. + + + + + W latach osiemdziesiątych zajmował się badaniami naukowymi na Carnegie Mellon, gdzie wśród innych zadań kontynuował prace nad oprogramowaniem drukarek. + + + Around 1980, Sproull took a faculty research position at Carnegie Mellon where he continued his laser-printer work amid other projects. + + + + + "Kod, o który prosił Stallman, był najnowszym osiągnięciem sztuki programowania, napisanym przez Sproulla w ostatnim roku przed zatrudnieniem w Carnegie Mellon" - twierdzi Reid. + + + "The code that Stallman was asking for was leading-edge state-of-the-art code that Sproull had written in the year or so before going to Carnegie Mellon," recalls Reid. + + + + + "Gdy dotarła do niego prośba Stallmana, był w Carnegie Mellon zapewne niecały miesiąc". + + + "I suspect that Sproull had been at Carnegie Mellon less than a month before this request came in." + + + + + Jednakże zapytany wprost o tamtą prośbę Sproull nie potrafi niczego wyjaśnić. + + + When asked directly about the request, however, Sproull draws a blank. + + + + + W e-mailu napisał - "Nie mogę tego faktu skomentować, gdyż zupełnie go nie pamiętam". + + + "I can't make a factual comment," writes Sproull via email. + "I have absolutely no recollection of the incident." + + + + + Mając dwóch uczestników rozmowy niemogących sobie przypomnieć jej istotnych szczegółów, łącznie z faktem, czy ta rozmowa w ogóle miała miejsce, trudno ocenić zapamiętaną przez Stallmana bezceremonialność odpowiedzi Sproulla. + + + With both participants in the brief conversation struggling to recall key details-including whether the conversation even took place-it's hard to gauge the bluntness of Sproull's refusal, at least as recalled by Stallman. + + + + + W wystąpieniach publicznych Stallman powtarza, że przyczyną odmowy Sproulla był kontrakt zawarty z Xerox Corporation dający jemu i innym dostęp do kodu źródłowego ale pod warunkiem nieudostępniania go osobom postronnym. + Teraz takie zobowiązanie dochowania tajemnicy firmowej zwane w skrócie NDA od "non disclosure agreement" jest standardem w firmach produkujących oprogramowanie, ale wówczas było nowością. + + + In talking to audiences, Stallman has made repeated reference to the incident, noting that Sproull's unwillingness to hand over the source code stemmed from a nondisclosure agreement, a contractual agreement between Sproull and the Xerox Corporation giving Sproull, or any other signatory, access the software source code in exchange for a promise of secrecy. + + + + + Stanowiło ono odbicie wielkiej wartości handlowej, jaką dla Xeroxa przedstawiały drukarki, oraz potrzeby zdobycia informacji koniecznej do ich uruchomienia. + "Xerox właśnie starał się zrobić z drukarki laserowej produkt handlowy" - wspomina Reid. + + + Now a standard item of business in the software industry, the nondisclosure agreement, or NDA, was a novel development at the time, a reflection of both the commercial value of the laser printer to Xerox and the information needed to run it. + + + + + - "Wariowali wówczas ze strachu, że kod może zostać ujawniony". + + + "Xerox was at the time trying to make a commercial product out of the laser printer," recalls Reid. + + + + + Ale dla Stallmana NDA, czy jak tam się ta umowa nazywała, było czymś więcej. + + + "They would have been insane to give away the source code." + For Stallman, however, the NDA was something else entirely. + + + + + Było odcięciem go przez spółkę Xeroxa ze Sproullem, czy jak tam się ten osobnik nazywał, od potrzebnego mu kodu źródłowego i zniszczeniem systemu, który dotychczas działał sprawnie - traktowania programów jak wartości społecznej. + + + It was a refusal on the part of Xerox and Sproull, or whomever the person was that turned down his source-code request that day, to participate in a system that, until then, had encouraged software programmers to regard programs as communal resources. + + + + + Był jak wieśniak, któremu nagle wysechł kanał irygacyjny od stuleci dostarczający wodę na pola. + Idąc wzdłuż tego kanału, trafił na zamykającą koryto tamę hydroelektrowni ze znakiem firmowym Xeroxa. + + + Like a peasant whose centuries-old irrigation ditch had grown suddenly dry, Stallman had followed the ditch to its source only to find a brand-spanking-new hydroelectric dam bearing the Xerox logo. + + + + + Dopiero po pewnym czasie przyjął do wiadomości, że Xerox zmusił programistę do przyjęcia wyznaczonych warunków i działania w ramach nowo wymyślonego systemu nakazanej dyskrecji. + + + For Stallman, the realization that Xerox had compelled a fellow programmer to participate in this newfangled system of compelled secrecy took a while to sink in. + + + + + Na początku uznał odmowę za skierowaną przeciwko sobie. + + + At first, all he could focus on was the personal nature of the refusal. + + + + + Jako osoba czująca się niepewnie w kontaktach twarzą w twarz, sądził że najlepiej wpaść do kolegi programisty bez zapowiedzi, po prostu jak do sąsiada. + + + As a person who felt awkward and out of sync in most face-to-face encounters, Stallman's attempt to drop in on a fellow programmer unannounced had been intended as a demonstration of neighborliness. + + + + + Teraz, gdy spotkała go odmowa, sądził, że popełnił gafę. "Byłem tak wściekły, że nie mogłem zebrać myśli, więc się po prostu odwróciłem i wyszedłem bez słowa. + + + Now that the request had been refused, it felt like a major blunder. "I was so angry I couldn't think of a way to express it. + So I just turned away and walked out without another word," Stallman recalls. + + + + + Być może nawet trzasnąłem drzwiami. + + + "I might have slammed the door. + + + + + Kto wie?" - wspomina. "Pamiętam jedynie, że chciałem wyjść jak najszybciej". + + + Who knows? + All I remember is wanting to get out of there." + + + + + Choć upłynęło już 20 lat, czas nie stłumił złości, do tego stopnia, że Stallman uczynił z tego zdarzenia punkt zwrotny swego postępowania. + + + Twenty years after the fact, the anger still lingers, so much so that Stallman has elevated the event into a major turning point. + + + + + W ciągu kilku następnych miesięcy na Stallmana i społeczność hakerów z AI Lab spadła seria zdarzeń, w porównaniu z którymi 30-sekundowy epizod w Carnegie Mellon wyglądał trywialnie. + + + Within the next few months, a series of events would befall both Stallman and the AI Lab hacker community that would make 30 seconds worth of tension in a remote Carnegie Mellon office seem trivial by comparison. + + + + + Niezależnie od sposobu posortowania tych zdarzeń według ich ważności, przemieniły one Stallmana z hakera instynktownie nieufnego wobec wszelkich centralnych autorytetów w rycerza krucjaty walczącej o utrzymanie w świecie twórców oprogramowania tradycyjnych wartości: wolności, równości i braterstwa. + + + Nevertheless, when it comes time to sort out the events that would transform Stallman from a lone hacker, instinctively suspicious of centralized authority, to a crusading activist applying traditional notions of liberty, equality, and fraternity to the world of software development, Stallman singles out the Carnegie Mellon encounter for special attention. + + + + + Jednakże on sam uważa zdarzenie w Carnegie Mellon za najważniejsze. + + + "It encouraged me to think about something that I'd already been thinking about," says Stallman. + + + + + "Dodało mi to odwagi do sformułowania idei, o której myślałem od dawna" - powiada - "że oprogramowanie powinno być wspólną, ogólnie dostępną własnością. + Myślałem o tym od dawna, ale nigdy nie byłem pewien, jak należy to sformułować. + + + "I already had an idea that software should be shared, but I wasn't sure how to think about that. + + + + + Myśli nie były uporządkowane, co zaciemniało obraz, nie pozwalając na przedstawienie go światu w zrozumiałej postaci." + + + My thoughts weren't clear and organized to the point where I could express them in a concise fashion to the rest of the world." + + + + + Choć już wcześniejsze zdarzenia budziły jego gniew, twierdzi, że dopiero po scenie w Carnegie Mellon uświadomił sobie, że stanowiły one wstęp do ataku na świat zasad, które przez lata uważał za świętość. + + + Although previous events had raised Stallman's ire, he says it wasn't until his Carnegie Mellon encounter that he realized the events were beginning to intrude on a culture he had long considered sacrosanct. + + + + + Należąc do elitarnej grupy programistów pracujących w najlepszych środkach światowych, był skłonny do całkowitego lekceważenia kompromisów i zobowiązań przyjmowanych przez jego kolegów dopóty, dopóki nie miało to żadnego związku z jego pracą. + + + As an elite programmer at one of the world's elite institutions, Stallman had been perfectly willing to ignore the compromises and bargains of his fellow programmers just so long as they didn't interfere with his own work. + + + + + Do czasu zdarzenia z drukarką Xeroxa spoglądał z góry na urządzenia i programy, które inni użytkownicy zmuszeni byli tolerować w ponurym milczeniu. + + + Until the arrival of the Xerox laser printer, Stallman had been content to look down on the machines and programs other computer users grimly tolerated. + + + + + W rzadkich przypadkach, gdy jakiś program czynił wyłom w murach otaczających AI Lab, na przykład gdy dokonano zamiany starego szanowanego Z Niczym Niezgodnego Systemu Operacyjnego na komercyjną wersję TOPS 206, Stallman wraz z kolegami miał swobodę pisania od nowa, zmieniania postaci i nazw poszczególnych elementów zgodnie z własnymi upodobaniami. + + + On the rare occasion that such a program breached the AI Lab's walls-when the lab replaced its venerable Incompatible Time Sharing operating system with a commercial variant, the TOPS 20, for example-Stallman and his hacker colleagues had been free to rewrite, reshape, and rename the software according to personal taste. + + + + + Teraz nowa drukarka stała się oznaką zmian, które nastały. + + + Now that the laser printer had insinuated itself within the AI Lab's network, however, something had changed. + + + + + Działała świetnie, poza klinowaniem się papieru od czasu do czasu, ale zniknęła możliwość dokonywania zmian zgodnie z własnymi upodobaniami. + + + The machine worked fine, barring the occasional paper jam, but the ability to modify according to personal taste had disappeared. + + + + + Drukarka ta była oznaką przebudzenia się całego przemysłu programistycznego. + + + From the viewpoint of the entire software industry, the printer was a wake-up call. + + + + + Oprogramowanie stało się dla firm rzeczą tak ważną, że uznały publikowanie kodów źródłowych za zbędne i niebezpieczne, gdyż mogło stać się dla konkurencji tanim źródłem pożądanych informacji. + + + Software had become such a valuable asset that companies no longer felt the need to publicize source code, especially when publication meant giving potential competitors a chance to duplicate something cheaply. + + + + + Z punktu widzenia Stallmana drukarka była koniem trojańskim. + + + From Stallman's viewpoint, the printer was a Trojan Horse. + + + + + W ciągu następnej dekady oprogramowanie z zastrzeżonymi prawami własności wśliznęło się jak wąż do wnętrza AI Lab. + Pojawiło się w postaci daru. + + + After a decade of failure, privately owned software-future hackers would use the term " proprietary" software-had gained a foothold inside the AI Lab through the sneakiest of methods. + + + + + Stallman musiał przełknąć dwie gorzkie pigułki. + + + It had come disguised as a gift. + + + + + Pierwszą było to, że Xerox dał kilku programistom AI Lab pełny dostęp do kolejnych darów w zamian za zobowiązanie do zachowania tajemnicy, a drugą - uświadomienie sobie, że być może on sam uległby takiej propozycji, gdyby spotkała go ona w młodszym wieku. + + + That Xerox had offered some programmers access to additional gifts in exchange for secrecy was also galling, but Stallman takes pains to note that, if presented with such a quid pro quo bargain at a younger age, he just might have taken the Xerox Corporation up on its offer. + + + + + Jednakże irytujące zdarzenie w Carnegie Mellon utrwaliło go w dotychczasowych przekonaniach. + + + The awkwardness of the Carnegie Mellon encounter, however, had a firming effect on Stallman's own moral lassitude. + + + + + Po pierwsze, wywołało nieufność, z jaką od tej pory podchodził do wszystkich darów, a po drugie, postawiło przed nim niewygodne pytanie, jak on by się zachował, gdyby ktoś z kolegów wpadł do jego pokoju i poprosił o kod, którego nie powinien ujawnić. + + + Not only did it give him the necessary anger to view all future entreaties with suspicion, it also forced him to ask the uncomfortable question: what if a fellow hacker dropped into Stallman's office someday and it suddenly became Stallman's job to refuse the hacker's request for source code? + + + + + "Było to moje pierwsze spotkanie z NDA i doprowadziło do wniosku, że umowy tego typu muszą mieć swoje ofiary" - twierdzi z przekonaniem Stallman - "W tym przypadku ofiarą byłem ja i AI Lab". + + + "It was my first encounter with a nondisclosure agreement, and it immediately taught me that nondisclosure agreements have victims," says Stallman, firmly. + "In this case I was the victim. [My lab and I] were victims." + + + + + Była to lekcja, która pomogła mu przetrwać burzliwe lata osiemdziesiąte - dziesięciolecie, w którym wielu jego kolegów z MIT odeszło z AI Lab i zaczęło działać na własny rachunek, podpisując umowy NDA. + + + It was a lesson Stallman would carry with him through the tumultuous years of the 1980s, a decade during which many of his MIT colleagues would depart the AI Lab and sign nondisclosure agreements of their own. + + + + + Fakt, że zwykle były to umowy na czas określony, był dla nich usprawiedliwieniem. + + + Because most nondisclosure aggreements (NDAs) had expiration dates, few hackers who did sign them saw little need for personal introspection. + + + + + Uważali, że prędzej, czy później oprogramowanie stanie się własnością publiczną. + + + Sooner or later, they reasoned, the software would become public knowledge. + + + + + Obiecywali dotrzymanie tajemnicy w czasie najwcześniejszego wykluwania się oprogramowania, na jego najwcześniejszych etapach rozwoju i traktowali to jako konieczny kompromis, jako cenę, którą trzeba zapłacić za dopuszczenie hakerów do prac nad najlepszymi projektami. + + + In the meantime, promising to keep the software secret during its earliest development stages was all a part of the compromise deal that allowed hackers to work on the best projects. + + + + + Dla Stallmana był to początek staczania się po równi pochyłej. + + + For Stallman, however, it was the first step down a slippery slope. + + + + + "Gdy ktoś zaprosił mnie do zdradzenia kolegów przez wzięcie udziału w takim przedsięwzięciu, przypomniałem sobie, jaką złość wywołało u mnie doświadczenie na sobie takiego traktowania." - wspomina - "Odpowiedziałem zatem: Dziękuję bardzo za chęć podarowania mi tak pięknego pakietu oprogramowania, ale nie mogę go przyjąć na proponowanych warunkach, więc obejdę się bez niego". + + + "When somebody invited me to betray all my colleagues in that way, I remembered how angry I was when somebody else had done that to me and my whole lab," Stallman says. + "So I said, `Thank you very much for offering me this nice software package, but I can't accept it on the conditions that you're asking for, so I'm going to do without it.'" + + + + + Jak się szybko przekonał, rezygnowanie z takich ofert to coś więcej niż osobiste poświęcenie. + + + As Stallman would quickly learn, refusing such requests involved more than personal sacrifice. + + + + + Było to budowanie muru oddzielającego go od grupy innych hakerów, którzy choć podzielali jego pogardę dla okrywania pracy tajemnicą, skłonni byli stosować o wiele bardziej elastyczne kryteria moralne. + + + It involved segregating himself from fellow hackers who, though sharing a similar distaste for secrecy, tended to express that distaste in a more morally flexible fashion. + + + + + Z upływem czasu stawał się coraz bardziej wyobcowany, nawet wewnątrz AI Lab i zaczęto mu przyczepiać etykietkę "ostatniego prawdziwego hakera". + Powiększało to jego izolację od rynku coraz bardziej zdominowanego przez oprogramowanie z zastrzeżonymi prawami własności. + + + It wasn't long before Stallman, increasingly an outcast even within the AI Lab, began billing himself as "the last true hacker," isolating himself further and further from a marketplace dominated by proprietary software. + + + + + Uznał, że odmawianie innym prawa do poznania kodów źródłowych jest nie tylko zdradą zasad działalności naukowej obowiązujących od czasów II wojny światowej, lecz także pogwałceniem "złotej zasady", podstawowego prawa moralnego nakazującego traktować innych tak, jakbyśmy sami chcieli być przez nich traktowani. + + + Refusing another's request for source code, Stallman decided, was not only a betrayal of the scientific mission that had nurtured software development since the end of World War II, it was a violation of the Golden Rule, the baseline moral dictate to do unto others as you would have them do unto you. + + + + + Na tym polega znaczenie drukarki laserowej i starcia, które spowodowała. + + + Hence the importance of the laser printer and the encounter that resulted from it. + + + + + Bez tego, jak twierdzi Stallman, jego życie pobiegłoby bardziej utartym trybem, balansując między zadowoleniem płynącym z dostatku pracującego dla rynku programisty, a frustracją spowodowaną pisaniem niewidocznego dla innych kodu programów. + + + Without it, Stallman says, his life might have followed a more ordinary path, one balancing the riches of a commercial programmer with the ultimate frustration of a life spent writing invisible software code. + + + + + Nie byłoby potrzeby zachowania przejrzystości kodu, ani zajmowania się problemami pomijanymi przez innych. + + + There would have been no sense of clarity, no urgency to address a problem others weren't addressing. + + + + + Co ważniejsze, nie byłoby też uzasadnionej złości i emocji, które wkrótce stały się siłą napędową jego działalności, na podobieństwo ideologii politycznej lub wiary w zasady etyczne. + + + Most importantly, there would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. + + + + + "Tego dnia pojąłem i zdecydowałem, że istnieje coś, w czym nigdy nie będę mógł uczestniczyć" - twierdzi, mając przede wszystkim na myśli praktyki handlowania dla wygody osobistą wolnością, jak określa umowy NDA, oraz wspieranie takich etycznie podejrzanych działań przez powszechnie przyjęte wzorce kulturowe. + + + "From that day forward, I decided this was something I could never participate in," says Stallman, alluding to the practice of trading personal liberty for the sake of convenience-Stallman's description of the NDA bargain-as well as the overall culture that encouraged such ethically suspect deal-making in the first place. + + + + + "Postanowiłem, że nikt nigdy nie stanie się z mojej winy ofiarą takich poczynań, jakie mnie dotknęły". + + + "I decided never to make other people victims just like I had been a victim." + + + diff --git a/src/.svn/all-wcprops b/src/.svn/all-wcprops new file mode 100644 index 0000000..8af19c8 --- /dev/null +++ b/src/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 44 +/svnroot/align/!svn/ver/50/trunk/maligna/src +END diff --git a/src/.svn/entries b/src/.svn/entries new file mode 100644 index 0000000..f0af9ed --- /dev/null +++ b/src/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +net +dir + diff --git a/src/net/.svn/all-wcprops b/src/net/.svn/all-wcprops new file mode 100644 index 0000000..b4cc960 --- /dev/null +++ b/src/net/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 48 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net +END diff --git a/src/net/.svn/entries b/src/net/.svn/entries new file mode 100644 index 0000000..ec13823 --- /dev/null +++ b/src/net/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +sourceforge +dir + diff --git a/src/net/sourceforge/.svn/all-wcprops b/src/net/sourceforge/.svn/all-wcprops new file mode 100644 index 0000000..22b7101 --- /dev/null +++ b/src/net/sourceforge/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge +END diff --git a/src/net/sourceforge/.svn/entries b/src/net/sourceforge/.svn/entries new file mode 100644 index 0000000..549ba6e --- /dev/null +++ b/src/net/sourceforge/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +align +dir + diff --git a/src/net/sourceforge/align/.svn/all-wcprops b/src/net/sourceforge/align/.svn/all-wcprops new file mode 100644 index 0000000..6dcf643 --- /dev/null +++ b/src/net/sourceforge/align/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 66 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align +END +AlignTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 86 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/AlignTestSuite.java +END diff --git a/src/net/sourceforge/align/.svn/entries b/src/net/sourceforge/align/.svn/entries new file mode 100644 index 0000000..83008e4 --- /dev/null +++ b/src/net/sourceforge/align/.svn/entries @@ -0,0 +1,104 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + + + +() + +model +dir + +formatter +dir + +AlignTestSuite.java +file + + + + +2010-10-28T16:40:13.000000Z +91955de2399fa906636370eba50df4bc +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +872 + +matrix +dir + +progress +dir + +filter +dir + +comparator +dir + +calculator +dir + +parser +dir + +coretypes +dir + +ui +dir + +util +dir + diff --git a/src/net/sourceforge/align/.svn/text-base/AlignTestSuite.java.svn-base b/src/net/sourceforge/align/.svn/text-base/AlignTestSuite.java.svn-base new file mode 100644 index 0000000..3b77f63 --- /dev/null +++ b/src/net/sourceforge/align/.svn/text-base/AlignTestSuite.java.svn-base @@ -0,0 +1,28 @@ +package net.sourceforge.align; + +import net.sourceforge.align.calculator.CalculatorTestSuite; +import net.sourceforge.align.comparator.ComparatorTestSuite; +import net.sourceforge.align.coretypes.AlignmentTest; +import net.sourceforge.align.filter.FilterTestSuite; +import net.sourceforge.align.formatter.FormatterTestSuite; +import net.sourceforge.align.model.ModelTestSuite; +import net.sourceforge.align.parser.ParserTestSuite; +import net.sourceforge.align.util.UtilTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Represents test suite for the whole program. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlignmentTest.class, UtilTestSuite.class, + ParserTestSuite.class, FormatterTestSuite.class, + FilterTestSuite.class, ComparatorTestSuite.class, + ModelTestSuite.class, CalculatorTestSuite.class +}) +public class AlignTestSuite { + +} diff --git a/src/net/sourceforge/align/AlignTestSuite.java b/src/net/sourceforge/align/AlignTestSuite.java new file mode 100755 index 0000000..3b77f63 --- /dev/null +++ b/src/net/sourceforge/align/AlignTestSuite.java @@ -0,0 +1,28 @@ +package net.sourceforge.align; + +import net.sourceforge.align.calculator.CalculatorTestSuite; +import net.sourceforge.align.comparator.ComparatorTestSuite; +import net.sourceforge.align.coretypes.AlignmentTest; +import net.sourceforge.align.filter.FilterTestSuite; +import net.sourceforge.align.formatter.FormatterTestSuite; +import net.sourceforge.align.model.ModelTestSuite; +import net.sourceforge.align.parser.ParserTestSuite; +import net.sourceforge.align.util.UtilTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Represents test suite for the whole program. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlignmentTest.class, UtilTestSuite.class, + ParserTestSuite.class, FormatterTestSuite.class, + FilterTestSuite.class, ComparatorTestSuite.class, + ModelTestSuite.class, CalculatorTestSuite.class +}) +public class AlignTestSuite { + +} diff --git a/src/net/sourceforge/align/calculator/.svn/all-wcprops b/src/net/sourceforge/align/calculator/.svn/all-wcprops new file mode 100644 index 0000000..12e2549 --- /dev/null +++ b/src/net/sourceforge/align/calculator/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 77 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/calculator +END +CalculatorMock.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/calculator/CalculatorMock.java +END +CalculatorTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 102 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/calculator/CalculatorTestSuite.java +END +Calculator.java +K 25 +svn:wc:ra_dav:version-url +V 93 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/calculator/Calculator.java +END diff --git a/src/net/sourceforge/align/calculator/.svn/entries b/src/net/sourceforge/align/calculator/.svn/entries new file mode 100644 index 0000000..5420133 --- /dev/null +++ b/src/net/sourceforge/align/calculator/.svn/entries @@ -0,0 +1,139 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/calculator +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Calculator.java +file + + + + +2010-11-01T18:10:46.000000Z +e3cb46247caf123f2eab0c33c317926b +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +863 + +CalculatorMock.java +file + + + + +2010-11-01T18:11:11.000000Z +5c0e88fb495fd842fd7644243b6b250d +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +488 + +CalculatorTestSuite.java +file + + + + +2010-11-01T18:11:40.000000Z +982e6a4e13f189c39fe07833793ded03 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +511 + +content +dir + +length +dir + +meta +dir + diff --git a/src/net/sourceforge/align/calculator/.svn/text-base/Calculator.java.svn-base b/src/net/sourceforge/align/calculator/.svn/text-base/Calculator.java.svn-base new file mode 100644 index 0000000..219eccd --- /dev/null +++ b/src/net/sourceforge/align/calculator/.svn/text-base/Calculator.java.svn-base @@ -0,0 +1,28 @@ +package net.sourceforge.align.calculator; + +import java.util.List; + +/** + *

Represents method of calculating probability of an alignment of given + * source segments to given target segments. + * It's the heart of alignment algorithm.

+ * + *

The actual implementation can calculate the result using just segment + * lengths (package length) or contents of the segments (package content).

+ * + * @author Jarek Lipski (loomchild) + */ +public interface Calculator { + + /** + * Calculates score (equal to -ln(probability)) of alignment of given + * source segment to given target segments. + * + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return result (-ln(probability)) of the alignment, >= 0 + */ + public float calculateScore(List sourceSegmentList, + List targetSegmentList); + +} diff --git a/src/net/sourceforge/align/calculator/.svn/text-base/CalculatorMock.java.svn-base b/src/net/sourceforge/align/calculator/.svn/text-base/CalculatorMock.java.svn-base new file mode 100644 index 0000000..ad167c7 --- /dev/null +++ b/src/net/sourceforge/align/calculator/.svn/text-base/CalculatorMock.java.svn-base @@ -0,0 +1,24 @@ +package net.sourceforge.align.calculator; + +import java.util.List; + + +/** + * Calculator mock returning always predefined score, na matter what segments + * are passed in. Used for testing. + * + * @author Jarek Lipski (loomchild) + */ +public class CalculatorMock implements Calculator { + + private float score; + + public CalculatorMock(float score) { + this.score = score; + } + + public float calculateScore(List sourceSegmentList, List targetSegmentList) { + return score; + } + +} diff --git a/src/net/sourceforge/align/calculator/.svn/text-base/CalculatorTestSuite.java.svn-base b/src/net/sourceforge/align/calculator/.svn/text-base/CalculatorTestSuite.java.svn-base new file mode 100644 index 0000000..ae9cf72 --- /dev/null +++ b/src/net/sourceforge/align/calculator/.svn/text-base/CalculatorTestSuite.java.svn-base @@ -0,0 +1,20 @@ +package net.sourceforge.align.calculator; + +import net.sourceforge.align.calculator.length.PoissonDistributionCalculatorTest; +import net.sourceforge.align.calculator.meta.CompositeCalculatorTest; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Unit test suite containing all the tests in this package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + CompositeCalculatorTest.class, + PoissonDistributionCalculatorTest.class +}) +public class CalculatorTestSuite { + +} diff --git a/src/net/sourceforge/align/calculator/Calculator.java b/src/net/sourceforge/align/calculator/Calculator.java new file mode 100755 index 0000000..219eccd --- /dev/null +++ b/src/net/sourceforge/align/calculator/Calculator.java @@ -0,0 +1,28 @@ +package net.sourceforge.align.calculator; + +import java.util.List; + +/** + *

Represents method of calculating probability of an alignment of given + * source segments to given target segments. + * It's the heart of alignment algorithm.

+ * + *

The actual implementation can calculate the result using just segment + * lengths (package length) or contents of the segments (package content).

+ * + * @author Jarek Lipski (loomchild) + */ +public interface Calculator { + + /** + * Calculates score (equal to -ln(probability)) of alignment of given + * source segment to given target segments. + * + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return result (-ln(probability)) of the alignment, >= 0 + */ + public float calculateScore(List sourceSegmentList, + List targetSegmentList); + +} diff --git a/src/net/sourceforge/align/calculator/CalculatorMock.java b/src/net/sourceforge/align/calculator/CalculatorMock.java new file mode 100755 index 0000000..ad167c7 --- /dev/null +++ b/src/net/sourceforge/align/calculator/CalculatorMock.java @@ -0,0 +1,24 @@ +package net.sourceforge.align.calculator; + +import java.util.List; + + +/** + * Calculator mock returning always predefined score, na matter what segments + * are passed in. Used for testing. + * + * @author Jarek Lipski (loomchild) + */ +public class CalculatorMock implements Calculator { + + private float score; + + public CalculatorMock(float score) { + this.score = score; + } + + public float calculateScore(List sourceSegmentList, List targetSegmentList) { + return score; + } + +} diff --git a/src/net/sourceforge/align/calculator/CalculatorTestSuite.java b/src/net/sourceforge/align/calculator/CalculatorTestSuite.java new file mode 100755 index 0000000..ae9cf72 --- /dev/null +++ b/src/net/sourceforge/align/calculator/CalculatorTestSuite.java @@ -0,0 +1,20 @@ +package net.sourceforge.align.calculator; + +import net.sourceforge.align.calculator.length.PoissonDistributionCalculatorTest; +import net.sourceforge.align.calculator.meta.CompositeCalculatorTest; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Unit test suite containing all the tests in this package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + CompositeCalculatorTest.class, + PoissonDistributionCalculatorTest.class +}) +public class CalculatorTestSuite { + +} diff --git a/src/net/sourceforge/align/calculator/content/.svn/all-wcprops b/src/net/sourceforge/align/calculator/content/.svn/all-wcprops new file mode 100644 index 0000000..cce24fd --- /dev/null +++ b/src/net/sourceforge/align/calculator/content/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/calculator/content +END +OracleCalculator.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/calculator/content/OracleCalculator.java +END +TranslationCalculator.java +K 25 +svn:wc:ra_dav:version-url +V 112 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/calculator/content/TranslationCalculator.java +END diff --git a/src/net/sourceforge/align/calculator/content/.svn/entries b/src/net/sourceforge/align/calculator/content/.svn/entries new file mode 100644 index 0000000..bd09ee9 --- /dev/null +++ b/src/net/sourceforge/align/calculator/content/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/calculator/content +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +OracleCalculator.java +file + + + + +2010-11-01T18:22:33.000000Z +cf0a64c198b5134c92975811f997fd96 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2536 + +TranslationCalculator.java +file +53 + + + +2011-02-15T18:36:18.000000Z +fd7080d81f6de87f6f9e7ea8849e729c +2011-02-16T09:44:41.906134Z +53 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +9795 + diff --git a/src/net/sourceforge/align/calculator/content/.svn/prop-base/TranslationCalculator.java.svn-base b/src/net/sourceforge/align/calculator/content/.svn/prop-base/TranslationCalculator.java.svn-base new file mode 100644 index 0000000..3160658 --- /dev/null +++ b/src/net/sourceforge/align/calculator/content/.svn/prop-base/TranslationCalculator.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mergeinfo +V 0 + +END diff --git a/src/net/sourceforge/align/calculator/content/.svn/text-base/OracleCalculator.java.svn-base b/src/net/sourceforge/align/calculator/content/.svn/text-base/OracleCalculator.java.svn-base new file mode 100644 index 0000000..a68989e --- /dev/null +++ b/src/net/sourceforge/align/calculator/content/.svn/text-base/OracleCalculator.java.svn-base @@ -0,0 +1,84 @@ +package net.sourceforge.align.calculator.content; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents calculator using reference alignments to calculate score. + * Returns successScore if measured alignment is present in reference + * alignments, failureScore otherwise. + * + * @author loomchild + */ +public class OracleCalculator implements Calculator { + + public static final float DEFAULT_FAILURE_SCORE = Float.POSITIVE_INFINITY; + + public static final float DEFAULT_SUCCESS_SCORE = 0.0f; + + private Set alignmentSet; + + private float successScore; + + private float failureScore; + + /** + * Creates oracle calculator. + * + * @param alignmentCollection reference alignment + * @param failureScore score returned when calculated alignment is not + * in the reference alignment + * @param successScore score returned when calculated alignment is in + * the reference alignment + */ + public OracleCalculator(Collection alignmentCollection, + float failureScore, float successScore) { + this.alignmentSet = new HashSet(alignmentCollection); + this.failureScore = failureScore; + this.successScore = successScore; + } + + /** + * Creates oracle calculator. Success score is equal to + * {@link #DEFAULT_SUCCESS_SCORE}. + * + * @param alignmentCollection reference alignment + * @param failureScore score returned when calculated alignment is not + * in the reference alignment + */ + public OracleCalculator(Collection alignmentCollection, + float failureScore) { + this(alignmentCollection, failureScore, DEFAULT_SUCCESS_SCORE); + } + + /** + * Creates oracle calculator. Success score is equal to + * {@link #DEFAULT_SUCCESS_SCORE} and failure score is equal to + * {@value #DEFAULT_FAILURE_SCORE}. + * + * @param alignmentCollection reference alignment + */ + public OracleCalculator(Collection alignmentCollection) { + this(alignmentCollection, DEFAULT_FAILURE_SCORE, DEFAULT_SUCCESS_SCORE); + } + + /** + * Returns successScore if measured alignment is present in reference + * alignments, failureScore otherwise. + */ + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + Alignment alignment = new Alignment(sourceSegmentList, targetSegmentList); + if (alignmentSet.contains(alignment)) { + return successScore; + } else { + return failureScore; + } + } + +} diff --git a/src/net/sourceforge/align/calculator/content/.svn/text-base/TranslationCalculator.java.svn-base b/src/net/sourceforge/align/calculator/content/.svn/text-base/TranslationCalculator.java.svn-base new file mode 100644 index 0000000..e3531a6 --- /dev/null +++ b/src/net/sourceforge/align/calculator/content/.svn/text-base/TranslationCalculator.java.svn-base @@ -0,0 +1,264 @@ +package net.sourceforge.align.calculator.content; + +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.model.language.LanguageModel; +import net.sourceforge.align.model.language.LanguageModelUtil; +import net.sourceforge.align.model.translation.SourceData; +import net.sourceforge.align.model.translation.TranslationModel; +import net.sourceforge.align.model.translation.TranslationModelUtil; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; +import net.sourceforge.align.util.Util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + *

Represents calculator calculating probability of concatenation of target + * segments being translation of concatenation of source segments.

+ * + *

To do this uses given translation and language models or trains + * them using {@link TranslationModelUtil} and {@link LanguageModelUtil} + * with given reference corpus.

+ * + * @see "Machine Translation: an Introductory Guide, D. Arnold, L. Balkan, + * S. Meijer, R. Lee Humphreys, L. Sadler" + * + * @author loomchild + */ +public class TranslationCalculator implements Calculator { + + private static Log log = LogFactory.getLog(TranslationCalculator.class); + + public static final float MINIMUM_TRANSLATION_PROBABILITY = 1e-38f; + + private Vocabulary sourceVocabulary; + + private Vocabulary targetVocabulary; + + private LanguageModel sourceLanguageModel; + + private LanguageModel targetLanguageModel; + + private TranslationModel translationModel; + + private SplitAlgorithm splitAlgorithm; + + /** + * Creates translation calculator. + * + * @param sourceVocabulary vocabulary mapping source words to identifiers + * @param targetVocabulary vocabulary mapping target words to identifiers + * @param sourceLanguageModel source language model + * @param targetLanguageModel target language model + * @param translationModel translation model from source to target + * @param splitAlgorithm algorithm used to split segments into words + */ + public TranslationCalculator( + Vocabulary sourceVocabulary, Vocabulary targetVocabulary, + LanguageModel sourceLanguageModel, LanguageModel targetLanguageModel, + TranslationModel translationModel, SplitAlgorithm splitAlgorithm) { + this.splitAlgorithm = splitAlgorithm; + this.sourceVocabulary = sourceVocabulary; + this.targetVocabulary = targetVocabulary; + this.sourceLanguageModel = sourceLanguageModel; + this.targetLanguageModel = targetLanguageModel; + this.translationModel = translationModel; + } + + /** + * Creates translation calculator with split algorithm equal to + * {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + * + * @param sourceVocabulary vocabulary mapping source words to identifiers + * @param targetVocabulary vocabulary mapping target words to identifiers + * @param sourceLanguageModel source language model + * @param targetLanguageModel target language model + * @param translationModel translation model from source to target + */ + public TranslationCalculator( + Vocabulary sourceVocabulary, Vocabulary targetVocabulary, + LanguageModel sourceLanguageModel, LanguageModel targetLanguageModel, + TranslationModel translationModel) { + this(sourceVocabulary, targetVocabulary, sourceLanguageModel, + targetLanguageModel, translationModel, + VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM); + } + + /** + * Creates translation calculator. Trains translation and language models + * based on given reference alignment list. Also creates its own + * vocabulary based on all the words in reference alignment list. + * + * @param alignmentList reference corpus + * @param trainIterationCount number of translation model training iterations + * @param splitAlgorithm algorithm used to split segments into words + */ + public TranslationCalculator(List alignmentList, + int trainIterationCount, SplitAlgorithm splitAlgorithm) { + if (alignmentList.size() == 0) { + throw new IllegalArgumentException("Reference corpus cannot be empty"); + } + + this.splitAlgorithm = splitAlgorithm; + + sourceVocabulary = new Vocabulary(); + targetVocabulary = new Vocabulary(); + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + + VocabularyUtil.tokenize(splitAlgorithm, alignmentList, sourceVocabulary, + targetVocabulary, sourceWidList, targetWidList); + + sourceLanguageModel = + LanguageModelUtil.train(sourceWidList); + targetLanguageModel = + LanguageModelUtil.train(targetWidList); + + translationModel = + TranslationModelUtil.train( + trainIterationCount, sourceWidList, targetWidList); + + if (log.isTraceEnabled()) { + StringWriter writer = new StringWriter(); + translationModel.format(writer, sourceVocabulary, targetVocabulary); + log.trace(writer.toString()); + } + } + + /** + * Calls {@link #TranslationCalculator(List, int, SplitAlgorithm)} + * with split algorithm equal to + * {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + * + * @param alignmentList reference corpus + * @param trainIterationCount number of translation model training iterations + */ + public TranslationCalculator(List alignmentList, + int trainIterationCount) { + this(alignmentList, trainIterationCount, VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM); + } + + /** + * Calls {@link #TranslationCalculator(List, int, SplitAlgorithm)} + * with translation model training iteration count equal to + * {@link TranslationModelUtil#DEFAULT_TRAIN_ITERATION_COUNT} and + * split algorithm equal to + * {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + * + * @param alignmentList reference corpus + */ + public TranslationCalculator(List alignmentList) { + this(alignmentList, TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT); + } + + /** + * Calculates translation score. First it tokenizes source and target + * segment and replaces the words with identifiers from {@link Vocabulary}. + * If both segment lists are empty returns zero, if only one of them is + * empty returns language score of it using + * {@link #calculateLanguageScore(List, LanguageModel)}. + * If both are not empty then returns translation score + * using {@link #calculateTranslationScore(List, List, TranslationModel)} + * and adds language score of source segments to it. + * + * @param sourceSegmentList list of source segmnets + * @param targetSegmentList list of target segments + * @return translation score + */ + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + List sourceWidList = VocabularyUtil.tokenize(splitAlgorithm, + sourceSegmentList, sourceVocabulary); + List targetWidList = VocabularyUtil.tokenize(splitAlgorithm, + targetSegmentList, targetVocabulary); + float score; + if (sourceWidList.size() == 0 && targetWidList.size() == 0) { + score = 0.0f; + } else if (sourceWidList.size() == 0) { + score = calculateLanguageScore(targetWidList, targetLanguageModel); + } else { + score = calculateLanguageScore(sourceWidList, sourceLanguageModel); + if (targetWidList.size() > 0) { + List newSourceWidList = + new ArrayList(sourceWidList); + newSourceWidList.add(Vocabulary.NULL_WID); + score += calculateTranslationScore(newSourceWidList, + targetWidList, translationModel); + } + } + //score = (float)Math.pow(score, 1.0 / (double)sourceWidList.size()) / 10.0f; + assert score >= 0 : score; + return score; + } + + /** + * Calculates probability (converted to score equal to -ln(probability)) + * of given segment (represented as word id list) + * is correct in according to given language model. In other words + * calculates probability of given text being correct in given language. + * + * @param widList + * @param languageModel + * @return + */ + private float calculateLanguageScore(List widList, + LanguageModel languageModel) { + assert widList.size() > 0; + float score = 0.0f; + for (Integer wid : widList) { + float wordProbability; + if (wid != null) { + wordProbability = languageModel.getWordProbability(wid); + } else { + wordProbability = languageModel.getSingletonWordProbability(); + } + score += Util.toScore(wordProbability); + } + assert score >= 0 : score; + return score; + } + + /** + * Calculates probability (converted to score equal to -ln(probability)) + * of given target segments (represented as word id list) being a + * translation of given source segments according to given translation + * model. + * Cannot return probability less than constant + * {@link #MINIMUM_TRANSLATION_PROBABILITY}. + * + * @param sourceWidList + * @param targetWidList + * @param translationModel + * @return + */ + private float calculateTranslationScore(List sourceWidList, + List targetWidList, TranslationModel translationModel) { + assert targetWidList.size() > 0; + float score = -(float)Math.log(1.0 / sourceWidList.size()) * + targetWidList.size(); + for (Integer targetWid : targetWidList) { + float translationProbability = 0.0f; + if (targetWid != null) { + for (Integer sourceWid : sourceWidList) { + if (sourceWid != null) { + SourceData sourceData = translationModel.get(sourceWid); + translationProbability += + sourceData.getTranslationProbability(targetWid); + } + } + } + translationProbability = Math.max(translationProbability, + MINIMUM_TRANSLATION_PROBABILITY); + score += -(float)Math.log(translationProbability); + } + return score; + } + +} diff --git a/src/net/sourceforge/align/calculator/content/OracleCalculator.java b/src/net/sourceforge/align/calculator/content/OracleCalculator.java new file mode 100755 index 0000000..a68989e --- /dev/null +++ b/src/net/sourceforge/align/calculator/content/OracleCalculator.java @@ -0,0 +1,84 @@ +package net.sourceforge.align.calculator.content; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents calculator using reference alignments to calculate score. + * Returns successScore if measured alignment is present in reference + * alignments, failureScore otherwise. + * + * @author loomchild + */ +public class OracleCalculator implements Calculator { + + public static final float DEFAULT_FAILURE_SCORE = Float.POSITIVE_INFINITY; + + public static final float DEFAULT_SUCCESS_SCORE = 0.0f; + + private Set alignmentSet; + + private float successScore; + + private float failureScore; + + /** + * Creates oracle calculator. + * + * @param alignmentCollection reference alignment + * @param failureScore score returned when calculated alignment is not + * in the reference alignment + * @param successScore score returned when calculated alignment is in + * the reference alignment + */ + public OracleCalculator(Collection alignmentCollection, + float failureScore, float successScore) { + this.alignmentSet = new HashSet(alignmentCollection); + this.failureScore = failureScore; + this.successScore = successScore; + } + + /** + * Creates oracle calculator. Success score is equal to + * {@link #DEFAULT_SUCCESS_SCORE}. + * + * @param alignmentCollection reference alignment + * @param failureScore score returned when calculated alignment is not + * in the reference alignment + */ + public OracleCalculator(Collection alignmentCollection, + float failureScore) { + this(alignmentCollection, failureScore, DEFAULT_SUCCESS_SCORE); + } + + /** + * Creates oracle calculator. Success score is equal to + * {@link #DEFAULT_SUCCESS_SCORE} and failure score is equal to + * {@value #DEFAULT_FAILURE_SCORE}. + * + * @param alignmentCollection reference alignment + */ + public OracleCalculator(Collection alignmentCollection) { + this(alignmentCollection, DEFAULT_FAILURE_SCORE, DEFAULT_SUCCESS_SCORE); + } + + /** + * Returns successScore if measured alignment is present in reference + * alignments, failureScore otherwise. + */ + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + Alignment alignment = new Alignment(sourceSegmentList, targetSegmentList); + if (alignmentSet.contains(alignment)) { + return successScore; + } else { + return failureScore; + } + } + +} diff --git a/src/net/sourceforge/align/calculator/content/TranslationCalculator.java b/src/net/sourceforge/align/calculator/content/TranslationCalculator.java new file mode 100755 index 0000000..e3531a6 --- /dev/null +++ b/src/net/sourceforge/align/calculator/content/TranslationCalculator.java @@ -0,0 +1,264 @@ +package net.sourceforge.align.calculator.content; + +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.model.language.LanguageModel; +import net.sourceforge.align.model.language.LanguageModelUtil; +import net.sourceforge.align.model.translation.SourceData; +import net.sourceforge.align.model.translation.TranslationModel; +import net.sourceforge.align.model.translation.TranslationModelUtil; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; +import net.sourceforge.align.util.Util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + *

Represents calculator calculating probability of concatenation of target + * segments being translation of concatenation of source segments.

+ * + *

To do this uses given translation and language models or trains + * them using {@link TranslationModelUtil} and {@link LanguageModelUtil} + * with given reference corpus.

+ * + * @see "Machine Translation: an Introductory Guide, D. Arnold, L. Balkan, + * S. Meijer, R. Lee Humphreys, L. Sadler" + * + * @author loomchild + */ +public class TranslationCalculator implements Calculator { + + private static Log log = LogFactory.getLog(TranslationCalculator.class); + + public static final float MINIMUM_TRANSLATION_PROBABILITY = 1e-38f; + + private Vocabulary sourceVocabulary; + + private Vocabulary targetVocabulary; + + private LanguageModel sourceLanguageModel; + + private LanguageModel targetLanguageModel; + + private TranslationModel translationModel; + + private SplitAlgorithm splitAlgorithm; + + /** + * Creates translation calculator. + * + * @param sourceVocabulary vocabulary mapping source words to identifiers + * @param targetVocabulary vocabulary mapping target words to identifiers + * @param sourceLanguageModel source language model + * @param targetLanguageModel target language model + * @param translationModel translation model from source to target + * @param splitAlgorithm algorithm used to split segments into words + */ + public TranslationCalculator( + Vocabulary sourceVocabulary, Vocabulary targetVocabulary, + LanguageModel sourceLanguageModel, LanguageModel targetLanguageModel, + TranslationModel translationModel, SplitAlgorithm splitAlgorithm) { + this.splitAlgorithm = splitAlgorithm; + this.sourceVocabulary = sourceVocabulary; + this.targetVocabulary = targetVocabulary; + this.sourceLanguageModel = sourceLanguageModel; + this.targetLanguageModel = targetLanguageModel; + this.translationModel = translationModel; + } + + /** + * Creates translation calculator with split algorithm equal to + * {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + * + * @param sourceVocabulary vocabulary mapping source words to identifiers + * @param targetVocabulary vocabulary mapping target words to identifiers + * @param sourceLanguageModel source language model + * @param targetLanguageModel target language model + * @param translationModel translation model from source to target + */ + public TranslationCalculator( + Vocabulary sourceVocabulary, Vocabulary targetVocabulary, + LanguageModel sourceLanguageModel, LanguageModel targetLanguageModel, + TranslationModel translationModel) { + this(sourceVocabulary, targetVocabulary, sourceLanguageModel, + targetLanguageModel, translationModel, + VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM); + } + + /** + * Creates translation calculator. Trains translation and language models + * based on given reference alignment list. Also creates its own + * vocabulary based on all the words in reference alignment list. + * + * @param alignmentList reference corpus + * @param trainIterationCount number of translation model training iterations + * @param splitAlgorithm algorithm used to split segments into words + */ + public TranslationCalculator(List alignmentList, + int trainIterationCount, SplitAlgorithm splitAlgorithm) { + if (alignmentList.size() == 0) { + throw new IllegalArgumentException("Reference corpus cannot be empty"); + } + + this.splitAlgorithm = splitAlgorithm; + + sourceVocabulary = new Vocabulary(); + targetVocabulary = new Vocabulary(); + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + + VocabularyUtil.tokenize(splitAlgorithm, alignmentList, sourceVocabulary, + targetVocabulary, sourceWidList, targetWidList); + + sourceLanguageModel = + LanguageModelUtil.train(sourceWidList); + targetLanguageModel = + LanguageModelUtil.train(targetWidList); + + translationModel = + TranslationModelUtil.train( + trainIterationCount, sourceWidList, targetWidList); + + if (log.isTraceEnabled()) { + StringWriter writer = new StringWriter(); + translationModel.format(writer, sourceVocabulary, targetVocabulary); + log.trace(writer.toString()); + } + } + + /** + * Calls {@link #TranslationCalculator(List, int, SplitAlgorithm)} + * with split algorithm equal to + * {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + * + * @param alignmentList reference corpus + * @param trainIterationCount number of translation model training iterations + */ + public TranslationCalculator(List alignmentList, + int trainIterationCount) { + this(alignmentList, trainIterationCount, VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM); + } + + /** + * Calls {@link #TranslationCalculator(List, int, SplitAlgorithm)} + * with translation model training iteration count equal to + * {@link TranslationModelUtil#DEFAULT_TRAIN_ITERATION_COUNT} and + * split algorithm equal to + * {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + * + * @param alignmentList reference corpus + */ + public TranslationCalculator(List alignmentList) { + this(alignmentList, TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT); + } + + /** + * Calculates translation score. First it tokenizes source and target + * segment and replaces the words with identifiers from {@link Vocabulary}. + * If both segment lists are empty returns zero, if only one of them is + * empty returns language score of it using + * {@link #calculateLanguageScore(List, LanguageModel)}. + * If both are not empty then returns translation score + * using {@link #calculateTranslationScore(List, List, TranslationModel)} + * and adds language score of source segments to it. + * + * @param sourceSegmentList list of source segmnets + * @param targetSegmentList list of target segments + * @return translation score + */ + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + List sourceWidList = VocabularyUtil.tokenize(splitAlgorithm, + sourceSegmentList, sourceVocabulary); + List targetWidList = VocabularyUtil.tokenize(splitAlgorithm, + targetSegmentList, targetVocabulary); + float score; + if (sourceWidList.size() == 0 && targetWidList.size() == 0) { + score = 0.0f; + } else if (sourceWidList.size() == 0) { + score = calculateLanguageScore(targetWidList, targetLanguageModel); + } else { + score = calculateLanguageScore(sourceWidList, sourceLanguageModel); + if (targetWidList.size() > 0) { + List newSourceWidList = + new ArrayList(sourceWidList); + newSourceWidList.add(Vocabulary.NULL_WID); + score += calculateTranslationScore(newSourceWidList, + targetWidList, translationModel); + } + } + //score = (float)Math.pow(score, 1.0 / (double)sourceWidList.size()) / 10.0f; + assert score >= 0 : score; + return score; + } + + /** + * Calculates probability (converted to score equal to -ln(probability)) + * of given segment (represented as word id list) + * is correct in according to given language model. In other words + * calculates probability of given text being correct in given language. + * + * @param widList + * @param languageModel + * @return + */ + private float calculateLanguageScore(List widList, + LanguageModel languageModel) { + assert widList.size() > 0; + float score = 0.0f; + for (Integer wid : widList) { + float wordProbability; + if (wid != null) { + wordProbability = languageModel.getWordProbability(wid); + } else { + wordProbability = languageModel.getSingletonWordProbability(); + } + score += Util.toScore(wordProbability); + } + assert score >= 0 : score; + return score; + } + + /** + * Calculates probability (converted to score equal to -ln(probability)) + * of given target segments (represented as word id list) being a + * translation of given source segments according to given translation + * model. + * Cannot return probability less than constant + * {@link #MINIMUM_TRANSLATION_PROBABILITY}. + * + * @param sourceWidList + * @param targetWidList + * @param translationModel + * @return + */ + private float calculateTranslationScore(List sourceWidList, + List targetWidList, TranslationModel translationModel) { + assert targetWidList.size() > 0; + float score = -(float)Math.log(1.0 / sourceWidList.size()) * + targetWidList.size(); + for (Integer targetWid : targetWidList) { + float translationProbability = 0.0f; + if (targetWid != null) { + for (Integer sourceWid : sourceWidList) { + if (sourceWid != null) { + SourceData sourceData = translationModel.get(sourceWid); + translationProbability += + sourceData.getTranslationProbability(targetWid); + } + } + } + translationProbability = Math.max(translationProbability, + MINIMUM_TRANSLATION_PROBABILITY); + score += -(float)Math.log(translationProbability); + } + return score; + } + +} diff --git a/src/net/sourceforge/align/calculator/length/.svn/all-wcprops b/src/net/sourceforge/align/calculator/length/.svn/all-wcprops new file mode 100644 index 0000000..306873e --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 84 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/calculator/length +END +PoissonDistributionCalculator.java +K 25 +svn:wc:ra_dav:version-url +V 119 +/svnroot/align/!svn/ver/43/trunk/maligna/src/net/sourceforge/align/calculator/length/PoissonDistributionCalculator.java +END +NormalDistributionCalculator.java +K 25 +svn:wc:ra_dav:version-url +V 118 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/calculator/length/NormalDistributionCalculator.java +END +LengthCalculator.java +K 25 +svn:wc:ra_dav:version-url +V 106 +/svnroot/align/!svn/ver/43/trunk/maligna/src/net/sourceforge/align/calculator/length/LengthCalculator.java +END +PoissonDistributionCalculatorTest.java +K 25 +svn:wc:ra_dav:version-url +V 123 +/svnroot/align/!svn/ver/43/trunk/maligna/src/net/sourceforge/align/calculator/length/PoissonDistributionCalculatorTest.java +END diff --git a/src/net/sourceforge/align/calculator/length/.svn/entries b/src/net/sourceforge/align/calculator/length/.svn/entries new file mode 100644 index 0000000..dd170de --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/.svn/entries @@ -0,0 +1,167 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/calculator/length +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +LengthCalculator.java +file + + + + +2010-11-03T18:39:43.000000Z +b4aa75c7ea155934447e0c64cc26e461 +2010-11-04T13:51:51.058455Z +43 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +2543 + +NormalDistributionCalculator.java +file + + + + +2010-11-11T10:07:48.000000Z +144958d5c3bffc605f2f7465f3cb1473 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +2649 + +PoissonDistributionCalculator.java +file + + + + +2010-11-04T08:49:00.000000Z +b61800ee49222ca708859485ed9ff831 +2010-11-04T13:51:51.058455Z +43 +jarekl + + + + + + + + + + + + + + + + + + + + + +4945 + +PoissonDistributionCalculatorTest.java +file + + + + +2010-11-03T18:30:57.000000Z +84cec2f46b7bd9fae9f1c70e892e8fa5 +2010-11-04T13:51:51.058455Z +43 +jarekl + + + + + + + + + + + + + + + + + + + + + +1507 + +counter +dir + diff --git a/src/net/sourceforge/align/calculator/length/.svn/prop-base/LengthCalculator.java.svn-base b/src/net/sourceforge/align/calculator/length/.svn/prop-base/LengthCalculator.java.svn-base new file mode 100644 index 0000000..3160658 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/.svn/prop-base/LengthCalculator.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mergeinfo +V 0 + +END diff --git a/src/net/sourceforge/align/calculator/length/.svn/text-base/LengthCalculator.java.svn-base b/src/net/sourceforge/align/calculator/length/.svn/text-base/LengthCalculator.java.svn-base new file mode 100644 index 0000000..3055970 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/.svn/text-base/LengthCalculator.java.svn-base @@ -0,0 +1,84 @@ +package net.sourceforge.align.calculator.length; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.counter.Counter; + + +/** + * Represents calculator that computes alignment probability based only on + * segment length. Implements part of the {@link Calculator} functionality + * and provides utility functions to inheriting concrete length-based + * calculators. + * + * @author loomchild + */ +public abstract class LengthCalculator implements Calculator { + + private Counter counter; + + /** + * Creates a calculator. + * @param counter segment length counter (for example character count, + * word count) + */ + public LengthCalculator(Counter counter) { + this.counter = counter; + } + + /** + * Calculates alignment score first by computing lengths of all the segments + * and later passing the results and control to the subclasses to do + * the actual score calculation. + */ + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + List sourceLengthList = calculateLengthList(sourceSegmentList); + List targetLengthList = calculateLengthList(targetSegmentList); + return calculateLengthScore(sourceLengthList, targetLengthList); + } + + /** + * Calculates and returns lengths of subsequent segments. + * @param segmentList segment list + * @return list of lengths of source segments + */ + protected List calculateLengthList(List segmentList) { + List lengthList = new ArrayList(); + for (String segment : segmentList) { + int length = counter.calculateLength(segment); + if (length > 0) { + lengthList.add(length); + } + } + return lengthList; + } + + /** + * Utility function to calculate total length of the segments. + * Returns sum of the lengths on the input list. Used by subclasses. + * + * @param lengthList list containing lengths + * @return sum of lengths on the list + */ + protected int calculateTotalLength(List lengthList) { + int totalLength = 0; + for (int length : lengthList) { + totalLength += length; + } + return totalLength; + } + + /** + * Abstract method implemented by subclasses to compute the actual score. + * + * @param sourceLengthList lengths of source segments + * @param targetLengthList lengths of target segments + * @return source to target segments alignment score, >= 0 + */ + protected abstract float calculateLengthScore(List sourceLengthList, + List targetLengthList); + +} diff --git a/src/net/sourceforge/align/calculator/length/.svn/text-base/NormalDistributionCalculator.java.svn-base b/src/net/sourceforge/align/calculator/length/.svn/text-base/NormalDistributionCalculator.java.svn-base new file mode 100644 index 0000000..60628bb --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/.svn/text-base/NormalDistributionCalculator.java.svn-base @@ -0,0 +1,89 @@ +package net.sourceforge.align.calculator.length; + +import java.util.List; + +import net.sourceforge.align.calculator.length.counter.Counter; + + +/** + * Represents calculator computing alignment score assuming that + * segment lengths have normal distribution with given constant parameters. + * + * TODO: describe distribution parameters. + * + * @see "A Program for Aligning Sentences in Bilingual Corpora, + * William A. Gale, Kenneth W. Church" + * + * @see Normal Distribution + * + * @author loomchild + */ +public class NormalDistributionCalculator extends + LengthCalculator { + + public static final float PARAMETER_C = 1.0f; + + public static final float PARAMETER_S_SQUARE = 6.8f; + + /** + * Creates calculator. + * @param counter segment length counter + */ + public NormalDistributionCalculator(Counter counter) { + super(counter); + } + + /** + * Calculates alignment score. + */ + protected float calculateLengthScore(List sourceLengthList, + List targetLengthList) { + int sourceSegmentLength = calculateTotalLength(sourceLengthList); + int targetSegmentLength = calculateTotalLength(targetLengthList); + return calculateScore(sourceSegmentLength, targetSegmentLength); + } + + /** + * Calculates probability of target segment of given length being + * translation of source segment with given length. If both length are + * equal to zero returns zero. + * + * @param sourceSegmentLength + * @param targetSegmentLength + * @return + */ + private float calculateScore(int sourceSegmentLength, + int targetSegmentLength) { + if (sourceSegmentLength == 0 && targetSegmentLength == 0) { + return 0.0f; + } else { + double mean = (sourceSegmentLength + targetSegmentLength / + PARAMETER_C) / 2.0; + double z = Math.abs((PARAMETER_C * sourceSegmentLength - + targetSegmentLength) / Math.sqrt(PARAMETER_S_SQUARE * mean)); + double pd = 2.0 * (1.0 - cumulativeNormalDistribution(z)); + // Needed because sometimes returns zero + pd = Math.max(pd, Float.MIN_VALUE); + assert pd > 0.0; + return (float)-Math.log(pd); + } + } + + /** + * Calculates value of normal distribution for given z position (z >= 0). + * + * @see "Handbook of Mathematical Functions, Abrahamowitz, Stegun" + * @param z random variable + * @return random variable distribution value + */ + private double cumulativeNormalDistribution(double z) { + assert z >= 0.0; + double t = 1.0 / (1.0 + 0.2316419 * z); + double pd = 1.0 - 0.3989423 * Math.exp(-z * z / 2.0) * + ((((1.330274429 * t - 1.821255978) * t + + 1.781477937) * t - 0.356563782) * t + 0.319381530) * t; + return pd; + } + + +} diff --git a/src/net/sourceforge/align/calculator/length/.svn/text-base/PoissonDistributionCalculator.java.svn-base b/src/net/sourceforge/align/calculator/length/.svn/text-base/PoissonDistributionCalculator.java.svn-base new file mode 100644 index 0000000..83f5173 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/.svn/text-base/PoissonDistributionCalculator.java.svn-base @@ -0,0 +1,153 @@ +package net.sourceforge.align.calculator.length; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.model.length.LengthModel; +import net.sourceforge.align.model.length.LengthModelUtil; + + +/** + * Represents length-base calculator that computes alignment score + * assuming that alignment lengths have Poisson distribution. + * Calculates length models (models based on frequency of occurrence of + * segment lengths) using training corpus (can be the same as the input corpus). + * + * @author loomchild + */ +public class PoissonDistributionCalculator + extends LengthCalculator { + + private LengthModel sourceLengthModel; + + private LengthModel targetLengthModel; + + private float meanLengthRatio; + + /** + * Creates calculator. Calculates source and target {@link LengthModel} + * using reference corpus (can be the same as actual corpus being aligned). + * + * @param counter length counter + * @param alignmentList reference alignment + */ + public PoissonDistributionCalculator(Counter counter, + List alignmentList) { + super(counter); + List sourceSegmentList = new ArrayList(); + List targetSegmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + sourceSegmentList.addAll(alignment.getSourceSegmentList()); + targetSegmentList.addAll(alignment.getTargetSegmentList()); + } + this.sourceLengthModel = trainLengthModel(sourceSegmentList); + this.targetLengthModel = trainLengthModel(targetSegmentList); + this.meanLengthRatio = targetLengthModel.getMeanLength() / + sourceLengthModel.getMeanLength(); + } + + /** + * Calculates length model of given segment list. + * @param segmentList + * @return + */ + private LengthModel trainLengthModel(List segmentList) { + List lengthList = calculateLengthList(segmentList); + LengthModel lengthModel = LengthModelUtil.train(lengthList); + return lengthModel; + } + + /** + * Calculates alignment score. If both input lists are empty returns zero. + * If only one of them is empty returns the other language score + * (probability of segment being part of language). If both are non-zero + * then returns translation score (probability of target segments being + * translations of source segments) added to language score of source + * segments. + */ + protected float calculateLengthScore(List sourceLengthList, + List targetLengthList) { + float score; + if (sourceLengthList.size() == 0 && targetLengthList.size() == 0) { + score = 0.0f; + } else if (sourceLengthList.size() == 0) { + score = calculateLanguageScore(targetLengthList, targetLengthModel); + } else { + score = calculateLanguageScore(sourceLengthList, sourceLengthModel); + if (targetLengthList.size() > 0) { + score += calculateTranslationScore(sourceLengthList, + targetLengthList); + } + } + assert score >= 0; + return score; + } + + /** + * Calculates the score (equal to -ln(probability)) of segments of given + * lengths being part of given language (occur in given length model). + * + * @param lengthList list of segment lengths + * @param lengthModel length model for a language + * @return score of length list matching with length model + */ + private float calculateLanguageScore(List lengthList, + LengthModel lengthModel) { + float score = 0.0f; + for (int length : lengthList) { + score += -Math.log(lengthModel.getLengthProbability(length)); + } + assert score >= 0; + return score; + } + + /** + * Calculates score of target segments of given lengths being translations + * of source segments of given lengths. + * + * @param sourceLengthList lengths of source segments + * @param targetLengthList lengths of target segments + * @return score + */ + private float calculateTranslationScore(List sourceLengthList, + List targetLengthList) { + int sourceTotalLength = calculateTotalLength(sourceLengthList); + int targetTotalLength = calculateTotalLength(targetLengthList); + float mean = sourceTotalLength * meanLengthRatio; + float score = poissonDistribution(mean, targetTotalLength); + assert score >= 0; + return score; + } + + /** + * Calculates value of a Poisson distribution function at given point (x). + * @param mean poisson distribution mean + * @param x x value + * @return y value + */ + static float poissonDistribution(float mean, int x) { + assert mean > 0; + return mean + -x * (float)Math.log(mean) + factorial(x); + } + + /** + * Returns logarithm from factorial of a given number ln(x!). + * @param x number + * @return ln(x!) + */ + static float factorial(int x) { + if (x < 0) { + throw new IllegalArgumentException("Cannot calculate factorial " + + "for a negative number: " + x + "."); + } else { + float y = 0; + for (int i = 2; i <= x; ++i) { + y += Math.log(i); + } + return y; + } + } + +} diff --git a/src/net/sourceforge/align/calculator/length/.svn/text-base/PoissonDistributionCalculatorTest.java.svn-base b/src/net/sourceforge/align/calculator/length/.svn/text-base/PoissonDistributionCalculatorTest.java.svn-base new file mode 100644 index 0000000..982eb27 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/.svn/text-base/PoissonDistributionCalculatorTest.java.svn-base @@ -0,0 +1,42 @@ +package net.sourceforge.align.calculator.length; + +import static net.sourceforge.align.calculator.length.PoissonDistributionCalculator.factorial; +import static net.sourceforge.align.calculator.length.PoissonDistributionCalculator.poissonDistribution; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Represents {@link PoissonDistributionCalculator} unit test. + * @author loomchild + */ +public class PoissonDistributionCalculatorTest { + + /** + * Tests factorial calculation by + * {@link PoissonDistributionCalculator#factorial(int)}. + */ + @Test + public void testFactorial() { + assertEquals(1.0f, Math.exp(factorial(1)), 0.01f); + assertEquals(2.0f, Math.exp(factorial(2)), 0.01f); + assertEquals(6.0f, Math.exp(factorial(3)), 0.01f); + assertEquals(24.0f, Math.exp(factorial(4)), 0.01f); + } + + /** + * Tests Poisson distribution points calculation by + * {@link PoissonDistributionCalculator#poissonDistribution(float, int)} + * using some manually calculated values. + */ + @Test + public void testPoissonDistribution() { + assertEquals(0.6065f, Math.exp(-poissonDistribution(0.5f, 0)), 0.0001f); + assertEquals(0.3679f, Math.exp(-poissonDistribution(1.0f, 0)), 0.0001f); + assertEquals(0.3679f, Math.exp(-poissonDistribution(1.0f, 1)), 0.0001f); + assertEquals(0.1839f, Math.exp(-poissonDistribution(1.0f, 2)), 0.0001f); + assertEquals(0.2707f, Math.exp(-poissonDistribution(2.0f, 1)), 0.0001f); + assertEquals(0.1805f, Math.exp(-poissonDistribution(2.0f, 3)), 0.0001f); + } + +} diff --git a/src/net/sourceforge/align/calculator/length/LengthCalculator.java b/src/net/sourceforge/align/calculator/length/LengthCalculator.java new file mode 100755 index 0000000..3055970 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/LengthCalculator.java @@ -0,0 +1,84 @@ +package net.sourceforge.align.calculator.length; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.counter.Counter; + + +/** + * Represents calculator that computes alignment probability based only on + * segment length. Implements part of the {@link Calculator} functionality + * and provides utility functions to inheriting concrete length-based + * calculators. + * + * @author loomchild + */ +public abstract class LengthCalculator implements Calculator { + + private Counter counter; + + /** + * Creates a calculator. + * @param counter segment length counter (for example character count, + * word count) + */ + public LengthCalculator(Counter counter) { + this.counter = counter; + } + + /** + * Calculates alignment score first by computing lengths of all the segments + * and later passing the results and control to the subclasses to do + * the actual score calculation. + */ + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + List sourceLengthList = calculateLengthList(sourceSegmentList); + List targetLengthList = calculateLengthList(targetSegmentList); + return calculateLengthScore(sourceLengthList, targetLengthList); + } + + /** + * Calculates and returns lengths of subsequent segments. + * @param segmentList segment list + * @return list of lengths of source segments + */ + protected List calculateLengthList(List segmentList) { + List lengthList = new ArrayList(); + for (String segment : segmentList) { + int length = counter.calculateLength(segment); + if (length > 0) { + lengthList.add(length); + } + } + return lengthList; + } + + /** + * Utility function to calculate total length of the segments. + * Returns sum of the lengths on the input list. Used by subclasses. + * + * @param lengthList list containing lengths + * @return sum of lengths on the list + */ + protected int calculateTotalLength(List lengthList) { + int totalLength = 0; + for (int length : lengthList) { + totalLength += length; + } + return totalLength; + } + + /** + * Abstract method implemented by subclasses to compute the actual score. + * + * @param sourceLengthList lengths of source segments + * @param targetLengthList lengths of target segments + * @return source to target segments alignment score, >= 0 + */ + protected abstract float calculateLengthScore(List sourceLengthList, + List targetLengthList); + +} diff --git a/src/net/sourceforge/align/calculator/length/NormalDistributionCalculator.java b/src/net/sourceforge/align/calculator/length/NormalDistributionCalculator.java new file mode 100755 index 0000000..60628bb --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/NormalDistributionCalculator.java @@ -0,0 +1,89 @@ +package net.sourceforge.align.calculator.length; + +import java.util.List; + +import net.sourceforge.align.calculator.length.counter.Counter; + + +/** + * Represents calculator computing alignment score assuming that + * segment lengths have normal distribution with given constant parameters. + * + * TODO: describe distribution parameters. + * + * @see "A Program for Aligning Sentences in Bilingual Corpora, + * William A. Gale, Kenneth W. Church" + * + * @see Normal Distribution + * + * @author loomchild + */ +public class NormalDistributionCalculator extends + LengthCalculator { + + public static final float PARAMETER_C = 1.0f; + + public static final float PARAMETER_S_SQUARE = 6.8f; + + /** + * Creates calculator. + * @param counter segment length counter + */ + public NormalDistributionCalculator(Counter counter) { + super(counter); + } + + /** + * Calculates alignment score. + */ + protected float calculateLengthScore(List sourceLengthList, + List targetLengthList) { + int sourceSegmentLength = calculateTotalLength(sourceLengthList); + int targetSegmentLength = calculateTotalLength(targetLengthList); + return calculateScore(sourceSegmentLength, targetSegmentLength); + } + + /** + * Calculates probability of target segment of given length being + * translation of source segment with given length. If both length are + * equal to zero returns zero. + * + * @param sourceSegmentLength + * @param targetSegmentLength + * @return + */ + private float calculateScore(int sourceSegmentLength, + int targetSegmentLength) { + if (sourceSegmentLength == 0 && targetSegmentLength == 0) { + return 0.0f; + } else { + double mean = (sourceSegmentLength + targetSegmentLength / + PARAMETER_C) / 2.0; + double z = Math.abs((PARAMETER_C * sourceSegmentLength - + targetSegmentLength) / Math.sqrt(PARAMETER_S_SQUARE * mean)); + double pd = 2.0 * (1.0 - cumulativeNormalDistribution(z)); + // Needed because sometimes returns zero + pd = Math.max(pd, Float.MIN_VALUE); + assert pd > 0.0; + return (float)-Math.log(pd); + } + } + + /** + * Calculates value of normal distribution for given z position (z >= 0). + * + * @see "Handbook of Mathematical Functions, Abrahamowitz, Stegun" + * @param z random variable + * @return random variable distribution value + */ + private double cumulativeNormalDistribution(double z) { + assert z >= 0.0; + double t = 1.0 / (1.0 + 0.2316419 * z); + double pd = 1.0 - 0.3989423 * Math.exp(-z * z / 2.0) * + ((((1.330274429 * t - 1.821255978) * t + + 1.781477937) * t - 0.356563782) * t + 0.319381530) * t; + return pd; + } + + +} diff --git a/src/net/sourceforge/align/calculator/length/PoissonDistributionCalculator.java b/src/net/sourceforge/align/calculator/length/PoissonDistributionCalculator.java new file mode 100755 index 0000000..83f5173 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/PoissonDistributionCalculator.java @@ -0,0 +1,153 @@ +package net.sourceforge.align.calculator.length; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.model.length.LengthModel; +import net.sourceforge.align.model.length.LengthModelUtil; + + +/** + * Represents length-base calculator that computes alignment score + * assuming that alignment lengths have Poisson distribution. + * Calculates length models (models based on frequency of occurrence of + * segment lengths) using training corpus (can be the same as the input corpus). + * + * @author loomchild + */ +public class PoissonDistributionCalculator + extends LengthCalculator { + + private LengthModel sourceLengthModel; + + private LengthModel targetLengthModel; + + private float meanLengthRatio; + + /** + * Creates calculator. Calculates source and target {@link LengthModel} + * using reference corpus (can be the same as actual corpus being aligned). + * + * @param counter length counter + * @param alignmentList reference alignment + */ + public PoissonDistributionCalculator(Counter counter, + List alignmentList) { + super(counter); + List sourceSegmentList = new ArrayList(); + List targetSegmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + sourceSegmentList.addAll(alignment.getSourceSegmentList()); + targetSegmentList.addAll(alignment.getTargetSegmentList()); + } + this.sourceLengthModel = trainLengthModel(sourceSegmentList); + this.targetLengthModel = trainLengthModel(targetSegmentList); + this.meanLengthRatio = targetLengthModel.getMeanLength() / + sourceLengthModel.getMeanLength(); + } + + /** + * Calculates length model of given segment list. + * @param segmentList + * @return + */ + private LengthModel trainLengthModel(List segmentList) { + List lengthList = calculateLengthList(segmentList); + LengthModel lengthModel = LengthModelUtil.train(lengthList); + return lengthModel; + } + + /** + * Calculates alignment score. If both input lists are empty returns zero. + * If only one of them is empty returns the other language score + * (probability of segment being part of language). If both are non-zero + * then returns translation score (probability of target segments being + * translations of source segments) added to language score of source + * segments. + */ + protected float calculateLengthScore(List sourceLengthList, + List targetLengthList) { + float score; + if (sourceLengthList.size() == 0 && targetLengthList.size() == 0) { + score = 0.0f; + } else if (sourceLengthList.size() == 0) { + score = calculateLanguageScore(targetLengthList, targetLengthModel); + } else { + score = calculateLanguageScore(sourceLengthList, sourceLengthModel); + if (targetLengthList.size() > 0) { + score += calculateTranslationScore(sourceLengthList, + targetLengthList); + } + } + assert score >= 0; + return score; + } + + /** + * Calculates the score (equal to -ln(probability)) of segments of given + * lengths being part of given language (occur in given length model). + * + * @param lengthList list of segment lengths + * @param lengthModel length model for a language + * @return score of length list matching with length model + */ + private float calculateLanguageScore(List lengthList, + LengthModel lengthModel) { + float score = 0.0f; + for (int length : lengthList) { + score += -Math.log(lengthModel.getLengthProbability(length)); + } + assert score >= 0; + return score; + } + + /** + * Calculates score of target segments of given lengths being translations + * of source segments of given lengths. + * + * @param sourceLengthList lengths of source segments + * @param targetLengthList lengths of target segments + * @return score + */ + private float calculateTranslationScore(List sourceLengthList, + List targetLengthList) { + int sourceTotalLength = calculateTotalLength(sourceLengthList); + int targetTotalLength = calculateTotalLength(targetLengthList); + float mean = sourceTotalLength * meanLengthRatio; + float score = poissonDistribution(mean, targetTotalLength); + assert score >= 0; + return score; + } + + /** + * Calculates value of a Poisson distribution function at given point (x). + * @param mean poisson distribution mean + * @param x x value + * @return y value + */ + static float poissonDistribution(float mean, int x) { + assert mean > 0; + return mean + -x * (float)Math.log(mean) + factorial(x); + } + + /** + * Returns logarithm from factorial of a given number ln(x!). + * @param x number + * @return ln(x!) + */ + static float factorial(int x) { + if (x < 0) { + throw new IllegalArgumentException("Cannot calculate factorial " + + "for a negative number: " + x + "."); + } else { + float y = 0; + for (int i = 2; i <= x; ++i) { + y += Math.log(i); + } + return y; + } + } + +} diff --git a/src/net/sourceforge/align/calculator/length/PoissonDistributionCalculatorTest.java b/src/net/sourceforge/align/calculator/length/PoissonDistributionCalculatorTest.java new file mode 100755 index 0000000..982eb27 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/PoissonDistributionCalculatorTest.java @@ -0,0 +1,42 @@ +package net.sourceforge.align.calculator.length; + +import static net.sourceforge.align.calculator.length.PoissonDistributionCalculator.factorial; +import static net.sourceforge.align.calculator.length.PoissonDistributionCalculator.poissonDistribution; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Represents {@link PoissonDistributionCalculator} unit test. + * @author loomchild + */ +public class PoissonDistributionCalculatorTest { + + /** + * Tests factorial calculation by + * {@link PoissonDistributionCalculator#factorial(int)}. + */ + @Test + public void testFactorial() { + assertEquals(1.0f, Math.exp(factorial(1)), 0.01f); + assertEquals(2.0f, Math.exp(factorial(2)), 0.01f); + assertEquals(6.0f, Math.exp(factorial(3)), 0.01f); + assertEquals(24.0f, Math.exp(factorial(4)), 0.01f); + } + + /** + * Tests Poisson distribution points calculation by + * {@link PoissonDistributionCalculator#poissonDistribution(float, int)} + * using some manually calculated values. + */ + @Test + public void testPoissonDistribution() { + assertEquals(0.6065f, Math.exp(-poissonDistribution(0.5f, 0)), 0.0001f); + assertEquals(0.3679f, Math.exp(-poissonDistribution(1.0f, 0)), 0.0001f); + assertEquals(0.3679f, Math.exp(-poissonDistribution(1.0f, 1)), 0.0001f); + assertEquals(0.1839f, Math.exp(-poissonDistribution(1.0f, 2)), 0.0001f); + assertEquals(0.2707f, Math.exp(-poissonDistribution(2.0f, 1)), 0.0001f); + assertEquals(0.1805f, Math.exp(-poissonDistribution(2.0f, 3)), 0.0001f); + } + +} diff --git a/src/net/sourceforge/align/calculator/length/counter/.svn/all-wcprops b/src/net/sourceforge/align/calculator/length/counter/.svn/all-wcprops new file mode 100644 index 0000000..d3d17c0 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/counter/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 92 +/svnroot/align/!svn/ver/43/trunk/maligna/src/net/sourceforge/align/calculator/length/counter +END +Counter.java +K 25 +svn:wc:ra_dav:version-url +V 105 +/svnroot/align/!svn/ver/43/trunk/maligna/src/net/sourceforge/align/calculator/length/counter/Counter.java +END +CharCounter.java +K 25 +svn:wc:ra_dav:version-url +V 109 +/svnroot/align/!svn/ver/43/trunk/maligna/src/net/sourceforge/align/calculator/length/counter/CharCounter.java +END +SplitCounter.java +K 25 +svn:wc:ra_dav:version-url +V 110 +/svnroot/align/!svn/ver/43/trunk/maligna/src/net/sourceforge/align/calculator/length/counter/SplitCounter.java +END diff --git a/src/net/sourceforge/align/calculator/length/counter/.svn/entries b/src/net/sourceforge/align/calculator/length/counter/.svn/entries new file mode 100644 index 0000000..e422ece --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/counter/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/calculator/length/counter +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-04T13:51:51.058455Z +43 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +CharCounter.java +file + + + + +2010-11-03T18:24:31.000000Z +efc37535a1cd4e0fa9051bd413c38b7f +2010-11-04T13:51:51.058455Z +43 +jarekl + + + + + + + + + + + + + + + + + + + + + +317 + +Counter.java +file + + + + +2010-11-03T18:23:07.000000Z +70fbd584d3de651a120035ea4dba0ebb +2010-11-04T13:51:51.058455Z +43 +jarekl + + + + + + + + + + + + + + + + + + + + + +483 + +SplitCounter.java +file + + + + +2010-11-03T18:26:48.000000Z +54e05b450133170d6612de4c12caa463 +2010-11-04T13:51:51.058455Z +43 +jarekl + + + + + + + + + + + + + + + + + + + + + +1071 + diff --git a/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/CharCounter.java.svn-base b/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/CharCounter.java.svn-base new file mode 100644 index 0000000..78e9eea --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/CharCounter.java.svn-base @@ -0,0 +1,16 @@ +package net.sourceforge.align.calculator.length.counter; + +/** + * Responsible for calculating length of a segment in characters. + * @author loomchild + */ +public class CharCounter implements Counter { + + /** + * Returns segment length. + */ + public int calculateLength(String segment) { + return segment.length(); + } + +} diff --git a/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/Counter.java.svn-base b/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/Counter.java.svn-base new file mode 100644 index 0000000..d4f92f7 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/Counter.java.svn-base @@ -0,0 +1,19 @@ +package net.sourceforge.align.calculator.length.counter; + +/** + * Responsible for calculating length of given segment. For example + * it can return number of characters (see {@link CharCounter}, + * number of words (see {@link SplitCounter}) or any other measure. + * @author loomchild + */ +public interface Counter { + + /** + * Calculates length of a segment. + * + * @param segment segment + * @return length of a segment, >= 0 + */ + public int calculateLength(String segment); + +} diff --git a/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/SplitCounter.java.svn-base b/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/SplitCounter.java.svn-base new file mode 100644 index 0000000..53a63b4 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/counter/.svn/text-base/SplitCounter.java.svn-base @@ -0,0 +1,40 @@ +package net.sourceforge.align.calculator.length.counter; + +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; + +/** + * Responsible for calculating length of segment in words. Uses given word + * splitting algorithm or {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + * + * @author loomchild + */ +public class SplitCounter implements Counter { + + public SplitAlgorithm splitAlgorithm; + + /** + * Create calculator using given word split algoprithm. + * @param splitAlgorithm + */ + public SplitCounter(SplitAlgorithm splitAlgorithm) { + this.splitAlgorithm = splitAlgorithm; + } + + /** + * Creates calculator using + * {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + */ + public SplitCounter() { + this(DEFAULT_TOKENIZE_ALGORITHM); + } + + /** + * Calculates length of a segment in words. + */ + public int calculateLength(String segment) { + return splitAlgorithm.split(segment).size(); + } + +} diff --git a/src/net/sourceforge/align/calculator/length/counter/CharCounter.java b/src/net/sourceforge/align/calculator/length/counter/CharCounter.java new file mode 100755 index 0000000..78e9eea --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/counter/CharCounter.java @@ -0,0 +1,16 @@ +package net.sourceforge.align.calculator.length.counter; + +/** + * Responsible for calculating length of a segment in characters. + * @author loomchild + */ +public class CharCounter implements Counter { + + /** + * Returns segment length. + */ + public int calculateLength(String segment) { + return segment.length(); + } + +} diff --git a/src/net/sourceforge/align/calculator/length/counter/Counter.java b/src/net/sourceforge/align/calculator/length/counter/Counter.java new file mode 100755 index 0000000..d4f92f7 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/counter/Counter.java @@ -0,0 +1,19 @@ +package net.sourceforge.align.calculator.length.counter; + +/** + * Responsible for calculating length of given segment. For example + * it can return number of characters (see {@link CharCounter}, + * number of words (see {@link SplitCounter}) or any other measure. + * @author loomchild + */ +public interface Counter { + + /** + * Calculates length of a segment. + * + * @param segment segment + * @return length of a segment, >= 0 + */ + public int calculateLength(String segment); + +} diff --git a/src/net/sourceforge/align/calculator/length/counter/SplitCounter.java b/src/net/sourceforge/align/calculator/length/counter/SplitCounter.java new file mode 100755 index 0000000..53a63b4 --- /dev/null +++ b/src/net/sourceforge/align/calculator/length/counter/SplitCounter.java @@ -0,0 +1,40 @@ +package net.sourceforge.align.calculator.length.counter; + +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; + +/** + * Responsible for calculating length of segment in words. Uses given word + * splitting algorithm or {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + * + * @author loomchild + */ +public class SplitCounter implements Counter { + + public SplitAlgorithm splitAlgorithm; + + /** + * Create calculator using given word split algoprithm. + * @param splitAlgorithm + */ + public SplitCounter(SplitAlgorithm splitAlgorithm) { + this.splitAlgorithm = splitAlgorithm; + } + + /** + * Creates calculator using + * {@link VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}. + */ + public SplitCounter() { + this(DEFAULT_TOKENIZE_ALGORITHM); + } + + /** + * Calculates length of a segment in words. + */ + public int calculateLength(String segment) { + return splitAlgorithm.split(segment).size(); + } + +} diff --git a/src/net/sourceforge/align/calculator/meta/.svn/all-wcprops b/src/net/sourceforge/align/calculator/meta/.svn/all-wcprops new file mode 100644 index 0000000..927b2aa --- /dev/null +++ b/src/net/sourceforge/align/calculator/meta/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 82 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/calculator/meta +END +MinimumCalculator.java +K 25 +svn:wc:ra_dav:version-url +V 105 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/calculator/meta/MinimumCalculator.java +END +CompositeCalculatorTest.java +K 25 +svn:wc:ra_dav:version-url +V 111 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/calculator/meta/CompositeCalculatorTest.java +END +CompositeCalculator.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/calculator/meta/CompositeCalculator.java +END diff --git a/src/net/sourceforge/align/calculator/meta/.svn/entries b/src/net/sourceforge/align/calculator/meta/.svn/entries new file mode 100644 index 0000000..efad734 --- /dev/null +++ b/src/net/sourceforge/align/calculator/meta/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/calculator/meta +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +CompositeCalculator.java +file + + + + +2010-11-13T19:06:39.000000Z +855d60e9f492a7487568d129575662f5 +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + + + + + + + + +898 + +CompositeCalculatorTest.java +file + + + + +2010-11-01T18:19:14.000000Z +4c073cc674f8897280bd240b984597c9 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +838 + +MinimumCalculator.java +file + + + + +2010-11-01T18:13:13.000000Z +6fe9cb34716671cb2e46f4924c1fb48c +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1699 + diff --git a/src/net/sourceforge/align/calculator/meta/.svn/text-base/CompositeCalculator.java.svn-base b/src/net/sourceforge/align/calculator/meta/.svn/text-base/CompositeCalculator.java.svn-base new file mode 100644 index 0000000..6b9d222 --- /dev/null +++ b/src/net/sourceforge/align/calculator/meta/.svn/text-base/CompositeCalculator.java.svn-base @@ -0,0 +1,35 @@ +package net.sourceforge.align.calculator.meta; + +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; + +/** + * Represents composite calculator. Alignment score is a sum of + * scores returned by all calculators (equivalent of product of prababilities + * returned by all calculators). + * @author loomchild + */ +public class CompositeCalculator implements Calculator { + + private List calculatorList; + + public CompositeCalculator(List calculatorList) { + this.calculatorList = calculatorList; + } + + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + float score = 0.0f; + for (Calculator calculator : calculatorList) { + score += calculator.calculateScore(sourceSegmentList, + targetSegmentList); + if (score == Float.POSITIVE_INFINITY) { + break; + } + } + assert score >= 0; + return score; + } + +} diff --git a/src/net/sourceforge/align/calculator/meta/.svn/text-base/CompositeCalculatorTest.java.svn-base b/src/net/sourceforge/align/calculator/meta/.svn/text-base/CompositeCalculatorTest.java.svn-base new file mode 100644 index 0000000..2d03cb6 --- /dev/null +++ b/src/net/sourceforge/align/calculator/meta/.svn/text-base/CompositeCalculatorTest.java.svn-base @@ -0,0 +1,31 @@ +package net.sourceforge.align.calculator.meta; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.CalculatorMock; + +import org.junit.Test; + +/** + * Represents unit test of {@link CompositeCalculator}. + * @author loomchild + */ +public class CompositeCalculatorTest { + + /** + * Checks using {@link CalculatorMock} that composite really returns + * the sum of scores of all contained calculators. + */ + @Test + public void calculate() { + List calculatorList = Arrays.asList(new Calculator[] { + new CalculatorMock(0.5f), new CalculatorMock(0.25f)}); + Calculator calculator = new CompositeCalculator(calculatorList); + assertEquals(0.75f, calculator.calculateScore(null, null), 0.75f); + } + +} diff --git a/src/net/sourceforge/align/calculator/meta/.svn/text-base/MinimumCalculator.java.svn-base b/src/net/sourceforge/align/calculator/meta/.svn/text-base/MinimumCalculator.java.svn-base new file mode 100644 index 0000000..c217bf9 --- /dev/null +++ b/src/net/sourceforge/align/calculator/meta/.svn/text-base/MinimumCalculator.java.svn-base @@ -0,0 +1,62 @@ +package net.sourceforge.align.calculator.meta; + +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; + +/** + * Represents conditional calculator. + * If score calculated by given testCalculator is equal or less than the + * given threshold returns given minimum score, + * otherwise returns score calculated by calculator. + * + * TODO: generalize to n calculators, simplify that no default is defined - + * just if score returned by any calculator is zero then do not try calculate + * others because score by definition cannot be less than zero. + * + * @author loomchild + * + */ +public class MinimumCalculator implements Calculator { + + private static final float DEFAULT_MINIMUM_SCORE = 0.0f; + + private Calculator testCalculator; + + private Calculator calculator; + + private float scoreThreshold; + + private float minimumScore; + + public MinimumCalculator(Calculator testCalculator, + Calculator calculator, float scoreThreshold, float minumumScore) { + this.testCalculator = testCalculator; + this.calculator = calculator; + this.scoreThreshold = scoreThreshold; + this.minimumScore = minumumScore; + } + + public MinimumCalculator(Calculator testCalculator, + Calculator calculator, float scoreThreshold) { + this(testCalculator,calculator, scoreThreshold, DEFAULT_MINIMUM_SCORE); + } + + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + + float testScore = + testCalculator.calculateScore(sourceSegmentList, targetSegmentList); + float score; + + if (testScore <= scoreThreshold) { + score = minimumScore; + } else { + score = calculator.calculateScore(sourceSegmentList, targetSegmentList); + } + + return score; + + } + +} diff --git a/src/net/sourceforge/align/calculator/meta/CompositeCalculator.java b/src/net/sourceforge/align/calculator/meta/CompositeCalculator.java new file mode 100755 index 0000000..6b9d222 --- /dev/null +++ b/src/net/sourceforge/align/calculator/meta/CompositeCalculator.java @@ -0,0 +1,35 @@ +package net.sourceforge.align.calculator.meta; + +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; + +/** + * Represents composite calculator. Alignment score is a sum of + * scores returned by all calculators (equivalent of product of prababilities + * returned by all calculators). + * @author loomchild + */ +public class CompositeCalculator implements Calculator { + + private List calculatorList; + + public CompositeCalculator(List calculatorList) { + this.calculatorList = calculatorList; + } + + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + float score = 0.0f; + for (Calculator calculator : calculatorList) { + score += calculator.calculateScore(sourceSegmentList, + targetSegmentList); + if (score == Float.POSITIVE_INFINITY) { + break; + } + } + assert score >= 0; + return score; + } + +} diff --git a/src/net/sourceforge/align/calculator/meta/CompositeCalculatorTest.java b/src/net/sourceforge/align/calculator/meta/CompositeCalculatorTest.java new file mode 100755 index 0000000..2d03cb6 --- /dev/null +++ b/src/net/sourceforge/align/calculator/meta/CompositeCalculatorTest.java @@ -0,0 +1,31 @@ +package net.sourceforge.align.calculator.meta; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.CalculatorMock; + +import org.junit.Test; + +/** + * Represents unit test of {@link CompositeCalculator}. + * @author loomchild + */ +public class CompositeCalculatorTest { + + /** + * Checks using {@link CalculatorMock} that composite really returns + * the sum of scores of all contained calculators. + */ + @Test + public void calculate() { + List calculatorList = Arrays.asList(new Calculator[] { + new CalculatorMock(0.5f), new CalculatorMock(0.25f)}); + Calculator calculator = new CompositeCalculator(calculatorList); + assertEquals(0.75f, calculator.calculateScore(null, null), 0.75f); + } + +} diff --git a/src/net/sourceforge/align/calculator/meta/MinimumCalculator.java b/src/net/sourceforge/align/calculator/meta/MinimumCalculator.java new file mode 100755 index 0000000..c217bf9 --- /dev/null +++ b/src/net/sourceforge/align/calculator/meta/MinimumCalculator.java @@ -0,0 +1,62 @@ +package net.sourceforge.align.calculator.meta; + +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; + +/** + * Represents conditional calculator. + * If score calculated by given testCalculator is equal or less than the + * given threshold returns given minimum score, + * otherwise returns score calculated by calculator. + * + * TODO: generalize to n calculators, simplify that no default is defined - + * just if score returned by any calculator is zero then do not try calculate + * others because score by definition cannot be less than zero. + * + * @author loomchild + * + */ +public class MinimumCalculator implements Calculator { + + private static final float DEFAULT_MINIMUM_SCORE = 0.0f; + + private Calculator testCalculator; + + private Calculator calculator; + + private float scoreThreshold; + + private float minimumScore; + + public MinimumCalculator(Calculator testCalculator, + Calculator calculator, float scoreThreshold, float minumumScore) { + this.testCalculator = testCalculator; + this.calculator = calculator; + this.scoreThreshold = scoreThreshold; + this.minimumScore = minumumScore; + } + + public MinimumCalculator(Calculator testCalculator, + Calculator calculator, float scoreThreshold) { + this(testCalculator,calculator, scoreThreshold, DEFAULT_MINIMUM_SCORE); + } + + public float calculateScore(List sourceSegmentList, + List targetSegmentList) { + + float testScore = + testCalculator.calculateScore(sourceSegmentList, targetSegmentList); + float score; + + if (testScore <= scoreThreshold) { + score = minimumScore; + } else { + score = calculator.calculateScore(sourceSegmentList, targetSegmentList); + } + + return score; + + } + +} diff --git a/src/net/sourceforge/align/comparator/.svn/all-wcprops b/src/net/sourceforge/align/comparator/.svn/all-wcprops new file mode 100644 index 0000000..58b8afb --- /dev/null +++ b/src/net/sourceforge/align/comparator/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 77 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/comparator +END +ComparatorTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 102 +/svnroot/align/!svn/ver/21/trunk/maligna/src/net/sourceforge/align/comparator/ComparatorTestSuite.java +END +ComparatorTest.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/comparator/ComparatorTest.java +END +Comparator.java +K 25 +svn:wc:ra_dav:version-url +V 93 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/comparator/Comparator.java +END +Diff.java +K 25 +svn:wc:ra_dav:version-url +V 87 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/comparator/Diff.java +END diff --git a/src/net/sourceforge/align/comparator/.svn/entries b/src/net/sourceforge/align/comparator/.svn/entries new file mode 100644 index 0000000..41c2d5c --- /dev/null +++ b/src/net/sourceforge/align/comparator/.svn/entries @@ -0,0 +1,142 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/comparator +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Comparator.java +file + + + + +2010-11-10T18:36:08.000000Z +3593ecfc081494b24dac33ed4a6eda36 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +7497 + +ComparatorTest.java +file + + + + +2010-10-28T16:40:13.000000Z +6c2709157ac3e3e5fd69be66c88d5735 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +4766 + +ComparatorTestSuite.java +file + + + + +2008-09-02T21:33:51.000000Z +295774a8ac97b06d9e6a97b93344dc02 +2008-09-04T00:45:56.332090Z +21 +jarekl + +Diff.java +file + + + + +2010-10-28T16:40:14.000000Z +2911f8b4ce72666f592b0b6ad972e043 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2116 + diff --git a/src/net/sourceforge/align/comparator/.svn/text-base/Comparator.java.svn-base b/src/net/sourceforge/align/comparator/.svn/text-base/Comparator.java.svn-base new file mode 100644 index 0000000..4f531a9 --- /dev/null +++ b/src/net/sourceforge/align/comparator/.svn/text-base/Comparator.java.svn-base @@ -0,0 +1,325 @@ +package net.sourceforge.align.comparator; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents alignment list comparator. + * + * Responsible for comparing two alignments and returning the differences. + * TODO: do not remember how it works, analyze and describe it at some point. + * + * @author loomchild + */ +public class Comparator { + + /** + * Compares left and right alignment list. + * + * @param leftAlignmentList + * @param rightAlignmentList + * @return list differences + */ + public static Diff compare(List leftAlignmentList, + List rightAlignmentList) { + + Diff diff; + + if (leftAlignmentList.size() > 0 && rightAlignmentList.size() > 0) { + + int[][] occurrenceArray = + createOccurenceArray(leftAlignmentList, rightAlignmentList); + + int[] indexArray = new int[leftAlignmentList.size()]; + for (int i = 0; i < indexArray.length; ++i) { + indexArray[i] = occurrenceArray[i].length; + } + + int bestLength = -1; + int[] bestIndexArray = null; + + do { + + int length = length(indexArray, occurrenceArray); + if (length >= bestLength) { + bestLength = length; + bestIndexArray = + Arrays.copyOf(indexArray, indexArray.length); + } + + } while (next(indexArray, occurrenceArray)); + + diff = createDiff(leftAlignmentList, rightAlignmentList, + bestIndexArray, occurrenceArray); + + } else { + + List commonList = Collections.emptyList(); + diff = new Diff(commonList, + Collections.singletonList(leftAlignmentList), + Collections.singletonList(rightAlignmentList)); + + } + + return diff; + + } + + private static int[][] createOccurenceArray(List leftAlignmentList, + List rightAlignmentList) { + + Map> rightOccurrenceMap = + new HashMap>(); + + int position = 0; + for (Alignment alignment : rightAlignmentList) { + List occurrenceList = + rightOccurrenceMap.get(alignment); + if (occurrenceList == null) { + occurrenceList = new ArrayList(); + } + occurrenceList.add(position); + rightOccurrenceMap.put(alignment, occurrenceList); + ++position; + } + + int[][] occurrenceArray = new int[leftAlignmentList.size()][]; + + int i = 0; + for (Alignment alignment : leftAlignmentList) { + + List list = rightOccurrenceMap.get(alignment); + int[] array; + + if (list != null) { + array = new int[list.size()]; + int k = 0; + for (int occurence : list) { + array[k] = occurence; + ++k; + } + } else { + array = new int[0]; + } + + occurrenceArray[i] = array; + + ++i; + + } + + return occurrenceArray; + + } + + private static boolean next(int[] indexArray, int[][] occurrenceArray) { + + for (int i = indexArray.length - 1; i >= 0; --i) { + + if (indexArray[i] > 0) { + + int k = i - 1; + while (k >= 0 && indexArray[k] == occurrenceArray[k].length) { + --k; + } + + if (k >= 0 && occurrenceArray[k][indexArray[k]] >= + occurrenceArray[i][indexArray[i] - 1]) { + continue; + } + + --indexArray[i]; + + int position = occurrenceArray[i][indexArray[i]]; + + for (int m = i + 1; m < indexArray.length; ++m) { + + int n = 0; + while (n < occurrenceArray[m].length + && position > occurrenceArray[m][n]) { + ++n; + } + + if (n < occurrenceArray[m].length) { + position = occurrenceArray[m][n]; + } + + indexArray[m] = n; + + } + + return true; + + } + + } + + return false; + + } + + + private static int length(int[] indexArray, int[][] occurrenceArray) { + + int length = 0; + + for (int i = 0; i < indexArray.length; ++i) { + if (indexArray[i] < occurrenceArray[i].length) { + ++length; + } + } + + return length; + + } + + private static Diff createDiff(List leftAlignmentList, + List rightAlignmentList, + int[] indexArray, int[][] occurrenceArray) { + + List commonList = new ArrayList(); + List> leftList = new ArrayList>(); + List> rightList = new ArrayList>(); + + int previousLeftPosition = 0; + int previousRightPosition = 0; + + for (int i = 0; i < indexArray.length; ++i) { + + if (indexArray[i] < occurrenceArray[i].length) { + + Alignment commonAlignment = leftAlignmentList.get(i); + commonList.add(commonAlignment); + + int leftPosition = i; + int rightPosition = occurrenceArray[i][indexArray[i]]; + + if (leftPosition > previousLeftPosition || + rightPosition > previousRightPosition) { + + List leftGroup = new ArrayList( + leftAlignmentList.subList(previousLeftPosition, leftPosition)); + leftList.add(leftGroup); + + List rightGroup = new ArrayList( + rightAlignmentList.subList(previousRightPosition, rightPosition)); + rightList.add(rightGroup); + + } + + previousLeftPosition = leftPosition + 1; + previousRightPosition = rightPosition + 1; + + } + + } + + return new Diff(commonList, leftList, rightList); + + } + +} + /* + public static Diff compare(List leftAlignmentList, + List rightAlignmentList) { + + Diff diff; + + if (leftAlignmentList.size() > 0 && rightAlignmentList.size() > 0) { + + int[][] occurrenceArray = + createOccurenceArray(leftAlignmentList, rightAlignmentList); + + int[] indexArray = new int[leftAlignmentList.size()]; + indexArray[indexArray.length - 1] = -1; + + int bestLength = 0; + int[] bestIndexArray = new int[0]; + + while (hasNext(indexArray, occurrenceArray)) { + + next(indexArray, occurrenceArray); + + if (isValid(indexArray, occurrenceArray)) { + int length = length(indexArray, occurrenceArray); + if (length > bestLength) { + bestLength = length; + bestIndexArray = + Arrays.copyOf(indexArray, indexArray.length); + } + } + + } + + diff = createDiff(leftAlignmentList, rightAlignmentList, + bestIndexArray, occurrenceArray); + + } else { + + List commonList = Collections.emptyList(); + diff = new Diff(commonList, + Collections.singletonList(leftAlignmentList), + Collections.singletonList(rightAlignmentList)); + + } + + return diff; + + } + + private static void next(int[] indexArray, int[][] occurrenceArray) { + + for (int i = indexArray.length - 1; i >= 0; --i) { + if (indexArray[i] < occurrenceArray[i].length) { + ++indexArray[i]; + for (int k = i + 1; k < indexArray.length; ++k) { + indexArray[k] = 0; + } + return; + } + } + + throw new NoSuchElementException("There is no successor."); + + } + + private static boolean hasNext(int[] indexArray, int[][] occurrenceArray) { + + if (indexArray.length == 0) { + return false; + } + + for (int i = 0; i < indexArray.length; ++i) { + if (indexArray[i] < occurrenceArray[i].length) { + return true; + } + } + + return false; + + } + + private static boolean isValid(int[] indexArray, int[][] occurrenceArray) { + + int previousPosition = -1; + + for (int i = 0; i < indexArray.length; ++i) { + if (indexArray[i] < occurrenceArray[i].length) { + int currentPosition = occurrenceArray[i][indexArray[i]]; + if (currentPosition <= previousPosition) { + return false; + } + previousPosition = currentPosition; + } + } + + return true; + } + +*/ diff --git a/src/net/sourceforge/align/comparator/.svn/text-base/ComparatorTest.java.svn-base b/src/net/sourceforge/align/comparator/.svn/text-base/ComparatorTest.java.svn-base new file mode 100644 index 0000000..cad3add --- /dev/null +++ b/src/net/sourceforge/align/comparator/.svn/text-base/ComparatorTest.java.svn-base @@ -0,0 +1,125 @@ +package net.sourceforge.align.comparator; + +import static net.sourceforge.align.comparator.Comparator.compare; +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link Comparator} test. + * + * @author loomchild + */ +public class ComparatorTest { + + @Test + public void testEmpty() { + + List leftAlignmentList = Collections.singletonList( + new Alignment(new String[]{"a"}, new String[]{"b"})); + List rightAlignmentList = Collections.emptyList(); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + assertEquals(0, diff.getCommonList().size()); + + assertEquals(1, diff.getLeftGroupList().size()); + assertEquals(1, diff.getLeftGroupList().get(0).size()); + + assertEquals(1, diff.getRightGroupList().size()); + assertEquals(0, diff.getRightGroupList().get(0).size()); + + } + + @Test + public void testSimple() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + assertEquals(2, diff.getCommonList().size()); + assertEquals(rightAlignmentList.get(0), diff.getCommonList().get(0)); + assertEquals(rightAlignmentList.get(2), diff.getCommonList().get(1)); + + assertEquals(1, diff.getLeftGroupList().size()); + assertEquals(leftAlignmentList.subList(1, 2), diff.getLeftGroupList().get(0)); + + assertEquals(1, diff.getRightGroupList().size()); + assertEquals(rightAlignmentList.subList(1, 2), diff.getRightGroupList().get(0)); + + } + + @Test + public void testRepetitions() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + assertEquals(3, diff.getCommonList().size()); + assertEquals(rightAlignmentList.get(0), diff.getCommonList().get(0)); + assertEquals(rightAlignmentList.get(1), diff.getCommonList().get(1)); + assertEquals(rightAlignmentList.get(3), diff.getCommonList().get(2)); + + assertEquals(1, diff.getLeftGroupList().size()); + assertEquals(0, diff.getLeftGroupList().get(0).size()); + + assertEquals(1, diff.getRightGroupList().size()); + assertEquals(rightAlignmentList.subList(2, 3), diff.getRightGroupList().get(0)); + + } + + @Test + public void testInversions() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + assertEquals(2, diff.getCommonList().size()); + assertEquals(rightAlignmentList.get(1), diff.getCommonList().get(0)); + assertEquals(rightAlignmentList.get(2), diff.getCommonList().get(1)); + + assertEquals(2, diff.getLeftGroupList().size()); + assertEquals(0, diff.getLeftGroupList().get(0).size()); + assertEquals(leftAlignmentList.subList(1, 2), diff.getLeftGroupList().get(1)); + + assertEquals(2, diff.getRightGroupList().size()); + assertEquals(rightAlignmentList.subList(0, 1), diff.getRightGroupList().get(0)); + assertEquals(0, diff.getRightGroupList().get(1).size()); + + } + +} diff --git a/src/net/sourceforge/align/comparator/.svn/text-base/ComparatorTestSuite.java.svn-base b/src/net/sourceforge/align/comparator/.svn/text-base/ComparatorTestSuite.java.svn-base new file mode 100755 index 0000000..95861b5 --- /dev/null +++ b/src/net/sourceforge/align/comparator/.svn/text-base/ComparatorTestSuite.java.svn-base @@ -0,0 +1,11 @@ +package net.sourceforge.align.comparator; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + ComparatorTest.class +}) +public class ComparatorTestSuite { +} diff --git a/src/net/sourceforge/align/comparator/.svn/text-base/Diff.java.svn-base b/src/net/sourceforge/align/comparator/.svn/text-base/Diff.java.svn-base new file mode 100644 index 0000000..5660749 --- /dev/null +++ b/src/net/sourceforge/align/comparator/.svn/text-base/Diff.java.svn-base @@ -0,0 +1,88 @@ +package net.sourceforge.align.comparator; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + + +/** + * Represents the result of alignment compare. + * Contains common alignment list and non matching, corresponding left and right + * alignment list groups. Number of elements on leftList and rightList is equal. + * + * @author Jarek Lipski (loomchild) + */ +public class Diff { + + private List commonList; + + private List> leftGroupList; + + private List> rightGroupList; + + private List leftList; + + private List rightList; + + public Diff(List commonList, List> leftGroupList, + List> rightGroupList) { + + if (leftGroupList.size() != rightGroupList.size()) { + throw new IllegalArgumentException( + "Left and right list lengths must be equal."); + } + + this.commonList = commonList; + this.leftGroupList = leftGroupList; + this.rightGroupList = rightGroupList; + + this.leftList = mergeGroups(leftGroupList); + this.rightList = mergeGroups(rightGroupList); + + } + + private List mergeGroups(List> groupList) { + List list = new ArrayList(); + for (List alignmentList : groupList) { + list.addAll(alignmentList); + } + return list; + } + + /** + * @return Returns list common to left and right alignments. + */ + public List getCommonList() { + return commonList; + } + + /** + * @return Returns list of alignment groups occurring only in left list. + */ + public List> getLeftGroupList() { + return leftGroupList; + } + + /** + * @return Returns list of alignment groups occurring only in right list. + */ + public List> getRightGroupList() { + return rightGroupList; + } + + /** + * @return Returns list of alignments occurring only in left list. + */ + public List getLeftList() { + return leftList; + } + + /** + * @return Returns list of alignments occurring only in right list. + */ + public List getRightList() { + return rightList; + } + +} diff --git a/src/net/sourceforge/align/comparator/Comparator.java b/src/net/sourceforge/align/comparator/Comparator.java new file mode 100755 index 0000000..4f531a9 --- /dev/null +++ b/src/net/sourceforge/align/comparator/Comparator.java @@ -0,0 +1,325 @@ +package net.sourceforge.align.comparator; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents alignment list comparator. + * + * Responsible for comparing two alignments and returning the differences. + * TODO: do not remember how it works, analyze and describe it at some point. + * + * @author loomchild + */ +public class Comparator { + + /** + * Compares left and right alignment list. + * + * @param leftAlignmentList + * @param rightAlignmentList + * @return list differences + */ + public static Diff compare(List leftAlignmentList, + List rightAlignmentList) { + + Diff diff; + + if (leftAlignmentList.size() > 0 && rightAlignmentList.size() > 0) { + + int[][] occurrenceArray = + createOccurenceArray(leftAlignmentList, rightAlignmentList); + + int[] indexArray = new int[leftAlignmentList.size()]; + for (int i = 0; i < indexArray.length; ++i) { + indexArray[i] = occurrenceArray[i].length; + } + + int bestLength = -1; + int[] bestIndexArray = null; + + do { + + int length = length(indexArray, occurrenceArray); + if (length >= bestLength) { + bestLength = length; + bestIndexArray = + Arrays.copyOf(indexArray, indexArray.length); + } + + } while (next(indexArray, occurrenceArray)); + + diff = createDiff(leftAlignmentList, rightAlignmentList, + bestIndexArray, occurrenceArray); + + } else { + + List commonList = Collections.emptyList(); + diff = new Diff(commonList, + Collections.singletonList(leftAlignmentList), + Collections.singletonList(rightAlignmentList)); + + } + + return diff; + + } + + private static int[][] createOccurenceArray(List leftAlignmentList, + List rightAlignmentList) { + + Map> rightOccurrenceMap = + new HashMap>(); + + int position = 0; + for (Alignment alignment : rightAlignmentList) { + List occurrenceList = + rightOccurrenceMap.get(alignment); + if (occurrenceList == null) { + occurrenceList = new ArrayList(); + } + occurrenceList.add(position); + rightOccurrenceMap.put(alignment, occurrenceList); + ++position; + } + + int[][] occurrenceArray = new int[leftAlignmentList.size()][]; + + int i = 0; + for (Alignment alignment : leftAlignmentList) { + + List list = rightOccurrenceMap.get(alignment); + int[] array; + + if (list != null) { + array = new int[list.size()]; + int k = 0; + for (int occurence : list) { + array[k] = occurence; + ++k; + } + } else { + array = new int[0]; + } + + occurrenceArray[i] = array; + + ++i; + + } + + return occurrenceArray; + + } + + private static boolean next(int[] indexArray, int[][] occurrenceArray) { + + for (int i = indexArray.length - 1; i >= 0; --i) { + + if (indexArray[i] > 0) { + + int k = i - 1; + while (k >= 0 && indexArray[k] == occurrenceArray[k].length) { + --k; + } + + if (k >= 0 && occurrenceArray[k][indexArray[k]] >= + occurrenceArray[i][indexArray[i] - 1]) { + continue; + } + + --indexArray[i]; + + int position = occurrenceArray[i][indexArray[i]]; + + for (int m = i + 1; m < indexArray.length; ++m) { + + int n = 0; + while (n < occurrenceArray[m].length + && position > occurrenceArray[m][n]) { + ++n; + } + + if (n < occurrenceArray[m].length) { + position = occurrenceArray[m][n]; + } + + indexArray[m] = n; + + } + + return true; + + } + + } + + return false; + + } + + + private static int length(int[] indexArray, int[][] occurrenceArray) { + + int length = 0; + + for (int i = 0; i < indexArray.length; ++i) { + if (indexArray[i] < occurrenceArray[i].length) { + ++length; + } + } + + return length; + + } + + private static Diff createDiff(List leftAlignmentList, + List rightAlignmentList, + int[] indexArray, int[][] occurrenceArray) { + + List commonList = new ArrayList(); + List> leftList = new ArrayList>(); + List> rightList = new ArrayList>(); + + int previousLeftPosition = 0; + int previousRightPosition = 0; + + for (int i = 0; i < indexArray.length; ++i) { + + if (indexArray[i] < occurrenceArray[i].length) { + + Alignment commonAlignment = leftAlignmentList.get(i); + commonList.add(commonAlignment); + + int leftPosition = i; + int rightPosition = occurrenceArray[i][indexArray[i]]; + + if (leftPosition > previousLeftPosition || + rightPosition > previousRightPosition) { + + List leftGroup = new ArrayList( + leftAlignmentList.subList(previousLeftPosition, leftPosition)); + leftList.add(leftGroup); + + List rightGroup = new ArrayList( + rightAlignmentList.subList(previousRightPosition, rightPosition)); + rightList.add(rightGroup); + + } + + previousLeftPosition = leftPosition + 1; + previousRightPosition = rightPosition + 1; + + } + + } + + return new Diff(commonList, leftList, rightList); + + } + +} + /* + public static Diff compare(List leftAlignmentList, + List rightAlignmentList) { + + Diff diff; + + if (leftAlignmentList.size() > 0 && rightAlignmentList.size() > 0) { + + int[][] occurrenceArray = + createOccurenceArray(leftAlignmentList, rightAlignmentList); + + int[] indexArray = new int[leftAlignmentList.size()]; + indexArray[indexArray.length - 1] = -1; + + int bestLength = 0; + int[] bestIndexArray = new int[0]; + + while (hasNext(indexArray, occurrenceArray)) { + + next(indexArray, occurrenceArray); + + if (isValid(indexArray, occurrenceArray)) { + int length = length(indexArray, occurrenceArray); + if (length > bestLength) { + bestLength = length; + bestIndexArray = + Arrays.copyOf(indexArray, indexArray.length); + } + } + + } + + diff = createDiff(leftAlignmentList, rightAlignmentList, + bestIndexArray, occurrenceArray); + + } else { + + List commonList = Collections.emptyList(); + diff = new Diff(commonList, + Collections.singletonList(leftAlignmentList), + Collections.singletonList(rightAlignmentList)); + + } + + return diff; + + } + + private static void next(int[] indexArray, int[][] occurrenceArray) { + + for (int i = indexArray.length - 1; i >= 0; --i) { + if (indexArray[i] < occurrenceArray[i].length) { + ++indexArray[i]; + for (int k = i + 1; k < indexArray.length; ++k) { + indexArray[k] = 0; + } + return; + } + } + + throw new NoSuchElementException("There is no successor."); + + } + + private static boolean hasNext(int[] indexArray, int[][] occurrenceArray) { + + if (indexArray.length == 0) { + return false; + } + + for (int i = 0; i < indexArray.length; ++i) { + if (indexArray[i] < occurrenceArray[i].length) { + return true; + } + } + + return false; + + } + + private static boolean isValid(int[] indexArray, int[][] occurrenceArray) { + + int previousPosition = -1; + + for (int i = 0; i < indexArray.length; ++i) { + if (indexArray[i] < occurrenceArray[i].length) { + int currentPosition = occurrenceArray[i][indexArray[i]]; + if (currentPosition <= previousPosition) { + return false; + } + previousPosition = currentPosition; + } + } + + return true; + } + +*/ diff --git a/src/net/sourceforge/align/comparator/ComparatorTest.java b/src/net/sourceforge/align/comparator/ComparatorTest.java new file mode 100755 index 0000000..cad3add --- /dev/null +++ b/src/net/sourceforge/align/comparator/ComparatorTest.java @@ -0,0 +1,125 @@ +package net.sourceforge.align.comparator; + +import static net.sourceforge.align.comparator.Comparator.compare; +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link Comparator} test. + * + * @author loomchild + */ +public class ComparatorTest { + + @Test + public void testEmpty() { + + List leftAlignmentList = Collections.singletonList( + new Alignment(new String[]{"a"}, new String[]{"b"})); + List rightAlignmentList = Collections.emptyList(); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + assertEquals(0, diff.getCommonList().size()); + + assertEquals(1, diff.getLeftGroupList().size()); + assertEquals(1, diff.getLeftGroupList().get(0).size()); + + assertEquals(1, diff.getRightGroupList().size()); + assertEquals(0, diff.getRightGroupList().get(0).size()); + + } + + @Test + public void testSimple() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + assertEquals(2, diff.getCommonList().size()); + assertEquals(rightAlignmentList.get(0), diff.getCommonList().get(0)); + assertEquals(rightAlignmentList.get(2), diff.getCommonList().get(1)); + + assertEquals(1, diff.getLeftGroupList().size()); + assertEquals(leftAlignmentList.subList(1, 2), diff.getLeftGroupList().get(0)); + + assertEquals(1, diff.getRightGroupList().size()); + assertEquals(rightAlignmentList.subList(1, 2), diff.getRightGroupList().get(0)); + + } + + @Test + public void testRepetitions() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + assertEquals(3, diff.getCommonList().size()); + assertEquals(rightAlignmentList.get(0), diff.getCommonList().get(0)); + assertEquals(rightAlignmentList.get(1), diff.getCommonList().get(1)); + assertEquals(rightAlignmentList.get(3), diff.getCommonList().get(2)); + + assertEquals(1, diff.getLeftGroupList().size()); + assertEquals(0, diff.getLeftGroupList().get(0).size()); + + assertEquals(1, diff.getRightGroupList().size()); + assertEquals(rightAlignmentList.subList(2, 3), diff.getRightGroupList().get(0)); + + } + + @Test + public void testInversions() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + assertEquals(2, diff.getCommonList().size()); + assertEquals(rightAlignmentList.get(1), diff.getCommonList().get(0)); + assertEquals(rightAlignmentList.get(2), diff.getCommonList().get(1)); + + assertEquals(2, diff.getLeftGroupList().size()); + assertEquals(0, diff.getLeftGroupList().get(0).size()); + assertEquals(leftAlignmentList.subList(1, 2), diff.getLeftGroupList().get(1)); + + assertEquals(2, diff.getRightGroupList().size()); + assertEquals(rightAlignmentList.subList(0, 1), diff.getRightGroupList().get(0)); + assertEquals(0, diff.getRightGroupList().get(1).size()); + + } + +} diff --git a/src/net/sourceforge/align/comparator/ComparatorTestSuite.java b/src/net/sourceforge/align/comparator/ComparatorTestSuite.java new file mode 100755 index 0000000..95861b5 --- /dev/null +++ b/src/net/sourceforge/align/comparator/ComparatorTestSuite.java @@ -0,0 +1,11 @@ +package net.sourceforge.align.comparator; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + ComparatorTest.class +}) +public class ComparatorTestSuite { +} diff --git a/src/net/sourceforge/align/comparator/Diff.java b/src/net/sourceforge/align/comparator/Diff.java new file mode 100755 index 0000000..5660749 --- /dev/null +++ b/src/net/sourceforge/align/comparator/Diff.java @@ -0,0 +1,88 @@ +package net.sourceforge.align.comparator; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + + +/** + * Represents the result of alignment compare. + * Contains common alignment list and non matching, corresponding left and right + * alignment list groups. Number of elements on leftList and rightList is equal. + * + * @author Jarek Lipski (loomchild) + */ +public class Diff { + + private List commonList; + + private List> leftGroupList; + + private List> rightGroupList; + + private List leftList; + + private List rightList; + + public Diff(List commonList, List> leftGroupList, + List> rightGroupList) { + + if (leftGroupList.size() != rightGroupList.size()) { + throw new IllegalArgumentException( + "Left and right list lengths must be equal."); + } + + this.commonList = commonList; + this.leftGroupList = leftGroupList; + this.rightGroupList = rightGroupList; + + this.leftList = mergeGroups(leftGroupList); + this.rightList = mergeGroups(rightGroupList); + + } + + private List mergeGroups(List> groupList) { + List list = new ArrayList(); + for (List alignmentList : groupList) { + list.addAll(alignmentList); + } + return list; + } + + /** + * @return Returns list common to left and right alignments. + */ + public List getCommonList() { + return commonList; + } + + /** + * @return Returns list of alignment groups occurring only in left list. + */ + public List> getLeftGroupList() { + return leftGroupList; + } + + /** + * @return Returns list of alignment groups occurring only in right list. + */ + public List> getRightGroupList() { + return rightGroupList; + } + + /** + * @return Returns list of alignments occurring only in left list. + */ + public List getLeftList() { + return leftList; + } + + /** + * @return Returns list of alignments occurring only in right list. + */ + public List getRightList() { + return rightList; + } + +} diff --git a/src/net/sourceforge/align/coretypes/.svn/all-wcprops b/src/net/sourceforge/align/coretypes/.svn/all-wcprops new file mode 100644 index 0000000..8216714 --- /dev/null +++ b/src/net/sourceforge/align/coretypes/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 76 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/coretypes +END +CategoryDefaults.java +K 25 +svn:wc:ra_dav:version-url +V 98 +/svnroot/align/!svn/ver/52/trunk/maligna/src/net/sourceforge/align/coretypes/CategoryDefaults.java +END +Category.java +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/coretypes/Category.java +END +AlignmentTest.java +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/coretypes/AlignmentTest.java +END +Alignment.java +K 25 +svn:wc:ra_dav:version-url +V 91 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/coretypes/Alignment.java +END diff --git a/src/net/sourceforge/align/coretypes/.svn/entries b/src/net/sourceforge/align/coretypes/.svn/entries new file mode 100644 index 0000000..4218b54 --- /dev/null +++ b/src/net/sourceforge/align/coretypes/.svn/entries @@ -0,0 +1,171 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/coretypes +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +Alignment.java +file + + + + +2010-11-11T10:16:09.000000Z +23413c0d1d692803ad5045cf125946c2 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +4558 + +AlignmentTest.java +file + + + + +2010-10-28T16:40:16.000000Z +50a704129d5eaacb32b2d12161914685 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1686 + +Category.java +file + + + + +2010-10-28T16:43:53.000000Z +00804d757598ecda97073d81f246dbe5 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +960 + +CategoryDefaults.java +file +52 + + + +2011-02-15T18:33:49.000000Z +2cb28a66da195c1aa62661da53795f95 +2011-02-16T09:43:39.607778Z +52 +jarekl + + + + + + + + + + + + + + + + + + + + + +1414 + diff --git a/src/net/sourceforge/align/coretypes/.svn/text-base/Alignment.java.svn-base b/src/net/sourceforge/align/coretypes/.svn/text-base/Alignment.java.svn-base new file mode 100644 index 0000000..8b23be0 --- /dev/null +++ b/src/net/sourceforge/align/coretypes/.svn/text-base/Alignment.java.svn-base @@ -0,0 +1,182 @@ +package net.sourceforge.align.coretypes; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + + +/** + * Represents a mapping of n segments in source text to m segments in target text. + * Responsible for storing the segment contents and alignment score equal to + * -ln(probability). + * + * @author Jarek Lipski (loomchild) + */ +public class Alignment { + + public static final float DEFAULT_SCORE = 0.0f; + + private List sourceSegmentList; + + private List targetSegmentList; + + private float score; + + /** + * Creates empty alignment (0 - 0) with default score equal to + * {@value #DEFAULT_SCORE}. + */ + public Alignment() { + this.sourceSegmentList = new ArrayList(); + this.targetSegmentList = new ArrayList(); + this.score = DEFAULT_SCORE; + } + + /** + * Creates alignment of a given list of source segments to a given list + * of target segments with a given score. Creates copies of the lists. + * + * @param sourceSegmentList Source segment list + * @param targetSegmentList Target segment list + * @param score Score of alignment + */ + public Alignment(List sourceSegmentList, + List targetSegmentList, float score) { + this(); + addSourceSegmentList(sourceSegmentList); + addTargetSegmentList(targetSegmentList); + this.score = score; + } + + /** + * Creates alignment of a given list of source segments to a given list + * of target segments with score equal to {@value #DEFAULT_SCORE}. + * Creates copies of the lists. + * + * @param sourceSegmentList Source segment list + * @param targetSegmentList Target segment list + */ + public Alignment(List sourceSegmentList, + List targetSegmentList) { + this(sourceSegmentList, targetSegmentList, DEFAULT_SCORE); + } + + public Alignment(String[] sourceSegmentArray, + String[] targetSegmentArray, float score) { + this(Arrays.asList(sourceSegmentArray), + Arrays.asList(targetSegmentArray), score); + } + + public Alignment(String[] sourceSegmentArray, + String[] targetSegmentArray) { + this(sourceSegmentArray, targetSegmentArray, DEFAULT_SCORE); + } + + /** + * Adds a segment to source segment list. + * @param segment Source segment + */ + public void addSourceSegment(String segment) { + sourceSegmentList.add(segment); + } + + /** + * Adds a list of segments to source segment list. + * @param segmentList Source segment list + */ + public void addSourceSegmentList(List segmentList) { + sourceSegmentList.addAll(segmentList); + } + + /** + * Adds a segment to target segment list. + * @param segment Target segment + */ + public void addTargetSegment(String segment) { + targetSegmentList.add(segment); + } + + /** + * Adds a list of segments to target segment list. + * @param segmentList Target segment list + */ + public void addTargetSegmentList(List segmentList) { + targetSegmentList.addAll(segmentList); + } + + /** + * @return Returns an unmodifiable source segment list + */ + public List getSourceSegmentList() { + return Collections.unmodifiableList(sourceSegmentList); + } + + /** + * @return Returns an unmodifiable target segment list + */ + public List getTargetSegmentList() { + return Collections.unmodifiableList(targetSegmentList); + } + + /** + * @return Returns alignment score. + */ + public float getScore() { + return score; + } + + /** + * Sets alignment score + * @param score Score + */ + public void setScore(float score) { + this.score = score; + } + + /** + * Retrieves alignment category (1-1, 2-1, etc.) + * @return category + */ + public Category getCategory() { + return new Category(sourceSegmentList.size(), targetSegmentList.size()); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime + * result + + ((sourceSegmentList == null) ? 0 : sourceSegmentList + .hashCode()); + result = prime + * result + + ((targetSegmentList == null) ? 0 : targetSegmentList + .hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Alignment other = (Alignment) obj; + if (sourceSegmentList == null) { + if (other.sourceSegmentList != null) + return false; + } else if (!sourceSegmentList.equals(other.sourceSegmentList)) + return false; + if (targetSegmentList == null) { + if (other.targetSegmentList != null) + return false; + } else if (!targetSegmentList.equals(other.targetSegmentList)) + return false; + return true; + } + +} diff --git a/src/net/sourceforge/align/coretypes/.svn/text-base/AlignmentTest.java.svn-base b/src/net/sourceforge/align/coretypes/.svn/text-base/AlignmentTest.java.svn-base new file mode 100644 index 0000000..86e817c --- /dev/null +++ b/src/net/sourceforge/align/coretypes/.svn/text-base/AlignmentTest.java.svn-base @@ -0,0 +1,62 @@ +package net.sourceforge.align.coretypes; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +/** + * Represents {@link Alignment} class test. + * @author loomchild + */ +public class AlignmentTest { + + private List sourceSegmentList; + + private List targetSegmentList; + + @Before + public void setUp() { + sourceSegmentList = new ArrayList(); + targetSegmentList = new ArrayList(); + } + + /** + * Tests whether after calling the constructor lists stored in + * {@link Alignment} are copies of the arguments. + */ + @Test + public void contructorListCopying() { + Alignment alignment = new Alignment(sourceSegmentList, + targetSegmentList, 2.0f); + checkAlignment(alignment); + } + + /** + * Tests whether after calling {@link Alignment#addSourceSegmentList(List)} + * and {@link Alignment#addTargetSegmentList(List)} methods, lists stored in + * {@link Alignment} are copies of the arguments. + */ + @Test + public void methodListCopying() { + Alignment alignment = new Alignment(); + alignment.addSourceSegmentList(sourceSegmentList); + alignment.addTargetSegmentList(targetSegmentList); + alignment.setScore(2.0f); + checkAlignment(alignment); + } + + private void checkAlignment(Alignment alignment) { + assertEquals(0, alignment.getSourceSegmentList().size()); + sourceSegmentList.add("a"); + assertEquals(0, alignment.getSourceSegmentList().size()); + assertEquals(0, alignment.getTargetSegmentList().size()); + targetSegmentList.add("c"); + assertEquals(0, alignment.getTargetSegmentList().size()); + assertEquals(2.0f, alignment.getScore(), 0.000000001f); + } + +} diff --git a/src/net/sourceforge/align/coretypes/.svn/text-base/Category.java.svn-base b/src/net/sourceforge/align/coretypes/.svn/text-base/Category.java.svn-base new file mode 100644 index 0000000..2ad974d --- /dev/null +++ b/src/net/sourceforge/align/coretypes/.svn/text-base/Category.java.svn-base @@ -0,0 +1,41 @@ +package net.sourceforge.align.coretypes; + +/** + * Represents alignment category - for example one source segment to + * one target segment (1-1), two source segments to zero target segments (2-0), + * etc. + * + * Immutable - cannot be modified once it is created. + * + * @author Jarek Lipski (loomchild) + */ +public class Category { + + private int sourceSegmentCount; + + private int targetSegmentCount; + + public Category(int sourceSegmentCount, int targetSegmentCount) { + this.sourceSegmentCount = sourceSegmentCount; + this.targetSegmentCount = targetSegmentCount; + } + + /** + * @return Returns count of source segments in this category. + */ + public int getSourceSegmentCount() { + return sourceSegmentCount; + } + + /** + * @return Returns count of target segments in this category. + */ + public int getTargetSegmentCount() { + return targetSegmentCount; + } + + public String toString() { + return "(" + sourceSegmentCount + "-" + targetSegmentCount + ")"; + } + +} diff --git a/src/net/sourceforge/align/coretypes/.svn/text-base/CategoryDefaults.java.svn-base b/src/net/sourceforge/align/coretypes/.svn/text-base/CategoryDefaults.java.svn-base new file mode 100644 index 0000000..19e7ab4 --- /dev/null +++ b/src/net/sourceforge/align/coretypes/.svn/text-base/CategoryDefaults.java.svn-base @@ -0,0 +1,45 @@ +package net.sourceforge.align.coretypes; + +import java.util.HashMap; +import java.util.Map; + +import net.sourceforge.align.util.Util; + +/** + * Responsible for storing default categories with scores (-ln probability) + * of occurrence of alignment of this category measured experimentally in some + * test corpus. + */ +public class CategoryDefaults { + + public static final Map BEST_CATEGORY_MAP = + createBestCategoryMap(); + + private static Map createBestCategoryMap() { + Map map = new HashMap(); + + map.put(new Category(1, 1), (float)Util.toScore(0.9)); + map.put(new Category(1, 0), (float)Util.toScore(0.005)); + map.put(new Category(0, 1), (float)Util.toScore(0.005)); + map.put(new Category(2, 1), (float)Util.toScore(0.045)); + map.put(new Category(1, 2), (float)Util.toScore(0.045)); + + return map; + } + + public static final Map MOORE_CATEGORY_MAP = + createMooreCategoryMap(); + + private static Map createMooreCategoryMap() { + Map map = new HashMap(); + + map.put(new Category(1, 1), (float)Util.toScore(0.94)); + map.put(new Category(1, 0), (float)Util.toScore(0.01)); + map.put(new Category(0, 1), (float)Util.toScore(0.01)); + map.put(new Category(2, 1), (float)Util.toScore(0.02)); + map.put(new Category(1, 2), (float)Util.toScore(0.02)); + + return map; + } + +} diff --git a/src/net/sourceforge/align/coretypes/Alignment.java b/src/net/sourceforge/align/coretypes/Alignment.java new file mode 100755 index 0000000..8b23be0 --- /dev/null +++ b/src/net/sourceforge/align/coretypes/Alignment.java @@ -0,0 +1,182 @@ +package net.sourceforge.align.coretypes; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + + +/** + * Represents a mapping of n segments in source text to m segments in target text. + * Responsible for storing the segment contents and alignment score equal to + * -ln(probability). + * + * @author Jarek Lipski (loomchild) + */ +public class Alignment { + + public static final float DEFAULT_SCORE = 0.0f; + + private List sourceSegmentList; + + private List targetSegmentList; + + private float score; + + /** + * Creates empty alignment (0 - 0) with default score equal to + * {@value #DEFAULT_SCORE}. + */ + public Alignment() { + this.sourceSegmentList = new ArrayList(); + this.targetSegmentList = new ArrayList(); + this.score = DEFAULT_SCORE; + } + + /** + * Creates alignment of a given list of source segments to a given list + * of target segments with a given score. Creates copies of the lists. + * + * @param sourceSegmentList Source segment list + * @param targetSegmentList Target segment list + * @param score Score of alignment + */ + public Alignment(List sourceSegmentList, + List targetSegmentList, float score) { + this(); + addSourceSegmentList(sourceSegmentList); + addTargetSegmentList(targetSegmentList); + this.score = score; + } + + /** + * Creates alignment of a given list of source segments to a given list + * of target segments with score equal to {@value #DEFAULT_SCORE}. + * Creates copies of the lists. + * + * @param sourceSegmentList Source segment list + * @param targetSegmentList Target segment list + */ + public Alignment(List sourceSegmentList, + List targetSegmentList) { + this(sourceSegmentList, targetSegmentList, DEFAULT_SCORE); + } + + public Alignment(String[] sourceSegmentArray, + String[] targetSegmentArray, float score) { + this(Arrays.asList(sourceSegmentArray), + Arrays.asList(targetSegmentArray), score); + } + + public Alignment(String[] sourceSegmentArray, + String[] targetSegmentArray) { + this(sourceSegmentArray, targetSegmentArray, DEFAULT_SCORE); + } + + /** + * Adds a segment to source segment list. + * @param segment Source segment + */ + public void addSourceSegment(String segment) { + sourceSegmentList.add(segment); + } + + /** + * Adds a list of segments to source segment list. + * @param segmentList Source segment list + */ + public void addSourceSegmentList(List segmentList) { + sourceSegmentList.addAll(segmentList); + } + + /** + * Adds a segment to target segment list. + * @param segment Target segment + */ + public void addTargetSegment(String segment) { + targetSegmentList.add(segment); + } + + /** + * Adds a list of segments to target segment list. + * @param segmentList Target segment list + */ + public void addTargetSegmentList(List segmentList) { + targetSegmentList.addAll(segmentList); + } + + /** + * @return Returns an unmodifiable source segment list + */ + public List getSourceSegmentList() { + return Collections.unmodifiableList(sourceSegmentList); + } + + /** + * @return Returns an unmodifiable target segment list + */ + public List getTargetSegmentList() { + return Collections.unmodifiableList(targetSegmentList); + } + + /** + * @return Returns alignment score. + */ + public float getScore() { + return score; + } + + /** + * Sets alignment score + * @param score Score + */ + public void setScore(float score) { + this.score = score; + } + + /** + * Retrieves alignment category (1-1, 2-1, etc.) + * @return category + */ + public Category getCategory() { + return new Category(sourceSegmentList.size(), targetSegmentList.size()); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime + * result + + ((sourceSegmentList == null) ? 0 : sourceSegmentList + .hashCode()); + result = prime + * result + + ((targetSegmentList == null) ? 0 : targetSegmentList + .hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Alignment other = (Alignment) obj; + if (sourceSegmentList == null) { + if (other.sourceSegmentList != null) + return false; + } else if (!sourceSegmentList.equals(other.sourceSegmentList)) + return false; + if (targetSegmentList == null) { + if (other.targetSegmentList != null) + return false; + } else if (!targetSegmentList.equals(other.targetSegmentList)) + return false; + return true; + } + +} diff --git a/src/net/sourceforge/align/coretypes/AlignmentTest.java b/src/net/sourceforge/align/coretypes/AlignmentTest.java new file mode 100755 index 0000000..86e817c --- /dev/null +++ b/src/net/sourceforge/align/coretypes/AlignmentTest.java @@ -0,0 +1,62 @@ +package net.sourceforge.align.coretypes; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +/** + * Represents {@link Alignment} class test. + * @author loomchild + */ +public class AlignmentTest { + + private List sourceSegmentList; + + private List targetSegmentList; + + @Before + public void setUp() { + sourceSegmentList = new ArrayList(); + targetSegmentList = new ArrayList(); + } + + /** + * Tests whether after calling the constructor lists stored in + * {@link Alignment} are copies of the arguments. + */ + @Test + public void contructorListCopying() { + Alignment alignment = new Alignment(sourceSegmentList, + targetSegmentList, 2.0f); + checkAlignment(alignment); + } + + /** + * Tests whether after calling {@link Alignment#addSourceSegmentList(List)} + * and {@link Alignment#addTargetSegmentList(List)} methods, lists stored in + * {@link Alignment} are copies of the arguments. + */ + @Test + public void methodListCopying() { + Alignment alignment = new Alignment(); + alignment.addSourceSegmentList(sourceSegmentList); + alignment.addTargetSegmentList(targetSegmentList); + alignment.setScore(2.0f); + checkAlignment(alignment); + } + + private void checkAlignment(Alignment alignment) { + assertEquals(0, alignment.getSourceSegmentList().size()); + sourceSegmentList.add("a"); + assertEquals(0, alignment.getSourceSegmentList().size()); + assertEquals(0, alignment.getTargetSegmentList().size()); + targetSegmentList.add("c"); + assertEquals(0, alignment.getTargetSegmentList().size()); + assertEquals(2.0f, alignment.getScore(), 0.000000001f); + } + +} diff --git a/src/net/sourceforge/align/coretypes/Category.java b/src/net/sourceforge/align/coretypes/Category.java new file mode 100755 index 0000000..2ad974d --- /dev/null +++ b/src/net/sourceforge/align/coretypes/Category.java @@ -0,0 +1,41 @@ +package net.sourceforge.align.coretypes; + +/** + * Represents alignment category - for example one source segment to + * one target segment (1-1), two source segments to zero target segments (2-0), + * etc. + * + * Immutable - cannot be modified once it is created. + * + * @author Jarek Lipski (loomchild) + */ +public class Category { + + private int sourceSegmentCount; + + private int targetSegmentCount; + + public Category(int sourceSegmentCount, int targetSegmentCount) { + this.sourceSegmentCount = sourceSegmentCount; + this.targetSegmentCount = targetSegmentCount; + } + + /** + * @return Returns count of source segments in this category. + */ + public int getSourceSegmentCount() { + return sourceSegmentCount; + } + + /** + * @return Returns count of target segments in this category. + */ + public int getTargetSegmentCount() { + return targetSegmentCount; + } + + public String toString() { + return "(" + sourceSegmentCount + "-" + targetSegmentCount + ")"; + } + +} diff --git a/src/net/sourceforge/align/coretypes/CategoryDefaults.java b/src/net/sourceforge/align/coretypes/CategoryDefaults.java new file mode 100644 index 0000000..19e7ab4 --- /dev/null +++ b/src/net/sourceforge/align/coretypes/CategoryDefaults.java @@ -0,0 +1,45 @@ +package net.sourceforge.align.coretypes; + +import java.util.HashMap; +import java.util.Map; + +import net.sourceforge.align.util.Util; + +/** + * Responsible for storing default categories with scores (-ln probability) + * of occurrence of alignment of this category measured experimentally in some + * test corpus. + */ +public class CategoryDefaults { + + public static final Map BEST_CATEGORY_MAP = + createBestCategoryMap(); + + private static Map createBestCategoryMap() { + Map map = new HashMap(); + + map.put(new Category(1, 1), (float)Util.toScore(0.9)); + map.put(new Category(1, 0), (float)Util.toScore(0.005)); + map.put(new Category(0, 1), (float)Util.toScore(0.005)); + map.put(new Category(2, 1), (float)Util.toScore(0.045)); + map.put(new Category(1, 2), (float)Util.toScore(0.045)); + + return map; + } + + public static final Map MOORE_CATEGORY_MAP = + createMooreCategoryMap(); + + private static Map createMooreCategoryMap() { + Map map = new HashMap(); + + map.put(new Category(1, 1), (float)Util.toScore(0.94)); + map.put(new Category(1, 0), (float)Util.toScore(0.01)); + map.put(new Category(0, 1), (float)Util.toScore(0.01)); + map.put(new Category(2, 1), (float)Util.toScore(0.02)); + map.put(new Category(1, 2), (float)Util.toScore(0.02)); + + return map; + } + +} diff --git a/src/net/sourceforge/align/filter/.svn/all-wcprops b/src/net/sourceforge/align/filter/.svn/all-wcprops new file mode 100644 index 0000000..8d7a41f --- /dev/null +++ b/src/net/sourceforge/align/filter/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 73 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter +END +FilterTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 94 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/FilterTestSuite.java +END +Filter.java +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/Filter.java +END diff --git a/src/net/sourceforge/align/filter/.svn/entries b/src/net/sourceforge/align/filter/.svn/entries new file mode 100644 index 0000000..f823a1d --- /dev/null +++ b/src/net/sourceforge/align/filter/.svn/entries @@ -0,0 +1,111 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Filter.java +file + + + + +2010-10-28T16:40:14.000000Z +ecad05cccd431df9b19113e97ba63344 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +912 + +FilterTestSuite.java +file + + + + +2010-12-02T07:43:35.000000Z +3a6f37d1dbb0c52fef7052bf8b6d4fca +2010-12-02T11:07:14.247557Z +50 +jarekl + + + + + + + + + + + + + + + + + + + + + +728 + +aligner +dir + +macro +dir + +meta +dir + +modifier +dir + +selector +dir + diff --git a/src/net/sourceforge/align/filter/.svn/text-base/Filter.java.svn-base b/src/net/sourceforge/align/filter/.svn/text-base/Filter.java.svn-base new file mode 100644 index 0000000..68bfa47 --- /dev/null +++ b/src/net/sourceforge/align/filter/.svn/text-base/Filter.java.svn-base @@ -0,0 +1,30 @@ +package net.sourceforge.align.filter; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + + +/** + *

Represents alignment list filter (in a sense of UNIX filter).

+ *

Allows to perform any operation on alignment list (not only, like name + * suggests, filter elements from it) - for example it can modify segment + * contents, join or split alignments, etc.

+ *

+ * Filter operation receives alignment list as a parameter and returns + * modified alignment list. Thanks to the fact that input and output has the + * same type filters can be connected together creating the operation pipeline. + *

+ * + * @author Jarek Lipski (loomchild) + */ +public interface Filter { + + /** + * Performs any transformation on alignment list. + * @param alignmentList input alignment list + * @return output alignment list + */ + public List apply(List alignmentList); + +} diff --git a/src/net/sourceforge/align/filter/.svn/text-base/FilterTestSuite.java.svn-base b/src/net/sourceforge/align/filter/.svn/text-base/FilterTestSuite.java.svn-base new file mode 100644 index 0000000..6dfc6c8 --- /dev/null +++ b/src/net/sourceforge/align/filter/.svn/text-base/FilterTestSuite.java.svn-base @@ -0,0 +1,23 @@ +package net.sourceforge.align.filter; + +import net.sourceforge.align.filter.aligner.AlignerTestSuite; +import net.sourceforge.align.filter.macro.MacroTestSuite; +import net.sourceforge.align.filter.meta.MetaTestSuite; +import net.sourceforge.align.filter.modifier.ModifierTestSuite; +import net.sourceforge.align.filter.selector.SelectorTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents test suite covering all unit tests in filter package and its + * subpackages. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + SelectorTestSuite.class, ModifierTestSuite.class, AlignerTestSuite.class, + MacroTestSuite.class, MetaTestSuite.class +}) +public class FilterTestSuite { +} diff --git a/src/net/sourceforge/align/filter/Filter.java b/src/net/sourceforge/align/filter/Filter.java new file mode 100755 index 0000000..68bfa47 --- /dev/null +++ b/src/net/sourceforge/align/filter/Filter.java @@ -0,0 +1,30 @@ +package net.sourceforge.align.filter; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + + +/** + *

Represents alignment list filter (in a sense of UNIX filter).

+ *

Allows to perform any operation on alignment list (not only, like name + * suggests, filter elements from it) - for example it can modify segment + * contents, join or split alignments, etc.

+ *

+ * Filter operation receives alignment list as a parameter and returns + * modified alignment list. Thanks to the fact that input and output has the + * same type filters can be connected together creating the operation pipeline. + *

+ * + * @author Jarek Lipski (loomchild) + */ +public interface Filter { + + /** + * Performs any transformation on alignment list. + * @param alignmentList input alignment list + * @return output alignment list + */ + public List apply(List alignmentList); + +} diff --git a/src/net/sourceforge/align/filter/FilterTestSuite.java b/src/net/sourceforge/align/filter/FilterTestSuite.java new file mode 100755 index 0000000..6dfc6c8 --- /dev/null +++ b/src/net/sourceforge/align/filter/FilterTestSuite.java @@ -0,0 +1,23 @@ +package net.sourceforge.align.filter; + +import net.sourceforge.align.filter.aligner.AlignerTestSuite; +import net.sourceforge.align.filter.macro.MacroTestSuite; +import net.sourceforge.align.filter.meta.MetaTestSuite; +import net.sourceforge.align.filter.modifier.ModifierTestSuite; +import net.sourceforge.align.filter.selector.SelectorTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents test suite covering all unit tests in filter package and its + * subpackages. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + SelectorTestSuite.class, ModifierTestSuite.class, AlignerTestSuite.class, + MacroTestSuite.class, MetaTestSuite.class +}) +public class FilterTestSuite { +} diff --git a/src/net/sourceforge/align/filter/aligner/.svn/all-wcprops b/src/net/sourceforge/align/filter/aligner/.svn/all-wcprops new file mode 100644 index 0000000..df666fc --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/.svn/all-wcprops @@ -0,0 +1,41 @@ +K 25 +svn:wc:ra_dav:version-url +V 81 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/aligner +END +AlignerTest.java +K 25 +svn:wc:ra_dav:version-url +V 98 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/AlignerTest.java +END +Aligner.java +K 25 +svn:wc:ra_dav:version-url +V 94 +/svnroot/align/!svn/ver/56/trunk/maligna/src/net/sourceforge/align/filter/aligner/Aligner.java +END +AlignmentImpossibleException.java +K 25 +svn:wc:ra_dav:version-url +V 115 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/AlignmentImpossibleException.java +END +AlignerTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/AlignerTestSuite.java +END +UnifyAligner.java +K 25 +svn:wc:ra_dav:version-url +V 99 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/UnifyAligner.java +END +UnifyAlignerTest.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/UnifyAlignerTest.java +END diff --git a/src/net/sourceforge/align/filter/aligner/.svn/entries b/src/net/sourceforge/align/filter/aligner/.svn/entries new file mode 100644 index 0000000..b2046b7 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/.svn/entries @@ -0,0 +1,235 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/aligner +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Aligner.java +file +56 + + + +2011-06-17T17:19:00.000000Z +78f23b99ff6618f7806e0b183bbc1a4a +2011-10-21T11:38:21.267762Z +56 +jarekl + + + + + + + + + + + + + + + + + + + + + +1405 + +AlignerTest.java +file + + + + +2010-10-28T16:40:13.000000Z +23e688dc8334dbe73494fe3d0628fafb +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1669 + +AlignmentImpossibleException.java +file + + + + +2010-10-26T07:37:49.000000Z +3d47e3b3ea85e2978d4163de40e80e29 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +895 + +align +dir + +AlignerTestSuite.java +file + + + + +2010-10-25T17:44:51.000000Z +0dacd77ab4e6fa072df4f3aefbb90ccd +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +433 + +UnifyAligner.java +file + + + + +2010-10-28T16:40:14.000000Z +c1bf475982b988a0c315009523006289 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +3469 + +UnifyAlignerTest.java +file + + + + +2010-10-28T16:40:14.000000Z +7011caf202d4eb469a5b8da764108223 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1913 + diff --git a/src/net/sourceforge/align/filter/aligner/.svn/text-base/Aligner.java.svn-base b/src/net/sourceforge/align/filter/aligner/.svn/text-base/Aligner.java.svn-base new file mode 100644 index 0000000..6e3d333 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/.svn/text-base/Aligner.java.svn-base @@ -0,0 +1,44 @@ +package net.sourceforge.align.filter.aligner; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; + + +/** + * Represents aligner - for each alignment on input list aligns source segments + * with target segments and appends obtained list of alignments to the result. + * This implies that resulting list can have more alignments than input list + * but cannot have less. Does not change alignment contents. + * + * @author Jarek Lipski (loomchild) + */ +public class Aligner implements Filter { + + private AlignAlgorithm algorithm; + + public Aligner(AlignAlgorithm algorithm) { + this.algorithm = algorithm; + } + + /** + * For each alignment on input list aligns source segments with target + * segments, and appends the obtained alignment list to the result. + * @throws AlignmentImpossibleException when it is not possible to align + * texts + */ + public List apply(List alignmentList) { + List newAlignmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + List currentAlignmentList = + algorithm.align(alignment.getSourceSegmentList(), + alignment.getTargetSegmentList()); + newAlignmentList.addAll(currentAlignmentList); + } + return newAlignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignerTest.java.svn-base b/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignerTest.java.svn-base new file mode 100644 index 0000000..d829d07 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignerTest.java.svn-base @@ -0,0 +1,58 @@ +package net.sourceforge.align.filter.aligner; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithmMock; + +import org.junit.Test; + +/** + * Represents unit test of {@link Aligner} class. Checks if it applies + * {@link AlignAlgorithm} correctly using {@link AlignAlgorithmMock}. + * @author loomchild + */ +public class AlignerTest { + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"a", "b", "c", "d"}, + new String[] {"e", "f"} + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"1", "2", "3"}, + new String[] {"4"} + }; + + public static final String[][] EXPECTED_SOURCE_SEGMENT_ARRAY = { + new String[] {"a", "b"}, + new String[] {"c", "d"}, + new String[] {"e", "f"}, + }; + + public static final String[][] EXPECTED_TARGET_SEGMENT_ARRAY = { + new String[] {"1", "2"}, + new String[] {"3"}, + new String[] {"4"}, + }; + + /** + * Checks if {@link Aligner} uses {@link AlignAlgorithm} correctly. + */ + @Test + public void testAlign() { + AlignAlgorithm algorithm = new AlignAlgorithmMock(2); + Aligner aligner = new Aligner(algorithm); + List alignmentList = createAlignmentList( + SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY); + List resultAlignmentList = aligner.apply(alignmentList); + assertAlignmentListEquals(EXPECTED_SOURCE_SEGMENT_ARRAY, + EXPECTED_TARGET_SEGMENT_ARRAY, resultAlignmentList); + } + +} + diff --git a/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignerTestSuite.java.svn-base b/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignerTestSuite.java.svn-base new file mode 100644 index 0000000..e5abd4f --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignerTestSuite.java.svn-base @@ -0,0 +1,18 @@ +package net.sourceforge.align.filter.aligner; + +import net.sourceforge.align.filter.aligner.align.AlignAlgorithmTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Represents unit test suite for filter.aligner package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlignerTest.class, UnifyAlignerTest.class, AlignAlgorithmTestSuite.class +}) +public class AlignerTestSuite { +} diff --git a/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignmentImpossibleException.java.svn-base b/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignmentImpossibleException.java.svn-base new file mode 100644 index 0000000..6d1bfc6 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/.svn/text-base/AlignmentImpossibleException.java.svn-base @@ -0,0 +1,30 @@ +package net.sourceforge.align.filter.aligner; + +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.onetoone.OneToOneAlgorithm; + + +/** + * Represents an exception used by {@link AlignAlgorithm} to indicate that text + * alignment is impossible. + * + * It is thrown for example when using {@link OneToOneAlgorithm} but the text + * does not have equal number of source and target alignments, text is too + * short to apply given algorithm, segment counts are different + * in reference and input alignments in {@link UnifyAligner}, etc. + * + * @author Jarek Lipski (loomchild) + */ +public class AlignmentImpossibleException extends RuntimeException { + + private static final long serialVersionUID = 101L; + + /** + * Creates an exception. + * @param message + */ + public AlignmentImpossibleException(String message) { + super(message); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/.svn/text-base/UnifyAligner.java.svn-base b/src/net/sourceforge/align/filter/aligner/.svn/text-base/UnifyAligner.java.svn-base new file mode 100644 index 0000000..cf82ac3 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/.svn/text-base/UnifyAligner.java.svn-base @@ -0,0 +1,95 @@ +package net.sourceforge.align.filter.aligner; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.macro.MooreMacro; + + +/** + *

Represents an aligner that aligns analogously to given reference alignment, + * which means numbers of source and target segments in resulting list + * will be the same as in reference alignment. This implies that numbers of + * source and target segments must be identical in reference and input + * alignments. Additionally scores are copied from reference alignment to + * output alignments.

+ * + *

Useful when to perform an alignment it is required to modify or + * destroy segment contents (tokenization, stemming, removal of rare words, + * etc. - see {@link MooreMacro}). After that the original input can be unified with + * damaged alignment list to obtain the undamaged result but aligned + * correctly.

+ * + * @author loomchild + */ +public class UnifyAligner implements Filter { + + private List referenceAlignmentList; + + public UnifyAligner(List referenceAlignmentList) { + this.referenceAlignmentList = referenceAlignmentList; + } + + /** + * Creates alignment list in which numbers of source and target segments + * in subsequent alignments are the same as in reference alignments + * (but the segment contents come from input alignment list). + * Also copies scores from reference alignment list to output alignment + * list. + * + * @param alignmentList input alignment list + * @return alignment list unified with reference alignment + * @throws AlignmentImpossibleException when numbers of source or target + * segments in input alignment list are different than on + * reference alignment list + */ + public List apply(List alignmentList) { + + List sourceSegmentList = new ArrayList(); + List targetSegmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + sourceSegmentList.addAll(alignment.getSourceSegmentList()); + targetSegmentList.addAll(alignment.getTargetSegmentList()); + } + + Iterator sourceSegmentIterator = sourceSegmentList.iterator(); + Iterator targetSegmentIterator = targetSegmentList.iterator(); + List newAlignmentList = + new ArrayList(referenceAlignmentList.size()); + for (Alignment alignment : referenceAlignmentList) { + List newSourceSegmentList = getSegmentList( + sourceSegmentIterator, + alignment.getSourceSegmentList().size()); + List newTargetSegmentList = getSegmentList( + targetSegmentIterator, + alignment.getTargetSegmentList().size()); + Alignment newAlignment = + new Alignment(newSourceSegmentList, newTargetSegmentList, + alignment.getScore()); + newAlignmentList.add(newAlignment); + } + + return newAlignmentList; + + } + + private List getSegmentList(Iterator segmentIterator, + int size) { + List segmentList = new ArrayList(size); + for (int i = 0; i < size; ++i) { + try { + String segment = segmentIterator.next(); + segmentList.add(segment); + } catch (NoSuchElementException e) { + throw new AlignmentImpossibleException("Segment counts in input " + + "and reference alignment lists are not equal."); + } + } + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/.svn/text-base/UnifyAlignerTest.java.svn-base b/src/net/sourceforge/align/filter/aligner/.svn/text-base/UnifyAlignerTest.java.svn-base new file mode 100644 index 0000000..40d43ed --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/.svn/text-base/UnifyAlignerTest.java.svn-base @@ -0,0 +1,71 @@ +package net.sourceforge.align.filter.aligner; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link UnifyAligner} unit test. + * @author loomchild + * + */ +public class UnifyAlignerTest { + + public static final String[][] REFERENCE_SOURCE_SEGMENT_ARRAY = { + new String[] {"", ""}, + new String[] {"", "", ""}, + new String[] {""}, + }; + + public static final String[][] REFERENCE_TARGET_SEGMENT_ARRAY = { + new String[] {""}, + new String[] {""}, + new String[] {"", ""}, + }; + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"a", "b", "c", "d"}, + new String[] {"e", "f"} + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"1", "2", "3"}, + new String[] {"4"} + }; + + public static final String[][] EXPECTED_SOURCE_SEGMENT_ARRAY = { + new String[] {"a", "b"}, + new String[] {"c", "d", "e"}, + new String[] {"f"}, + }; + + public static final String[][] EXPECTED_TARGET_SEGMENT_ARRAY = { + new String[] {"1"}, + new String[] {"2"}, + new String[] {"3", "4"}, + }; + + /** + * Checks whether unify aligner works as expected using + * {@link #REFERENCE_SOURCE_SEGMENT_ARRAY}, + * {@link #REFERENCE_TARGET_SEGMENT_ARRAY}. + */ + @Test + public void testAlign() { + List referenceAlignmentList = createAlignmentList( + REFERENCE_SOURCE_SEGMENT_ARRAY, REFERENCE_TARGET_SEGMENT_ARRAY); + UnifyAligner aligner = new UnifyAligner(referenceAlignmentList); + List alignmentList = createAlignmentList( + SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY); + List resultAlignmentList = aligner.apply(alignmentList); + assertAlignmentListEquals(EXPECTED_SOURCE_SEGMENT_ARRAY, + EXPECTED_TARGET_SEGMENT_ARRAY, resultAlignmentList); + } + +} + diff --git a/src/net/sourceforge/align/filter/aligner/Aligner.java b/src/net/sourceforge/align/filter/aligner/Aligner.java new file mode 100755 index 0000000..6e3d333 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/Aligner.java @@ -0,0 +1,44 @@ +package net.sourceforge.align.filter.aligner; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; + + +/** + * Represents aligner - for each alignment on input list aligns source segments + * with target segments and appends obtained list of alignments to the result. + * This implies that resulting list can have more alignments than input list + * but cannot have less. Does not change alignment contents. + * + * @author Jarek Lipski (loomchild) + */ +public class Aligner implements Filter { + + private AlignAlgorithm algorithm; + + public Aligner(AlignAlgorithm algorithm) { + this.algorithm = algorithm; + } + + /** + * For each alignment on input list aligns source segments with target + * segments, and appends the obtained alignment list to the result. + * @throws AlignmentImpossibleException when it is not possible to align + * texts + */ + public List apply(List alignmentList) { + List newAlignmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + List currentAlignmentList = + algorithm.align(alignment.getSourceSegmentList(), + alignment.getTargetSegmentList()); + newAlignmentList.addAll(currentAlignmentList); + } + return newAlignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/AlignerTest.java b/src/net/sourceforge/align/filter/aligner/AlignerTest.java new file mode 100755 index 0000000..d829d07 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/AlignerTest.java @@ -0,0 +1,58 @@ +package net.sourceforge.align.filter.aligner; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithmMock; + +import org.junit.Test; + +/** + * Represents unit test of {@link Aligner} class. Checks if it applies + * {@link AlignAlgorithm} correctly using {@link AlignAlgorithmMock}. + * @author loomchild + */ +public class AlignerTest { + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"a", "b", "c", "d"}, + new String[] {"e", "f"} + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"1", "2", "3"}, + new String[] {"4"} + }; + + public static final String[][] EXPECTED_SOURCE_SEGMENT_ARRAY = { + new String[] {"a", "b"}, + new String[] {"c", "d"}, + new String[] {"e", "f"}, + }; + + public static final String[][] EXPECTED_TARGET_SEGMENT_ARRAY = { + new String[] {"1", "2"}, + new String[] {"3"}, + new String[] {"4"}, + }; + + /** + * Checks if {@link Aligner} uses {@link AlignAlgorithm} correctly. + */ + @Test + public void testAlign() { + AlignAlgorithm algorithm = new AlignAlgorithmMock(2); + Aligner aligner = new Aligner(algorithm); + List alignmentList = createAlignmentList( + SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY); + List resultAlignmentList = aligner.apply(alignmentList); + assertAlignmentListEquals(EXPECTED_SOURCE_SEGMENT_ARRAY, + EXPECTED_TARGET_SEGMENT_ARRAY, resultAlignmentList); + } + +} + diff --git a/src/net/sourceforge/align/filter/aligner/AlignerTestSuite.java b/src/net/sourceforge/align/filter/aligner/AlignerTestSuite.java new file mode 100755 index 0000000..e5abd4f --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/AlignerTestSuite.java @@ -0,0 +1,18 @@ +package net.sourceforge.align.filter.aligner; + +import net.sourceforge.align.filter.aligner.align.AlignAlgorithmTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Represents unit test suite for filter.aligner package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlignerTest.class, UnifyAlignerTest.class, AlignAlgorithmTestSuite.class +}) +public class AlignerTestSuite { +} diff --git a/src/net/sourceforge/align/filter/aligner/AlignmentImpossibleException.java b/src/net/sourceforge/align/filter/aligner/AlignmentImpossibleException.java new file mode 100755 index 0000000..6d1bfc6 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/AlignmentImpossibleException.java @@ -0,0 +1,30 @@ +package net.sourceforge.align.filter.aligner; + +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.onetoone.OneToOneAlgorithm; + + +/** + * Represents an exception used by {@link AlignAlgorithm} to indicate that text + * alignment is impossible. + * + * It is thrown for example when using {@link OneToOneAlgorithm} but the text + * does not have equal number of source and target alignments, text is too + * short to apply given algorithm, segment counts are different + * in reference and input alignments in {@link UnifyAligner}, etc. + * + * @author Jarek Lipski (loomchild) + */ +public class AlignmentImpossibleException extends RuntimeException { + + private static final long serialVersionUID = 101L; + + /** + * Creates an exception. + * @param message + */ + public AlignmentImpossibleException(String message) { + super(message); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/UnifyAligner.java b/src/net/sourceforge/align/filter/aligner/UnifyAligner.java new file mode 100755 index 0000000..cf82ac3 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/UnifyAligner.java @@ -0,0 +1,95 @@ +package net.sourceforge.align.filter.aligner; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.macro.MooreMacro; + + +/** + *

Represents an aligner that aligns analogously to given reference alignment, + * which means numbers of source and target segments in resulting list + * will be the same as in reference alignment. This implies that numbers of + * source and target segments must be identical in reference and input + * alignments. Additionally scores are copied from reference alignment to + * output alignments.

+ * + *

Useful when to perform an alignment it is required to modify or + * destroy segment contents (tokenization, stemming, removal of rare words, + * etc. - see {@link MooreMacro}). After that the original input can be unified with + * damaged alignment list to obtain the undamaged result but aligned + * correctly.

+ * + * @author loomchild + */ +public class UnifyAligner implements Filter { + + private List referenceAlignmentList; + + public UnifyAligner(List referenceAlignmentList) { + this.referenceAlignmentList = referenceAlignmentList; + } + + /** + * Creates alignment list in which numbers of source and target segments + * in subsequent alignments are the same as in reference alignments + * (but the segment contents come from input alignment list). + * Also copies scores from reference alignment list to output alignment + * list. + * + * @param alignmentList input alignment list + * @return alignment list unified with reference alignment + * @throws AlignmentImpossibleException when numbers of source or target + * segments in input alignment list are different than on + * reference alignment list + */ + public List apply(List alignmentList) { + + List sourceSegmentList = new ArrayList(); + List targetSegmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + sourceSegmentList.addAll(alignment.getSourceSegmentList()); + targetSegmentList.addAll(alignment.getTargetSegmentList()); + } + + Iterator sourceSegmentIterator = sourceSegmentList.iterator(); + Iterator targetSegmentIterator = targetSegmentList.iterator(); + List newAlignmentList = + new ArrayList(referenceAlignmentList.size()); + for (Alignment alignment : referenceAlignmentList) { + List newSourceSegmentList = getSegmentList( + sourceSegmentIterator, + alignment.getSourceSegmentList().size()); + List newTargetSegmentList = getSegmentList( + targetSegmentIterator, + alignment.getTargetSegmentList().size()); + Alignment newAlignment = + new Alignment(newSourceSegmentList, newTargetSegmentList, + alignment.getScore()); + newAlignmentList.add(newAlignment); + } + + return newAlignmentList; + + } + + private List getSegmentList(Iterator segmentIterator, + int size) { + List segmentList = new ArrayList(size); + for (int i = 0; i < size; ++i) { + try { + String segment = segmentIterator.next(); + segmentList.add(segment); + } catch (NoSuchElementException e) { + throw new AlignmentImpossibleException("Segment counts in input " + + "and reference alignment lists are not equal."); + } + } + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/UnifyAlignerTest.java b/src/net/sourceforge/align/filter/aligner/UnifyAlignerTest.java new file mode 100755 index 0000000..40d43ed --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/UnifyAlignerTest.java @@ -0,0 +1,71 @@ +package net.sourceforge.align.filter.aligner; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link UnifyAligner} unit test. + * @author loomchild + * + */ +public class UnifyAlignerTest { + + public static final String[][] REFERENCE_SOURCE_SEGMENT_ARRAY = { + new String[] {"", ""}, + new String[] {"", "", ""}, + new String[] {""}, + }; + + public static final String[][] REFERENCE_TARGET_SEGMENT_ARRAY = { + new String[] {""}, + new String[] {""}, + new String[] {"", ""}, + }; + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"a", "b", "c", "d"}, + new String[] {"e", "f"} + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"1", "2", "3"}, + new String[] {"4"} + }; + + public static final String[][] EXPECTED_SOURCE_SEGMENT_ARRAY = { + new String[] {"a", "b"}, + new String[] {"c", "d", "e"}, + new String[] {"f"}, + }; + + public static final String[][] EXPECTED_TARGET_SEGMENT_ARRAY = { + new String[] {"1"}, + new String[] {"2"}, + new String[] {"3", "4"}, + }; + + /** + * Checks whether unify aligner works as expected using + * {@link #REFERENCE_SOURCE_SEGMENT_ARRAY}, + * {@link #REFERENCE_TARGET_SEGMENT_ARRAY}. + */ + @Test + public void testAlign() { + List referenceAlignmentList = createAlignmentList( + REFERENCE_SOURCE_SEGMENT_ARRAY, REFERENCE_TARGET_SEGMENT_ARRAY); + UnifyAligner aligner = new UnifyAligner(referenceAlignmentList); + List alignmentList = createAlignmentList( + SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY); + List resultAlignmentList = aligner.apply(alignmentList); + assertAlignmentListEquals(EXPECTED_SOURCE_SEGMENT_ARRAY, + EXPECTED_TARGET_SEGMENT_ARRAY, resultAlignmentList); + } + +} + diff --git a/src/net/sourceforge/align/filter/aligner/align/.svn/all-wcprops b/src/net/sourceforge/align/filter/aligner/align/.svn/all-wcprops new file mode 100644 index 0000000..2d3290d --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 87 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/aligner/align +END +AlignAlgorithmTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 116 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmTestSuite.java +END +AlignAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithm.java +END +AlignAlgorithmMockTest.java +K 25 +svn:wc:ra_dav:version-url +V 115 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMockTest.java +END +AlignAlgorithmMock.java +K 25 +svn:wc:ra_dav:version-url +V 111 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMock.java +END diff --git a/src/net/sourceforge/align/filter/aligner/align/.svn/entries b/src/net/sourceforge/align/filter/aligner/align/.svn/entries new file mode 100644 index 0000000..6863b2c --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/.svn/entries @@ -0,0 +1,170 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/aligner/align +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +AlignAlgorithm.java +file + + + + +2010-10-28T16:40:13.000000Z +f86eb070ea3be291f54bbadb39973233 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1324 + +AlignAlgorithmMock.java +file + + + + +2010-10-28T16:40:13.000000Z +ff03db670d7724c2ade67bb643edf254 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1929 + +AlignAlgorithmMockTest.java +file + + + + +2010-10-28T16:40:13.000000Z +5739b4d062a7bcc4a8fb1c76e7fc0c6d +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1982 + +AlignAlgorithmTestSuite.java +file + + + + +2010-11-13T18:10:23.000000Z +928c0b6811ec808fe4f962c38fc9fd61 +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + + + + + + + + +733 + +hmm +dir + +onetoone +dir + diff --git a/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithm.java.svn-base new file mode 100644 index 0000000..fb1c5b4 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithm.java.svn-base @@ -0,0 +1,36 @@ + package net.sourceforge.align.filter.aligner.align; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.AlignmentImpossibleException; + +/** + * Represents alignment algorithm. + * + * @author Jarek Lipski (loomchild) + */ +public interface AlignAlgorithm { + + /** + * Aligns source segment list with target segment list and returns a + * list of alignments. All segments on the input list will be + * present in resulting alignment in the same order as they were present + * on input lists. + * Alignments can be, one-to-zero, one-to-one, + * many-to-zero, many-to-one, many-to-many (see {@link Category} for lists + * of alignment categories for different aligners). + * If both lists are empty returns empty list. If one of the lists is + * empty returns only many-to-zero alignments (all-to-zero if possible). + * + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return alignment list containing all segments. + * @throws AlignmentImpossibleException when it is impossible to align + * given segments using this aligner + */ + public List align(List sourceSegmentList, + List targetSegmentList); + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmMock.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmMock.java.svn-base new file mode 100644 index 0000000..6c7e230 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmMock.java.svn-base @@ -0,0 +1,64 @@ +package net.sourceforge.align.filter.aligner.align; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.AlignmentImpossibleException; + +/** + * Align algorithm mock used for unit testing. + * Returns alignments with given number of source and target segments + * (if possible). + * + * @author Jarek Lipski (loomchild) + */ +public class AlignAlgorithmMock implements AlignAlgorithm { + + private int maxSegments; + + /** + * Creates aligner. + * @param maxSegments number of source / target segments in each alignment + */ + public AlignAlgorithmMock(int maxSegments) { + this.maxSegments = maxSegments; + } + + /** + * Aligns source segments to target segments. Resulting + * alignments will always be of n-n category (if there are enough segments), + * where n is configured max segments. + * + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return alignment list + * @throws AlignmentImpossibleException never thrown because alignment is + * always possible with this aligner + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + Iterator sourceIterator = sourceSegmentList.iterator(); + Iterator targetIterator = targetSegmentList.iterator(); + int maxSize = Math.max(sourceSegmentList.size(), + targetSegmentList.size()); + List alignmentList = new ArrayList(); + Alignment alignment = null; + for (int i = 0; i < maxSize; ++i) { + if (i % maxSegments == 0) { + alignment = new Alignment(); + alignmentList.add(alignment); + } + if (sourceIterator.hasNext()) { + alignment.addSourceSegment(sourceIterator.next()); + } + if (targetIterator.hasNext()) { + alignment.addTargetSegment(targetIterator.next()); + } + } + return alignmentList; + } + + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmMockTest.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmMockTest.java.svn-base new file mode 100644 index 0000000..b90714a --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmMockTest.java.svn-base @@ -0,0 +1,72 @@ +package net.sourceforge.align.filter.aligner.align; + +import static net.sourceforge.align.util.Util.assertAlignmentEquals; +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link AlignAlgorithmMock} unit test. + * @author loomchild + */ +public class AlignAlgorithmMockTest { + + /** + * Checks if aligning empty lists returns empty list. + */ + @Test + public void alignEmpty() { + AlignAlgorithm aligner = new AlignAlgorithmMock(2); + List segmentList = Collections.emptyList(); + List alignmentList = aligner.align(segmentList, segmentList); + assertEquals(0, alignmentList.size()); + } + + /** + * Checks whether mock aligner works as described. + */ + @Test + public void align() { + AlignAlgorithm aligner = new AlignAlgorithmMock(2); + String[][] sourceArray = new String[][]{ + new String[]{"a", "b"}, new String[]{"c","d"}, + new String[]{"e", "f"} + }; + String[][] targetArray = new String[][]{ + new String[]{"1", "2"}, new String[]{"3"}, new String[]{} + }; + assert sourceArray.length == targetArray.length; + int alignmentCount = sourceArray.length; + List sourceList = combine(sourceArray); + List targetList = combine(targetArray); + List alignmentList = aligner.align(sourceList, targetList); + assertEquals(alignmentCount, alignmentList.size()); + for (int i = 0; i < alignmentCount; ++i) { + assertAlignmentEquals(sourceArray[i], targetArray[i], + alignmentList.get(i)); + } + } + + /** + * Creates a list of strings containing all strings from input + * two dimensional array. + * @param array array + * @return list + */ + private List combine(String[][] array) { + List list = new ArrayList(); + for (String[] group : array) { + for (String element : group) { + list.add(element); + } + } + return list; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmTestSuite.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmTestSuite.java.svn-base new file mode 100644 index 0000000..255f83b --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/.svn/text-base/AlignAlgorithmTestSuite.java.svn-base @@ -0,0 +1,22 @@ +package net.sourceforge.align.filter.aligner.align; + +import junit.framework.TestSuite; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmTest; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithmTest; +import net.sourceforge.align.filter.aligner.align.onetoone.OneToOneAlgorithmTest; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents unit test suite for filter.aligner.align package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlignAlgorithmMockTest.class, OneToOneAlgorithmTest.class, + ViterbiAlgorithmTest.class, ForwardBackwardAlgorithmTest.class +}) +public class AlignAlgorithmTestSuite extends TestSuite { + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithm.java b/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithm.java new file mode 100755 index 0000000..fb1c5b4 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithm.java @@ -0,0 +1,36 @@ + package net.sourceforge.align.filter.aligner.align; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.AlignmentImpossibleException; + +/** + * Represents alignment algorithm. + * + * @author Jarek Lipski (loomchild) + */ +public interface AlignAlgorithm { + + /** + * Aligns source segment list with target segment list and returns a + * list of alignments. All segments on the input list will be + * present in resulting alignment in the same order as they were present + * on input lists. + * Alignments can be, one-to-zero, one-to-one, + * many-to-zero, many-to-one, many-to-many (see {@link Category} for lists + * of alignment categories for different aligners). + * If both lists are empty returns empty list. If one of the lists is + * empty returns only many-to-zero alignments (all-to-zero if possible). + * + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return alignment list containing all segments. + * @throws AlignmentImpossibleException when it is impossible to align + * given segments using this aligner + */ + public List align(List sourceSegmentList, + List targetSegmentList); + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMock.java b/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMock.java new file mode 100755 index 0000000..6c7e230 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMock.java @@ -0,0 +1,64 @@ +package net.sourceforge.align.filter.aligner.align; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.AlignmentImpossibleException; + +/** + * Align algorithm mock used for unit testing. + * Returns alignments with given number of source and target segments + * (if possible). + * + * @author Jarek Lipski (loomchild) + */ +public class AlignAlgorithmMock implements AlignAlgorithm { + + private int maxSegments; + + /** + * Creates aligner. + * @param maxSegments number of source / target segments in each alignment + */ + public AlignAlgorithmMock(int maxSegments) { + this.maxSegments = maxSegments; + } + + /** + * Aligns source segments to target segments. Resulting + * alignments will always be of n-n category (if there are enough segments), + * where n is configured max segments. + * + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return alignment list + * @throws AlignmentImpossibleException never thrown because alignment is + * always possible with this aligner + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + Iterator sourceIterator = sourceSegmentList.iterator(); + Iterator targetIterator = targetSegmentList.iterator(); + int maxSize = Math.max(sourceSegmentList.size(), + targetSegmentList.size()); + List alignmentList = new ArrayList(); + Alignment alignment = null; + for (int i = 0; i < maxSize; ++i) { + if (i % maxSegments == 0) { + alignment = new Alignment(); + alignmentList.add(alignment); + } + if (sourceIterator.hasNext()) { + alignment.addSourceSegment(sourceIterator.next()); + } + if (targetIterator.hasNext()) { + alignment.addTargetSegment(targetIterator.next()); + } + } + return alignmentList; + } + + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMockTest.java b/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMockTest.java new file mode 100755 index 0000000..b90714a --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmMockTest.java @@ -0,0 +1,72 @@ +package net.sourceforge.align.filter.aligner.align; + +import static net.sourceforge.align.util.Util.assertAlignmentEquals; +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link AlignAlgorithmMock} unit test. + * @author loomchild + */ +public class AlignAlgorithmMockTest { + + /** + * Checks if aligning empty lists returns empty list. + */ + @Test + public void alignEmpty() { + AlignAlgorithm aligner = new AlignAlgorithmMock(2); + List segmentList = Collections.emptyList(); + List alignmentList = aligner.align(segmentList, segmentList); + assertEquals(0, alignmentList.size()); + } + + /** + * Checks whether mock aligner works as described. + */ + @Test + public void align() { + AlignAlgorithm aligner = new AlignAlgorithmMock(2); + String[][] sourceArray = new String[][]{ + new String[]{"a", "b"}, new String[]{"c","d"}, + new String[]{"e", "f"} + }; + String[][] targetArray = new String[][]{ + new String[]{"1", "2"}, new String[]{"3"}, new String[]{} + }; + assert sourceArray.length == targetArray.length; + int alignmentCount = sourceArray.length; + List sourceList = combine(sourceArray); + List targetList = combine(targetArray); + List alignmentList = aligner.align(sourceList, targetList); + assertEquals(alignmentCount, alignmentList.size()); + for (int i = 0; i < alignmentCount; ++i) { + assertAlignmentEquals(sourceArray[i], targetArray[i], + alignmentList.get(i)); + } + } + + /** + * Creates a list of strings containing all strings from input + * two dimensional array. + * @param array array + * @return list + */ + private List combine(String[][] array) { + List list = new ArrayList(); + for (String[] group : array) { + for (String element : group) { + list.add(element); + } + } + return list; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmTestSuite.java b/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmTestSuite.java new file mode 100755 index 0000000..255f83b --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/AlignAlgorithmTestSuite.java @@ -0,0 +1,22 @@ +package net.sourceforge.align.filter.aligner.align; + +import junit.framework.TestSuite; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmTest; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithmTest; +import net.sourceforge.align.filter.aligner.align.onetoone.OneToOneAlgorithmTest; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents unit test suite for filter.aligner.align package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlignAlgorithmMockTest.class, OneToOneAlgorithmTest.class, + ViterbiAlgorithmTest.class, ForwardBackwardAlgorithmTest.class +}) +public class AlignAlgorithmTestSuite extends TestSuite { + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/all-wcprops b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/all-wcprops new file mode 100644 index 0000000..cc988bf --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 91 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm +END +HmmAlignAlgorithmFactory.java +K 25 +svn:wc:ra_dav:version-url +V 121 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmFactory.java +END +HmmAlignAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 118 +/svnroot/align/!svn/ver/52/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmTest.java +END +Util.java +K 25 +svn:wc:ra_dav:version-url +V 101 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/Util.java +END diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/entries b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/entries new file mode 100644 index 0000000..48c1213 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/entries @@ -0,0 +1,139 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +HmmAlignAlgorithmFactory.java +file + + + + +2010-11-11T10:14:14.000000Z +82342bf80405aed4467ce432bc1b931b +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1004 + +HmmAlignAlgorithmTest.java +file +52 + + + +2011-02-15T18:36:18.000000Z +d419e3d6a247ef7541ff2e314d09981f +2011-02-16T09:43:39.607778Z +52 +jarekl + + + + + + + + + + + + + + + + + + + + + +4329 + +Util.java +file + + + + +2010-11-11T10:14:57.000000Z +f3421ccc264389c9ab1bcdbbe74539e8 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +636 + +adaptive +dir + +fb +dir + +viterbi +dir + diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/HmmAlignAlgorithmFactory.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/HmmAlignAlgorithmFactory.java.svn-base new file mode 100644 index 0000000..f791dbc --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/HmmAlignAlgorithmFactory.java.svn-base @@ -0,0 +1,29 @@ +package net.sourceforge.align.filter.aligner.align.hmm; + +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.matrix.MatrixFactory; + +/** + * Represents a factory producing align algorithms based on Hidden Markov + * Models (HMM). Used by {@link AdaptiveBandAlgorithm} to be independent + * of actual algorithm. + * @author loomchild + */ +public interface HmmAlignAlgorithmFactory { + + /** + * Creates align algorithm. + * @param calculator calculator + * @param categoryMap map of possible alignment categories + * @param matrixFactory factory creating matrices to be used by algorithm + * @return align algorithm + */ + public AlignAlgorithm createAlignAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory); + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/HmmAlignAlgorithmTest.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/HmmAlignAlgorithmTest.java.svn-base new file mode 100644 index 0000000..1b4b767 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/HmmAlignAlgorithmTest.java.svn-base @@ -0,0 +1,125 @@ +package net.sourceforge.align.filter.aligner.align.hmm; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.util.Util; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Represents abstract unit tests common to all HMM algorithms. + * @author loomchild + */ +public abstract class HmmAlignAlgorithmTest { + + protected abstract AlignAlgorithm getAlgorithm(); + + /** + * Tests whether one to zero alignment works correctly. + * Encountered a problem that when last alignment is 1-0 then backtrace + * ignores it. + */ + @Test + public void testOneToZero() { + String[] sourceSegments = new String[]{"Segment 1"}; + String[] targetSegments = new String[]{}; + + AlignAlgorithm algorithm = getAlgorithm(); + List result = algorithm.align( + Arrays.asList(sourceSegments), + Arrays.asList(targetSegments)); + + Assert.assertEquals(1, result.size()); + Util.assertAlignmentEquals(sourceSegments, targetSegments, result.get(0)); + } + + /** + * Tests if when aligning three to one all segments will be preserved. + */ + @Test + public void testPreservesAllSegments() { + String[] sourceSegments = new String[]{ + "He had given up attending to matters of practical importance; he had lost all desire to do so.", + "Nothing that any landlady could do had a real terror for him.", + "But to be stopped on the stairs, to be forced to listen to her trivial, irrelevant gossip, to pestering demands for payment, threats and complaints, and to rack his brains for excuses, to prevaricate, to lie—no, rather than that, he would creep down the stairs like a cat and slip out unseen." + }; + + String[] targetSegments = new String[]{ + "Aber auf der Treppe stehenzubleiben, allerlei Gewäsch über allen möglichen ihm ganz gleichgültigen Alltagskram, all diese Mahnungen ans Bezahlen, die Drohungen und Klagen anzuhören und dabei selbst sich herauszuwinden, sich zu entschuldigen, zu lügen – nein, da war es schon besser, wie eine Katze auf der Treppe vorbeizuschlüpfen und sich, ohne von jemand gesehen zu werden, flink davonzumachen." + }; + + AlignAlgorithm algorithm = getAlgorithm(); + List result = algorithm.align( + Arrays.asList(sourceSegments), + Arrays.asList(targetSegments)); + + Util.assertAlignmentListContains(sourceSegments, targetSegments, result); + } + + /** + *

+ * This is a little more advanced test for aligner. + * It tests aligning interleaved short and long segments, + * which logically should be aligned fine if aligner is correct. + *

+ *

Bug reported by Boyan Ivanov Bonev.

+ */ + @Test + public void testVeryShortAndLongInterleaved() { + String[] sourceSegments = { + "Presidente", + "1.", + "Reanudación del período de Sesiones", + "Se abre la sesión a las 17.00 horas.", + "2.", + "Aprobación del Acta de la sesión anterior", + "Se aprueba el Acta de la sesión anterior.", + "3.", + "Composición del Parlamento", + }; + + String[] targetSegments = { + "President", + "1.", + "Resumption of the session", + "The sitting opened at 17.00.", + "2.", + "Approval of the Minutes of the previous sitting", + "The Minutes of the previous sitting were approved.", + "3.", + "Composition of Parliament", + }; + + String[][] expectedSourceSegments = + createArrayOfSingletons(sourceSegments); + + String[][] expectedTargetSegments = + createArrayOfSingletons(targetSegments); + + AlignAlgorithm algorithm = getAlgorithm(); + List result = algorithm.align( + Arrays.asList(sourceSegments), + Arrays.asList(targetSegments)); + + Util.assertAlignmentListEquals(expectedSourceSegments, + expectedTargetSegments, result); + } + + /** + * Creates an array of array of string where every element is a single + * element array. Elements are taken from input array. + * @return array of singletons + */ + private String[][] createArrayOfSingletons(String[] segmentArray) { + String[][] result = new String[segmentArray.length][]; + for (int i = 0; i < segmentArray.length; ++i) { + result[i] = new String[]{segmentArray[i]}; + } + return result; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/Util.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/Util.java.svn-base new file mode 100644 index 0000000..dd3b2d7 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/.svn/text-base/Util.java.svn-base @@ -0,0 +1,26 @@ +package net.sourceforge.align.filter.aligner.align.hmm; + +import net.sourceforge.align.matrix.Matrix; + +/** + * Represents alignment algorithm utilities. + * @author loomchild + */ +public class Util { + + /** + * Checks if x (y) is greater than 0 and less than matrix width (height) + * and if the element stored at this position is not null. + * @param matrix + * @param x + * @param y + * @return true if element exists at given position + */ + public static boolean elementExists(Matrix matrix, int x, int y) { + return (x >= 0 && y >= 0 + && x < matrix.getWidth() && y < matrix.getHeight() + && matrix.get(x, y) != null); + } + + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmFactory.java b/src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmFactory.java new file mode 100755 index 0000000..f791dbc --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmFactory.java @@ -0,0 +1,29 @@ +package net.sourceforge.align.filter.aligner.align.hmm; + +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.matrix.MatrixFactory; + +/** + * Represents a factory producing align algorithms based on Hidden Markov + * Models (HMM). Used by {@link AdaptiveBandAlgorithm} to be independent + * of actual algorithm. + * @author loomchild + */ +public interface HmmAlignAlgorithmFactory { + + /** + * Creates align algorithm. + * @param calculator calculator + * @param categoryMap map of possible alignment categories + * @param matrixFactory factory creating matrices to be used by algorithm + * @return align algorithm + */ + public AlignAlgorithm createAlignAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory); + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmTest.java b/src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmTest.java new file mode 100644 index 0000000..1b4b767 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/HmmAlignAlgorithmTest.java @@ -0,0 +1,125 @@ +package net.sourceforge.align.filter.aligner.align.hmm; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.util.Util; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Represents abstract unit tests common to all HMM algorithms. + * @author loomchild + */ +public abstract class HmmAlignAlgorithmTest { + + protected abstract AlignAlgorithm getAlgorithm(); + + /** + * Tests whether one to zero alignment works correctly. + * Encountered a problem that when last alignment is 1-0 then backtrace + * ignores it. + */ + @Test + public void testOneToZero() { + String[] sourceSegments = new String[]{"Segment 1"}; + String[] targetSegments = new String[]{}; + + AlignAlgorithm algorithm = getAlgorithm(); + List result = algorithm.align( + Arrays.asList(sourceSegments), + Arrays.asList(targetSegments)); + + Assert.assertEquals(1, result.size()); + Util.assertAlignmentEquals(sourceSegments, targetSegments, result.get(0)); + } + + /** + * Tests if when aligning three to one all segments will be preserved. + */ + @Test + public void testPreservesAllSegments() { + String[] sourceSegments = new String[]{ + "He had given up attending to matters of practical importance; he had lost all desire to do so.", + "Nothing that any landlady could do had a real terror for him.", + "But to be stopped on the stairs, to be forced to listen to her trivial, irrelevant gossip, to pestering demands for payment, threats and complaints, and to rack his brains for excuses, to prevaricate, to lie—no, rather than that, he would creep down the stairs like a cat and slip out unseen." + }; + + String[] targetSegments = new String[]{ + "Aber auf der Treppe stehenzubleiben, allerlei Gewäsch über allen möglichen ihm ganz gleichgültigen Alltagskram, all diese Mahnungen ans Bezahlen, die Drohungen und Klagen anzuhören und dabei selbst sich herauszuwinden, sich zu entschuldigen, zu lügen – nein, da war es schon besser, wie eine Katze auf der Treppe vorbeizuschlüpfen und sich, ohne von jemand gesehen zu werden, flink davonzumachen." + }; + + AlignAlgorithm algorithm = getAlgorithm(); + List result = algorithm.align( + Arrays.asList(sourceSegments), + Arrays.asList(targetSegments)); + + Util.assertAlignmentListContains(sourceSegments, targetSegments, result); + } + + /** + *

+ * This is a little more advanced test for aligner. + * It tests aligning interleaved short and long segments, + * which logically should be aligned fine if aligner is correct. + *

+ *

Bug reported by Boyan Ivanov Bonev.

+ */ + @Test + public void testVeryShortAndLongInterleaved() { + String[] sourceSegments = { + "Presidente", + "1.", + "Reanudación del período de Sesiones", + "Se abre la sesión a las 17.00 horas.", + "2.", + "Aprobación del Acta de la sesión anterior", + "Se aprueba el Acta de la sesión anterior.", + "3.", + "Composición del Parlamento", + }; + + String[] targetSegments = { + "President", + "1.", + "Resumption of the session", + "The sitting opened at 17.00.", + "2.", + "Approval of the Minutes of the previous sitting", + "The Minutes of the previous sitting were approved.", + "3.", + "Composition of Parliament", + }; + + String[][] expectedSourceSegments = + createArrayOfSingletons(sourceSegments); + + String[][] expectedTargetSegments = + createArrayOfSingletons(targetSegments); + + AlignAlgorithm algorithm = getAlgorithm(); + List result = algorithm.align( + Arrays.asList(sourceSegments), + Arrays.asList(targetSegments)); + + Util.assertAlignmentListEquals(expectedSourceSegments, + expectedTargetSegments, result); + } + + /** + * Creates an array of array of string where every element is a single + * element array. Elements are taken from input array. + * @return array of singletons + */ + private String[][] createArrayOfSingletons(String[] segmentArray) { + String[][] result = new String[segmentArray.length][]; + for (int i = 0; i < segmentArray.length; ++i) { + result[i] = new String[]{segmentArray[i]}; + } + return result; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/Util.java b/src/net/sourceforge/align/filter/aligner/align/hmm/Util.java new file mode 100644 index 0000000..dd3b2d7 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/Util.java @@ -0,0 +1,26 @@ +package net.sourceforge.align.filter.aligner.align.hmm; + +import net.sourceforge.align.matrix.Matrix; + +/** + * Represents alignment algorithm utilities. + * @author loomchild + */ +public class Util { + + /** + * Checks if x (y) is greater than 0 and less than matrix width (height) + * and if the element stored at this position is not null. + * @param matrix + * @param x + * @param y + * @return true if element exists at given position + */ + public static boolean elementExists(Matrix matrix, int x, int y) { + return (x >= 0 && y >= 0 + && x < matrix.getWidth() && y < matrix.getHeight() + && matrix.get(x, y) != null); + } + + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/all-wcprops b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/all-wcprops new file mode 100644 index 0000000..d9e20d7 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive +END +AdaptiveBandAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 127 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/AdaptiveBandAlgorithm.java +END diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/entries b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/entries new file mode 100644 index 0000000..4fd608c --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/entries @@ -0,0 +1,62 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +AdaptiveBandAlgorithm.java +file + + + + +2010-12-02T07:49:29.000000Z +9ab77a3192d4215fcc139868c7e46f74 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +6646 + diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/text-base/AdaptiveBandAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/text-base/AdaptiveBandAlgorithm.java.svn-base new file mode 100644 index 0000000..5b5b113 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/text-base/AdaptiveBandAlgorithm.java.svn-base @@ -0,0 +1,176 @@ +package net.sourceforge.align.filter.aligner.align.hmm.adaptive; + +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.coretypes.CategoryDefaults; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithm; +import net.sourceforge.align.matrix.BandMatrix; +import net.sourceforge.align.matrix.BandMatrixFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +/** + *

Represents meta-alignment algorithm. It uses given alignment algorithm and + * by increasing width of the diagonal band in {@link BandMatrix} tries to find + * reasonable alignment.

+ * + *

The idea is that it first creates a matrix with narrow band and performs + * the alignment using the algorithm. It evaluates it by checking if the result + * is not closer to the band edge than the given margin (this suggests that + * there might be better alignment outside the band). If it is then it + * increases the size of band and tries again. The whole process is + * repeated until alignment is not within the margin.

+ * + *

This improves overall performance of the alignment because the whole + * matrix does not need to be calculated, just the elements on the + * narrow band around diagonal.

+ * + * @author loomchild + */ +public class AdaptiveBandAlgorithm implements AlignAlgorithm { + + public static final float DEFAULT_BAND_INCREMENT_RATIO = 1.5f; + + public static final int DEFAULT_INITIAL_BAND_RADIUS = + BandMatrixFactory.DEFAULT_BAND_RADIUS; + + public static final int DEFAULT_MIN_BAND_MARGIN = + DEFAULT_INITIAL_BAND_RADIUS / 4; + + private Map categoryMap; + + private Calculator calculator; + + private int initialBandRadius; + + private float bandIncrementRatio; + + private int minBandMargin; + + private HmmAlignAlgorithmFactory algorithmFactory; + + /** + * Creates meta-algorithm. + * + * @param algorithmFactory factory used to create actual alignment + * algorithm (for example {@link ViterbiAlgorithm} or + * {@link ForwardBackwardAlgorithm}) + * @param calculator calculator used by actual algorithm + * @param initialBandRadius initial size of band + * @param bandIncrementRatio the number by which the band size will be + * duplicated on alignment failure + * @param minBandMargin size of margin used to evaluate an alignment + * @param categoryMap categories used by actual algorithm + */ + public AdaptiveBandAlgorithm(HmmAlignAlgorithmFactory algorithmFactory, + Calculator calculator, int initialBandRadius, + float bandIncrementRatio, int minBandMargin, + Map categoryMap) { + this.categoryMap = categoryMap; + this.calculator = calculator; + this.initialBandRadius = initialBandRadius; + this.bandIncrementRatio = bandIncrementRatio; + this.minBandMargin = minBandMargin; + this.algorithmFactory = algorithmFactory; + } + + /** + * Creates meta-algorithm using default categories + * (@link{CategoryDefaults#BEST_CATEGORY_MAP}). + * + * @param algorithmFactory factory used to create actual alignment + * algorithm (for example {@link ViterbiAlgorithm} or + * {@link ForwardBackwardAlgorithm}) + * @param calculator calculator used by actual algorithm + * @param initialBandRadius initial size of band + * @param bandIncrementRatio the number by which the band size will be + * duplicated on alignment failure + * @param minBandMargin size of margin used to evaluate an alignment + */ + public AdaptiveBandAlgorithm(HmmAlignAlgorithmFactory algorithmFactory, + Calculator calculator, int initialBandRadius, + float bandIncrementRatio, int minBandMargin) { + this(algorithmFactory, calculator, initialBandRadius, + bandIncrementRatio, minBandMargin, + CategoryDefaults.BEST_CATEGORY_MAP); + } + + /** + * Creates meta-algorithm using the following defaults: + * {@link #DEFAULT_INITIAL_BAND_RADIUS}, + * {@link #DEFAULT_BAND_INCREMENT_RATIO} and + * {@link #DEFAULT_MIN_BAND_MARGIN}. + * + * @param algorithmFactory factory used to create actual alignment + * algorithm (for example {@link ViterbiAlgorithm} or + * {@link ForwardBackwardAlgorithm}) + * @param calculator calculator used by actual algorithm + */ + public AdaptiveBandAlgorithm(HmmAlignAlgorithmFactory algorithmFactory, + Calculator calculator) { + this(algorithmFactory, calculator, DEFAULT_INITIAL_BAND_RADIUS, + DEFAULT_BAND_INCREMENT_RATIO, DEFAULT_MIN_BAND_MARGIN); + } + + /** + * Creates {@link BandMatrix} with narrow band at first and increases + * its width until it finds an alignment that does not come closer to + * the band edge than given margin. + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + float bandRadius = initialBandRadius / bandIncrementRatio; + int maxAlignmentRadius = (int)bandRadius + 1; + List alignmentList = null; + + while((maxAlignmentRadius + minBandMargin) > bandRadius) { + bandRadius *= bandIncrementRatio; + MatrixFactory matrixFactory = new BandMatrixFactory((int)bandRadius); + AlignAlgorithm algorithm = algorithmFactory.createAlignAlgorithm( + calculator, categoryMap, matrixFactory); + alignmentList = algorithm.align(sourceSegmentList, + targetSegmentList); + maxAlignmentRadius = calculateMaxAlignmentRadius(alignmentList, + sourceSegmentList.size(), targetSegmentList.size()); + } + + assert alignmentList != null; + return alignmentList; + } + + /** + * Calculates maximum deviation of given alignment from diagonal + * (can be interpreted as maximum alignment radius). + * + * @param alignmentList alignment list + * @param sourceCount source segment count + * @param targetCount target segment count + * @return + */ + private int calculateMaxAlignmentRadius(List alignmentList, + int sourceCount, int targetCount) { + int maxRadius = 0; + int sourceNr = 0; + int targetNr = 0; + float targetSourceRatio = (float)targetCount / (float)sourceCount; + + for (Alignment alignment : alignmentList) { + sourceNr += alignment.getSourceSegmentList().size(); + targetNr += alignment.getTargetSegmentList().size(); + int diagonalTargetNr = (int)((float)sourceNr * targetSourceRatio); + int radius = Math.abs(targetNr - diagonalTargetNr); + if (radius > maxRadius) { + maxRadius = radius; + } + } + + return maxRadius; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/text-base/HmmAlignAlgorithmFactory.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/text-base/HmmAlignAlgorithmFactory.java.svn-base new file mode 100755 index 0000000..5074a10 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/.svn/text-base/HmmAlignAlgorithmFactory.java.svn-base @@ -0,0 +1,18 @@ +package net.sourceforge.align.filter.aligner.align.hmm; + +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.util.calculator.Calculator; +import net.sourceforge.align.filter.aligner.align.hmm.util.category.Category; +import net.sourceforge.align.filter.aligner.align.hmm.util.matrix.MatrixFactory; + +/** + * Interfejs fabryki produkującej algorytmy dopasowujące oparte o ukryte modele + * markowa (HMM). Używana przez adaptacyjny algorytm dopasowywania. + * @author loomchild + */ +public interface HmmAlignAlgorithmFactory { + + public AlignAlgorithm createAlignAlgorithm(Calculator calculator, + Category[] categoryList, MatrixFactory matrixFactory); + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/AdaptiveBandAlgorithm.java b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/AdaptiveBandAlgorithm.java new file mode 100755 index 0000000..5b5b113 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/adaptive/AdaptiveBandAlgorithm.java @@ -0,0 +1,176 @@ +package net.sourceforge.align.filter.aligner.align.hmm.adaptive; + +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.coretypes.CategoryDefaults; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithm; +import net.sourceforge.align.matrix.BandMatrix; +import net.sourceforge.align.matrix.BandMatrixFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +/** + *

Represents meta-alignment algorithm. It uses given alignment algorithm and + * by increasing width of the diagonal band in {@link BandMatrix} tries to find + * reasonable alignment.

+ * + *

The idea is that it first creates a matrix with narrow band and performs + * the alignment using the algorithm. It evaluates it by checking if the result + * is not closer to the band edge than the given margin (this suggests that + * there might be better alignment outside the band). If it is then it + * increases the size of band and tries again. The whole process is + * repeated until alignment is not within the margin.

+ * + *

This improves overall performance of the alignment because the whole + * matrix does not need to be calculated, just the elements on the + * narrow band around diagonal.

+ * + * @author loomchild + */ +public class AdaptiveBandAlgorithm implements AlignAlgorithm { + + public static final float DEFAULT_BAND_INCREMENT_RATIO = 1.5f; + + public static final int DEFAULT_INITIAL_BAND_RADIUS = + BandMatrixFactory.DEFAULT_BAND_RADIUS; + + public static final int DEFAULT_MIN_BAND_MARGIN = + DEFAULT_INITIAL_BAND_RADIUS / 4; + + private Map categoryMap; + + private Calculator calculator; + + private int initialBandRadius; + + private float bandIncrementRatio; + + private int minBandMargin; + + private HmmAlignAlgorithmFactory algorithmFactory; + + /** + * Creates meta-algorithm. + * + * @param algorithmFactory factory used to create actual alignment + * algorithm (for example {@link ViterbiAlgorithm} or + * {@link ForwardBackwardAlgorithm}) + * @param calculator calculator used by actual algorithm + * @param initialBandRadius initial size of band + * @param bandIncrementRatio the number by which the band size will be + * duplicated on alignment failure + * @param minBandMargin size of margin used to evaluate an alignment + * @param categoryMap categories used by actual algorithm + */ + public AdaptiveBandAlgorithm(HmmAlignAlgorithmFactory algorithmFactory, + Calculator calculator, int initialBandRadius, + float bandIncrementRatio, int minBandMargin, + Map categoryMap) { + this.categoryMap = categoryMap; + this.calculator = calculator; + this.initialBandRadius = initialBandRadius; + this.bandIncrementRatio = bandIncrementRatio; + this.minBandMargin = minBandMargin; + this.algorithmFactory = algorithmFactory; + } + + /** + * Creates meta-algorithm using default categories + * (@link{CategoryDefaults#BEST_CATEGORY_MAP}). + * + * @param algorithmFactory factory used to create actual alignment + * algorithm (for example {@link ViterbiAlgorithm} or + * {@link ForwardBackwardAlgorithm}) + * @param calculator calculator used by actual algorithm + * @param initialBandRadius initial size of band + * @param bandIncrementRatio the number by which the band size will be + * duplicated on alignment failure + * @param minBandMargin size of margin used to evaluate an alignment + */ + public AdaptiveBandAlgorithm(HmmAlignAlgorithmFactory algorithmFactory, + Calculator calculator, int initialBandRadius, + float bandIncrementRatio, int minBandMargin) { + this(algorithmFactory, calculator, initialBandRadius, + bandIncrementRatio, minBandMargin, + CategoryDefaults.BEST_CATEGORY_MAP); + } + + /** + * Creates meta-algorithm using the following defaults: + * {@link #DEFAULT_INITIAL_BAND_RADIUS}, + * {@link #DEFAULT_BAND_INCREMENT_RATIO} and + * {@link #DEFAULT_MIN_BAND_MARGIN}. + * + * @param algorithmFactory factory used to create actual alignment + * algorithm (for example {@link ViterbiAlgorithm} or + * {@link ForwardBackwardAlgorithm}) + * @param calculator calculator used by actual algorithm + */ + public AdaptiveBandAlgorithm(HmmAlignAlgorithmFactory algorithmFactory, + Calculator calculator) { + this(algorithmFactory, calculator, DEFAULT_INITIAL_BAND_RADIUS, + DEFAULT_BAND_INCREMENT_RATIO, DEFAULT_MIN_BAND_MARGIN); + } + + /** + * Creates {@link BandMatrix} with narrow band at first and increases + * its width until it finds an alignment that does not come closer to + * the band edge than given margin. + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + float bandRadius = initialBandRadius / bandIncrementRatio; + int maxAlignmentRadius = (int)bandRadius + 1; + List alignmentList = null; + + while((maxAlignmentRadius + minBandMargin) > bandRadius) { + bandRadius *= bandIncrementRatio; + MatrixFactory matrixFactory = new BandMatrixFactory((int)bandRadius); + AlignAlgorithm algorithm = algorithmFactory.createAlignAlgorithm( + calculator, categoryMap, matrixFactory); + alignmentList = algorithm.align(sourceSegmentList, + targetSegmentList); + maxAlignmentRadius = calculateMaxAlignmentRadius(alignmentList, + sourceSegmentList.size(), targetSegmentList.size()); + } + + assert alignmentList != null; + return alignmentList; + } + + /** + * Calculates maximum deviation of given alignment from diagonal + * (can be interpreted as maximum alignment radius). + * + * @param alignmentList alignment list + * @param sourceCount source segment count + * @param targetCount target segment count + * @return + */ + private int calculateMaxAlignmentRadius(List alignmentList, + int sourceCount, int targetCount) { + int maxRadius = 0; + int sourceNr = 0; + int targetNr = 0; + float targetSourceRatio = (float)targetCount / (float)sourceCount; + + for (Alignment alignment : alignmentList) { + sourceNr += alignment.getSourceSegmentList().size(); + targetNr += alignment.getTargetSegmentList().size(); + int diagonalTargetNr = (int)((float)sourceNr * targetSourceRatio); + int radius = Math.abs(targetNr - diagonalTargetNr); + if (radius > maxRadius) { + maxRadius = radius; + } + } + + return maxRadius; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/all-wcprops b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/all-wcprops new file mode 100644 index 0000000..6c8d3f3 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 94 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/fb +END +ForwardBackwardAlgorithmFactory.java +K 25 +svn:wc:ra_dav:version-url +V 131 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmFactory.java +END +ForwardBackwardAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 128 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmTest.java +END +ForwardBackwardAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 124 +/svnroot/align/!svn/ver/57/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithm.java +END diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/entries b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/entries new file mode 100644 index 0000000..1d2e91d --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/fb +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +ForwardBackwardAlgorithmFactory.java +file + + + + +2010-11-01T18:23:44.000000Z +c9e1aadaf5ce250a5fc2e5ce0bead47c +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +795 + +ForwardBackwardAlgorithm.java +file +57 + + + +2011-10-23T08:47:43.032150Z +326b5420ed84dbcb6aac7a93b7175162 +2011-10-23T09:19:34.947191Z +57 +jarekl + + + + + + + + + + + + + + + + + + + + + +10241 + +ForwardBackwardAlgorithmTest.java +file + + + + +2010-11-13T18:10:45.000000Z +c0d72619bd38c9b9b65cc13d88a77d42 +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + + + + + + + + +1352 + diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithm.java.svn-base new file mode 100644 index 0000000..8157a4e --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithm.java.svn-base @@ -0,0 +1,274 @@ +package net.sourceforge.align.filter.aligner.align.hmm.fb; + +import static net.sourceforge.align.filter.aligner.align.hmm.Util.elementExists; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.matrix.Matrix; +import net.sourceforge.align.matrix.MatrixFactory; +import net.sourceforge.align.matrix.MatrixIterator; +import net.sourceforge.align.progress.ProgressManager; +import net.sourceforge.align.progress.ProgressMeter; +import net.sourceforge.align.util.Util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Represents alignment algorithm which uses Forward Backward algorithm. + * In simple words it finds a path in alignment matrix (representing + * all possible alignments) with maximum probability of each individual + * alignment on the path. + * + * This algorithm is independent of method of calculating the individual + * alignment probabilities (see {@link Calculator} and the way the + * matrix is iterated (some irrelevant elements may be omitted by + * {@link MatrixIterator}, implemented by a {@link Matrix}). + * + * TODO: Check the link + * @see Forward Backward Algorithm + * + * @see "A Tutorial on Hidden Markov Models and Selected + * Applications in Speech Recognition, Lawrence R. Rabiner" + * + * @author loomchild + */ +public class ForwardBackwardAlgorithm implements AlignAlgorithm { + + private Log log = LogFactory.getLog(ForwardBackwardAlgorithm.class); + + private Map categoryMap; + + private Calculator calculator; + + private MatrixFactory matrixFactory; + + /** + * Creates an algorithm. + * @param calculator probability calculator + * @param categoryMap possible alignment categories with their probabilities + * @param matrixFactory factory creating two dimensional matrices + */ + public ForwardBackwardAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory) { + this.matrixFactory = matrixFactory; + this.calculator = calculator; + this.categoryMap = categoryMap; + } + + /** + * Consists of two phases - forward and backward, and populates forward + * and backward matrices during these phases (by using + * {@link #createForwardData(int, int, List, List, Matrix)} and + * {@link #createBackwardData(int, int, List, List, Matrix)} methods). + * + * After that retrieves the alignment list with highest individual + * alignment probabilities. + * + * TODO: Describe in more detail. + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + + Matrix forwardMatrix = matrixFactory.createMatrix( + sourceSegmentList.size() + 1, targetSegmentList.size() + 1); + + ProgressMeter progress = new ProgressMeter("Forward-Backward Align", forwardMatrix.getSize() * 2); + ProgressManager.getInstance().registerProgressMeter(progress); + + MatrixIterator forwardIterator = forwardMatrix.getIterator(); + while(forwardIterator.hasNext()) { + forwardIterator.next(); + int x = forwardIterator.getX(); + int y = forwardIterator.getY(); + float data = createForwardData(x, y, sourceSegmentList, + targetSegmentList, forwardMatrix); + forwardMatrix.set(x, y, data); + + progress.completeTask(); + } + + Matrix backwardMatrix = matrixFactory.createMatrix( + sourceSegmentList.size() + 1, targetSegmentList.size() + 1); + MatrixIterator backwardIterator = backwardMatrix.getIterator(); + + backwardIterator.afterLast(); + while(backwardIterator.hasPrevious()) { + backwardIterator.previous(); + int x = backwardIterator.getX(); + int y = backwardIterator.getY(); + float data = createBackwardData(x, y, sourceSegmentList, + targetSegmentList, backwardMatrix); + backwardMatrix.set(x, y, data); + + progress.completeTask(); + } + + List alignmentList = new ArrayList(); + + float totalScore = forwardMatrix.get(sourceSegmentList.size(), + targetSegmentList.size()); + int x = 0; + int y = 0; + while (x < sourceSegmentList.size() || y < targetSegmentList.size()) { + float bestScore = Float.POSITIVE_INFINITY; + Category bestCategory = null; + for (Category category : categoryMap.keySet()) { + int newX = x + category.getSourceSegmentCount(); + int newY = y + category.getTargetSegmentCount(); + if (newX <= sourceSegmentList.size() && + newY <= targetSegmentList.size()) { + if (forwardMatrix.get(newX, newY) != null && + backwardMatrix.get(newX, newY) != null) { + float forwardScore = forwardMatrix.get(newX, newY); + float backwardScore = backwardMatrix.get(newX, newY); + float score = forwardScore + backwardScore - totalScore; + if (score < bestScore) { + bestScore = score; + bestCategory = category; + } + } + } + } + List sourceList = createSubList(sourceSegmentList, + x, x + bestCategory.getSourceSegmentCount()); + List targetList = createSubList(targetSegmentList, + y, y + bestCategory.getTargetSegmentCount()); + Alignment alignment = + new Alignment(sourceList, targetList, bestScore); + alignmentList.add(alignment); + x += bestCategory.getSourceSegmentCount(); + y += bestCategory.getTargetSegmentCount(); + log.trace("(" + x + ", " + y + ") - s: " + bestScore + " (" + Math.exp(-bestScore) + ")"); + } + + /* + int previousX = 0; + int previousY = 0; + float score05 = (float)toScore(0.5); + float totalScore = forwardMatrix.get(sourceSegmentList.size(), + targetSegmentList.size()); + forwardIterator.beforeFirst(); + while(forwardIterator.hasNext()) { + forwardIterator.next(); + int x = forwardIterator.getX(); + int y = forwardIterator.getY(); + float forwardScore = forwardMatrix.get(x, y); + float backwardScore = backwardMatrix.get(x, y); + float score = forwardScore + backwardScore - totalScore; + if (score < score05 && (x > 0 || y > 0)) { + if (x < previousX || y < previousY) { + throw new AlignmentNotFoundException(); + } + List sourceList = + createSubList(sourceSegmentList, previousX, x); + List targetList = + createSubList(targetSegmentList, previousY, y); + Alignment alignment = new Alignment(sourceList, targetList, score); + alignmentList.add(alignment); + previousX = x; + previousY = y; + log.trace("(" + x + ", " + y + "): f: " + forwardScore + ", b: " + backwardScore + ", t: " + totalScore + ", s: " + score + " (" + Math.exp(-score) + ")"); + } + } + */ + + ProgressManager.getInstance().unregisterProgressMeter(progress); + + return alignmentList; + } + + /** + * Calculates sum of probabilities (returned as score equal to + * -ln (probability)) of all paths leading to this element. + * + * Matrix should be populated from upper left corner to lower right corner. + * + * @param x source segment position on the matrix + * @param y target segment position on the matrix + * @param sourceSegmentList list of current source segments + * @param targetSegmentList list of current target segments + * @param matrix forward matrix + * @return sum of all paths probabilities as score (-ln (probability)). + */ + private float createForwardData(int x, int y, + List sourceSegmentList, List targetSegmentList, + Matrix matrix) { + List scoreList = new ArrayList(categoryMap.size()); + for (Map.Entry entry : categoryMap.entrySet()) { + Category category = entry.getKey(); + float categoryScore = entry.getValue(); + int startX = x - category.getSourceSegmentCount(); + int startY = y - category.getTargetSegmentCount(); + if (elementExists(matrix, startX, startY)) { + List sourceList = sourceSegmentList.subList(startX, x); + List targetList = targetSegmentList.subList(startY, y); + float score = categoryScore + + calculator.calculateScore(sourceList, targetList); + float totalScore = score + matrix.get(startX, startY); + scoreList.add(totalScore); + } + } + float scoreSum = Util.scoreSum(scoreList); + return scoreSum; + } + + /** + * Calculates sum of probabilities (returned as score equal to + * -ln (probability)) of all paths leading to this element but starting + * from the lower right corner of the matrix (backward because + * it represents going from the back of the texts). + * + * Matrix should be populated from lower right corner to upper left + * corner. + * + * @param x source segment position on the matrix + * @param y target segment position on the matrix + * @param sourceSegmentList list of current source segments + * @param targetSegmentList list of current target segments + * @param matrix backward matrix + * @return sum of all paths probabilities as score (-ln (probability)). + */ + private float createBackwardData(int x, int y, + List sourceSegmentList, List targetSegmentList, + Matrix matrix) { + List scoreList = new ArrayList(categoryMap.size()); + for (Map.Entry entry : categoryMap.entrySet()) { + Category category = entry.getKey(); + float categoryScore = entry.getValue(); + int endX = x + category.getSourceSegmentCount(); + int endY = y + category.getTargetSegmentCount(); + if (elementExists(matrix, endX, endY)) { + List sourceList = sourceSegmentList.subList(x, endX); + List targetList = targetSegmentList.subList(y, endY); + float score = categoryScore + + calculator.calculateScore(sourceList, targetList); + float totalScore = score + matrix.get(endX, endY); + scoreList.add(totalScore); + } + } + float scoreSum = Util.scoreSum(scoreList); + return scoreSum; + } + + /** + * Creates physical sub list. + * TODO: Do I need to do this? Unit tests are fine without it, maybe this + * is a performance bottleneck? + * + * @param list + * @param start + * @param end + * @return + */ + private List createSubList(List list, int start, int end) { + return new ArrayList(list.subList(start, end)); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithmFactory.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithmFactory.java.svn-base new file mode 100644 index 0000000..7bafb01 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithmFactory.java.svn-base @@ -0,0 +1,23 @@ +package net.sourceforge.align.filter.aligner.align.hmm.fb; + +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +/** + * Factory always producing objects of {@link ForwardBackwardAlgorithm}. + * @author loomchild + */ +public class ForwardBackwardAlgorithmFactory implements HmmAlignAlgorithmFactory { + + public AlignAlgorithm createAlignAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory) { + return new ForwardBackwardAlgorithm(calculator, categoryMap, + matrixFactory); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithmTest.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithmTest.java.svn-base new file mode 100644 index 0000000..ae4c5a0 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/.svn/text-base/ForwardBackwardAlgorithmTest.java.svn-base @@ -0,0 +1,41 @@ +package net.sourceforge.align.filter.aligner.align.hmm.fb; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.CategoryDefaults; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmTest; +import net.sourceforge.align.matrix.FullMatrixFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +import org.junit.Before; + +/** + * Represents {@link ForwardBackwardAlgorithm} unit test. + * @author loomchild + * + */ +public class ForwardBackwardAlgorithmTest extends HmmAlignAlgorithmTest { + + private ForwardBackwardAlgorithm algorithm; + + protected ForwardBackwardAlgorithm getAlgorithm() { + return algorithm; + } + + /** + * Constructs algorithm object. It is similar to Gale and Church algorithm + * but based on Forward Backward method instead of Viterbi method. + */ + @Before + public void setUp() { + Counter counter = new CharCounter(); + Calculator calculator = new NormalDistributionCalculator(counter); + MatrixFactory matrixFactory = new FullMatrixFactory(); + + algorithm = new ForwardBackwardAlgorithm(calculator, + CategoryDefaults.BEST_CATEGORY_MAP, matrixFactory); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithm.java b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithm.java new file mode 100755 index 0000000..8157a4e --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithm.java @@ -0,0 +1,274 @@ +package net.sourceforge.align.filter.aligner.align.hmm.fb; + +import static net.sourceforge.align.filter.aligner.align.hmm.Util.elementExists; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.matrix.Matrix; +import net.sourceforge.align.matrix.MatrixFactory; +import net.sourceforge.align.matrix.MatrixIterator; +import net.sourceforge.align.progress.ProgressManager; +import net.sourceforge.align.progress.ProgressMeter; +import net.sourceforge.align.util.Util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Represents alignment algorithm which uses Forward Backward algorithm. + * In simple words it finds a path in alignment matrix (representing + * all possible alignments) with maximum probability of each individual + * alignment on the path. + * + * This algorithm is independent of method of calculating the individual + * alignment probabilities (see {@link Calculator} and the way the + * matrix is iterated (some irrelevant elements may be omitted by + * {@link MatrixIterator}, implemented by a {@link Matrix}). + * + * TODO: Check the link + * @see Forward Backward Algorithm + * + * @see "A Tutorial on Hidden Markov Models and Selected + * Applications in Speech Recognition, Lawrence R. Rabiner" + * + * @author loomchild + */ +public class ForwardBackwardAlgorithm implements AlignAlgorithm { + + private Log log = LogFactory.getLog(ForwardBackwardAlgorithm.class); + + private Map categoryMap; + + private Calculator calculator; + + private MatrixFactory matrixFactory; + + /** + * Creates an algorithm. + * @param calculator probability calculator + * @param categoryMap possible alignment categories with their probabilities + * @param matrixFactory factory creating two dimensional matrices + */ + public ForwardBackwardAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory) { + this.matrixFactory = matrixFactory; + this.calculator = calculator; + this.categoryMap = categoryMap; + } + + /** + * Consists of two phases - forward and backward, and populates forward + * and backward matrices during these phases (by using + * {@link #createForwardData(int, int, List, List, Matrix)} and + * {@link #createBackwardData(int, int, List, List, Matrix)} methods). + * + * After that retrieves the alignment list with highest individual + * alignment probabilities. + * + * TODO: Describe in more detail. + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + + Matrix forwardMatrix = matrixFactory.createMatrix( + sourceSegmentList.size() + 1, targetSegmentList.size() + 1); + + ProgressMeter progress = new ProgressMeter("Forward-Backward Align", forwardMatrix.getSize() * 2); + ProgressManager.getInstance().registerProgressMeter(progress); + + MatrixIterator forwardIterator = forwardMatrix.getIterator(); + while(forwardIterator.hasNext()) { + forwardIterator.next(); + int x = forwardIterator.getX(); + int y = forwardIterator.getY(); + float data = createForwardData(x, y, sourceSegmentList, + targetSegmentList, forwardMatrix); + forwardMatrix.set(x, y, data); + + progress.completeTask(); + } + + Matrix backwardMatrix = matrixFactory.createMatrix( + sourceSegmentList.size() + 1, targetSegmentList.size() + 1); + MatrixIterator backwardIterator = backwardMatrix.getIterator(); + + backwardIterator.afterLast(); + while(backwardIterator.hasPrevious()) { + backwardIterator.previous(); + int x = backwardIterator.getX(); + int y = backwardIterator.getY(); + float data = createBackwardData(x, y, sourceSegmentList, + targetSegmentList, backwardMatrix); + backwardMatrix.set(x, y, data); + + progress.completeTask(); + } + + List alignmentList = new ArrayList(); + + float totalScore = forwardMatrix.get(sourceSegmentList.size(), + targetSegmentList.size()); + int x = 0; + int y = 0; + while (x < sourceSegmentList.size() || y < targetSegmentList.size()) { + float bestScore = Float.POSITIVE_INFINITY; + Category bestCategory = null; + for (Category category : categoryMap.keySet()) { + int newX = x + category.getSourceSegmentCount(); + int newY = y + category.getTargetSegmentCount(); + if (newX <= sourceSegmentList.size() && + newY <= targetSegmentList.size()) { + if (forwardMatrix.get(newX, newY) != null && + backwardMatrix.get(newX, newY) != null) { + float forwardScore = forwardMatrix.get(newX, newY); + float backwardScore = backwardMatrix.get(newX, newY); + float score = forwardScore + backwardScore - totalScore; + if (score < bestScore) { + bestScore = score; + bestCategory = category; + } + } + } + } + List sourceList = createSubList(sourceSegmentList, + x, x + bestCategory.getSourceSegmentCount()); + List targetList = createSubList(targetSegmentList, + y, y + bestCategory.getTargetSegmentCount()); + Alignment alignment = + new Alignment(sourceList, targetList, bestScore); + alignmentList.add(alignment); + x += bestCategory.getSourceSegmentCount(); + y += bestCategory.getTargetSegmentCount(); + log.trace("(" + x + ", " + y + ") - s: " + bestScore + " (" + Math.exp(-bestScore) + ")"); + } + + /* + int previousX = 0; + int previousY = 0; + float score05 = (float)toScore(0.5); + float totalScore = forwardMatrix.get(sourceSegmentList.size(), + targetSegmentList.size()); + forwardIterator.beforeFirst(); + while(forwardIterator.hasNext()) { + forwardIterator.next(); + int x = forwardIterator.getX(); + int y = forwardIterator.getY(); + float forwardScore = forwardMatrix.get(x, y); + float backwardScore = backwardMatrix.get(x, y); + float score = forwardScore + backwardScore - totalScore; + if (score < score05 && (x > 0 || y > 0)) { + if (x < previousX || y < previousY) { + throw new AlignmentNotFoundException(); + } + List sourceList = + createSubList(sourceSegmentList, previousX, x); + List targetList = + createSubList(targetSegmentList, previousY, y); + Alignment alignment = new Alignment(sourceList, targetList, score); + alignmentList.add(alignment); + previousX = x; + previousY = y; + log.trace("(" + x + ", " + y + "): f: " + forwardScore + ", b: " + backwardScore + ", t: " + totalScore + ", s: " + score + " (" + Math.exp(-score) + ")"); + } + } + */ + + ProgressManager.getInstance().unregisterProgressMeter(progress); + + return alignmentList; + } + + /** + * Calculates sum of probabilities (returned as score equal to + * -ln (probability)) of all paths leading to this element. + * + * Matrix should be populated from upper left corner to lower right corner. + * + * @param x source segment position on the matrix + * @param y target segment position on the matrix + * @param sourceSegmentList list of current source segments + * @param targetSegmentList list of current target segments + * @param matrix forward matrix + * @return sum of all paths probabilities as score (-ln (probability)). + */ + private float createForwardData(int x, int y, + List sourceSegmentList, List targetSegmentList, + Matrix matrix) { + List scoreList = new ArrayList(categoryMap.size()); + for (Map.Entry entry : categoryMap.entrySet()) { + Category category = entry.getKey(); + float categoryScore = entry.getValue(); + int startX = x - category.getSourceSegmentCount(); + int startY = y - category.getTargetSegmentCount(); + if (elementExists(matrix, startX, startY)) { + List sourceList = sourceSegmentList.subList(startX, x); + List targetList = targetSegmentList.subList(startY, y); + float score = categoryScore + + calculator.calculateScore(sourceList, targetList); + float totalScore = score + matrix.get(startX, startY); + scoreList.add(totalScore); + } + } + float scoreSum = Util.scoreSum(scoreList); + return scoreSum; + } + + /** + * Calculates sum of probabilities (returned as score equal to + * -ln (probability)) of all paths leading to this element but starting + * from the lower right corner of the matrix (backward because + * it represents going from the back of the texts). + * + * Matrix should be populated from lower right corner to upper left + * corner. + * + * @param x source segment position on the matrix + * @param y target segment position on the matrix + * @param sourceSegmentList list of current source segments + * @param targetSegmentList list of current target segments + * @param matrix backward matrix + * @return sum of all paths probabilities as score (-ln (probability)). + */ + private float createBackwardData(int x, int y, + List sourceSegmentList, List targetSegmentList, + Matrix matrix) { + List scoreList = new ArrayList(categoryMap.size()); + for (Map.Entry entry : categoryMap.entrySet()) { + Category category = entry.getKey(); + float categoryScore = entry.getValue(); + int endX = x + category.getSourceSegmentCount(); + int endY = y + category.getTargetSegmentCount(); + if (elementExists(matrix, endX, endY)) { + List sourceList = sourceSegmentList.subList(x, endX); + List targetList = targetSegmentList.subList(y, endY); + float score = categoryScore + + calculator.calculateScore(sourceList, targetList); + float totalScore = score + matrix.get(endX, endY); + scoreList.add(totalScore); + } + } + float scoreSum = Util.scoreSum(scoreList); + return scoreSum; + } + + /** + * Creates physical sub list. + * TODO: Do I need to do this? Unit tests are fine without it, maybe this + * is a performance bottleneck? + * + * @param list + * @param start + * @param end + * @return + */ + private List createSubList(List list, int start, int end) { + return new ArrayList(list.subList(start, end)); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmFactory.java b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmFactory.java new file mode 100755 index 0000000..7bafb01 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmFactory.java @@ -0,0 +1,23 @@ +package net.sourceforge.align.filter.aligner.align.hmm.fb; + +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +/** + * Factory always producing objects of {@link ForwardBackwardAlgorithm}. + * @author loomchild + */ +public class ForwardBackwardAlgorithmFactory implements HmmAlignAlgorithmFactory { + + public AlignAlgorithm createAlignAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory) { + return new ForwardBackwardAlgorithm(calculator, categoryMap, + matrixFactory); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmTest.java b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmTest.java new file mode 100644 index 0000000..ae4c5a0 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/fb/ForwardBackwardAlgorithmTest.java @@ -0,0 +1,41 @@ +package net.sourceforge.align.filter.aligner.align.hmm.fb; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.CategoryDefaults; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmTest; +import net.sourceforge.align.matrix.FullMatrixFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +import org.junit.Before; + +/** + * Represents {@link ForwardBackwardAlgorithm} unit test. + * @author loomchild + * + */ +public class ForwardBackwardAlgorithmTest extends HmmAlignAlgorithmTest { + + private ForwardBackwardAlgorithm algorithm; + + protected ForwardBackwardAlgorithm getAlgorithm() { + return algorithm; + } + + /** + * Constructs algorithm object. It is similar to Gale and Church algorithm + * but based on Forward Backward method instead of Viterbi method. + */ + @Before + public void setUp() { + Counter counter = new CharCounter(); + Calculator calculator = new NormalDistributionCalculator(counter); + MatrixFactory matrixFactory = new FullMatrixFactory(); + + algorithm = new ForwardBackwardAlgorithm(calculator, + CategoryDefaults.BEST_CATEGORY_MAP, matrixFactory); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/all-wcprops b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/all-wcprops new file mode 100644 index 0000000..1e901cf --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 99 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi +END +ViterbiAlgorithmFactory.java +K 25 +svn:wc:ra_dav:version-url +V 128 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmFactory.java +END +ViterbiAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 125 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmTest.java +END +ViterbiAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 121 +/svnroot/align/!svn/ver/57/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithm.java +END +ViterbiData.java +K 25 +svn:wc:ra_dav:version-url +V 116 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiData.java +END diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/entries b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/entries new file mode 100644 index 0000000..55e01fc --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/entries @@ -0,0 +1,164 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +ViterbiAlgorithmFactory.java +file + + + + +2010-10-28T16:48:28.000000Z +62ad7c22b9bdc3e7e4068e00a9df974a +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +771 + +ViterbiAlgorithm.java +file +57 + + + +2011-10-23T08:47:06.871384Z +e3bdf26ad3036d3445cdf23b70de5aa4 +2011-10-23T09:19:34.947191Z +57 +jarekl + + + + + + + + + + + + + + + + + + + + + +7971 + +ViterbiAlgorithmTest.java +file + + + + +2010-11-13T18:10:51.000000Z +b809e3453f54fa7e385ebbada8bb6cfb +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + + + + + + + + +1248 + +ViterbiData.java +file + + + + +2010-10-28T16:47:31.000000Z +881aa6b1056097bc104bf675f6381814 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1244 + diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithm.java.svn-base new file mode 100644 index 0000000..31532cb --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithm.java.svn-base @@ -0,0 +1,216 @@ + +package net.sourceforge.align.filter.aligner.align.hmm.viterbi; + +import static net.sourceforge.align.filter.aligner.align.hmm.Util.elementExists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.matrix.Matrix; +import net.sourceforge.align.matrix.MatrixFactory; +import net.sourceforge.align.matrix.MatrixIterator; +import net.sourceforge.align.progress.ProgressManager; +import net.sourceforge.align.progress.ProgressMeter; + + +/** + * Represents alignment algorithm which uses Viterbi algorithm. + * In simple words it finds a path in alignment matrix (representing + * all possible alignments) with maximum total probability. + * + * This algorithm is independent of method of calculating the individual + * alignment probabilities (see {@link Calculator} and the way the + * matrix is iterated (some irrelevant elements may be omitted by + * {@link MatrixIterator}, implemented by a {@link Matrix}). + * + * @see Viterbi Algorithm + * + * @see "A Tutorial on Hidden Markov Models and Selected + * Applications in Speech Recognition, Lawrence R. Rabiner" + * + * @author loomchild + * + */ +public class ViterbiAlgorithm implements AlignAlgorithm { + + private Map categoryMap; + + private Calculator calculator; + + private MatrixFactory matrixFactory; + + /** + * Creates an algorithm. + * @param calculator probability calculator + * @param categoryMap possible alignment categories with their probabilities + * @param matrixFactory factory creating two dimensional matrices + */ + public ViterbiAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory) { + this.matrixFactory = matrixFactory; + this.calculator = calculator; + this.categoryMap = categoryMap; + } + + /** + * Aligns by iterating over the whole matrix created by + * {@link MatrixFactory} (iteration can omit some elements depending on + * matrix implementation) and populating it with {@link ViterbiData} + * elements (obtained by calling + * {@link #createData(int, int, List, List, Matrix)}). After the matrix + * is populated calls {@link #backtrace(List, List, Matrix)} to retrieve + * the most probable alignment from the matrix. + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + + Matrix matrix = matrixFactory.createMatrix( + sourceSegmentList.size() + 1, targetSegmentList.size() + 1); + + ProgressMeter progress = new ProgressMeter("Viterbi Align", matrix.getSize()); + ProgressManager.getInstance().registerProgressMeter(progress); + + MatrixIterator iterator = matrix.getIterator(); + while(iterator.hasNext()) { + iterator.next(); + int x = iterator.getX(); + int y = iterator.getY(); + ViterbiData data = createData(x, y, sourceSegmentList, + targetSegmentList, matrix); + matrix.set(x, y, data); + + progress.completeTask(); + } + + List alignmentList = backtrace(sourceSegmentList, + targetSegmentList, matrix); + + ProgressManager.getInstance().unregisterProgressMeter(progress); + + return alignmentList; + } + + /** + *

Creates {@link ViterbiData} object at (sourceNr, targetNr) position + * on the matrix. To do it calculates most probable path to this element + * by checking all possible ways (categories) to reach it from previously + * calculated data objects (to the left or up, because they are calculated + * before current one) and adds new alignment score + * (calculated with {@link Calculator}).

+ * + *

When sourceNr == 0 and targetNr == 0 (upper left + * corner), then zero-to-zero category alignment is created. + * Does not insert created object into the matrix.

+ * + * @param sourceNr source segment position in new alignment (x position) + * @param targetNr target segment position in new alignment (y position) + * @param sourceSegmentList list of source segments + * @param targetSegmentList list of target segments + * @param matrix matrix where the data object will be later stored, used + * to calculate best alignment and total score + * @return data object, should never return null + */ + private ViterbiData createData(int sourceNr, int targetNr, + List sourceSegmentList, List targetSegmentList, + Matrix matrix) { + if (sourceNr == 0 && targetNr == 0) { + return new ViterbiData(new Category(0, 0), 0, 0); + } + Category bestCategory = null; + float minScore = Float.POSITIVE_INFINITY; + float minTotalScore = Float.POSITIVE_INFINITY; + for (Map.Entry entry : categoryMap.entrySet()) { + Category category = entry.getKey(); + float categoryScore = entry.getValue(); + int sourceStart = sourceNr - category.getSourceSegmentCount(); + int targetStart = targetNr - category.getTargetSegmentCount(); + if (elementExists(matrix, sourceStart, targetStart)) { + List sourceList = sourceSegmentList.subList(sourceStart, + sourceNr); + List targetList = targetSegmentList.subList(targetStart, + targetNr); + float score = categoryScore + + calculator.calculateScore(sourceList, targetList); + float totalScore = score + matrix.get( + sourceStart, targetStart).getTotalScore(); + if (totalScore < minTotalScore) { + minTotalScore = totalScore; + minScore = score; + bestCategory = category; + } + } + } + if (bestCategory == null) { + return null; + } else { + return new ViterbiData(bestCategory, minScore, minTotalScore); + } + } + + /** + * Retrieves best alignment from populated matrix by reconstructing the + * most probable path by iterating over it backwards and always selecting + * the most probable alignment. + * + * @param sourceSegmentList initial source segment list + * @param targetSegmentList initial target segment list + * @param matrix populated matrix + * @return alignment with highest total probability + */ + private List backtrace(List sourceSegmentList, + List targetSegmentList, Matrix matrix) { + + ListIterator sourceIterator = + sourceSegmentList.listIterator(sourceSegmentList.size()); + ListIterator targetIterator = + targetSegmentList.listIterator(targetSegmentList.size()); + List alignmentList = new ArrayList(); + + while (sourceIterator.hasPrevious() || targetIterator.hasPrevious()) { + ViterbiData data = matrix.get(sourceIterator.previousIndex() + 1, + targetIterator.previousIndex() + 1); + if (data == null) { + throw new IllegalStateException("Unable to reconstruct " + + "previously calculated alignment during backtrace."); + } + List sourceList = createReverseList(sourceIterator, + data.getCategory().getSourceSegmentCount()); + List targetList = createReverseList(targetIterator, + data.getCategory().getTargetSegmentCount()); + Alignment alignment = new Alignment(sourceList, targetList, + data.getScore()); + alignmentList.add(alignment); + } + Collections.reverse(alignmentList); + + return alignmentList; + } + + /** + * Retrieves given count of elements from list iterator by going backward + * (using {@link ListIterator#previous()}) and returns them as a list in + * reverse the order. + * + * @param iterator list iterator + * @param count number of elements to retrieve from iterator + * @return list of elements + */ + private List createReverseList(ListIterator iterator, + int count) { + List list = new ArrayList(count); + for (int i = 0; i < count; ++i) { + list.add(iterator.previous()); + } + Collections.reverse(list); + return list; + } + + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithmFactory.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithmFactory.java.svn-base new file mode 100644 index 0000000..7bbbd8c --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithmFactory.java.svn-base @@ -0,0 +1,22 @@ +package net.sourceforge.align.filter.aligner.align.hmm.viterbi; + +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +/** + * Factory always producing objects of {@link ViterbiAlgorithm}. + * @author loomchild + */ +public class ViterbiAlgorithmFactory implements HmmAlignAlgorithmFactory { + + public AlignAlgorithm createAlignAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory) { + return new ViterbiAlgorithm(calculator, categoryMap, matrixFactory); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithmTest.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithmTest.java.svn-base new file mode 100644 index 0000000..ffcb5bf --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiAlgorithmTest.java.svn-base @@ -0,0 +1,40 @@ +package net.sourceforge.align.filter.aligner.align.hmm.viterbi; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.CategoryDefaults; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmTest; +import net.sourceforge.align.matrix.FullMatrixFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +import org.junit.Before; + +/** + * Represents {@link ViterbiAlgorithm} unit test. + * @author loomchild + * + */ +public class ViterbiAlgorithmTest extends HmmAlignAlgorithmTest { + + private ViterbiAlgorithm algorithm; + + protected ViterbiAlgorithm getAlgorithm() { + return algorithm; + } + + /** + * Constructs algorithm object. It is similar to Gale and Church algorithm. + */ + @Before + public void setUp() { + Counter counter = new CharCounter(); + Calculator calculator = new NormalDistributionCalculator(counter); + MatrixFactory matrixFactory = new FullMatrixFactory(); + + algorithm = new ViterbiAlgorithm(calculator, + CategoryDefaults.BEST_CATEGORY_MAP, matrixFactory); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiData.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiData.java.svn-base new file mode 100644 index 0000000..cfe3c11 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/.svn/text-base/ViterbiData.java.svn-base @@ -0,0 +1,57 @@ +package net.sourceforge.align.filter.aligner.align.hmm.viterbi; + +import net.sourceforge.align.coretypes.Category; + +/** + * Represents alignment data type stored in a matrix by {@link ViterbiAlgorithm}. + * Includes current alignment category, its score and cumulative score of + * all alignments scores from best path leading to this alignment including + * its score. + * + * @author loomchild + */ +public class ViterbiData { + + private Category category; + + private float score; + + private float totalScore; + + /** + * Creates data. + * @param category category of an alignment + * @param score score of this alignment + * @param totalScore total score of this alignment including all previous + * alignments on the path + */ + public ViterbiData(Category category, + float score, float totalScore) { + this.category = category; + this.score = score; + this.totalScore = totalScore; + } + + /** + * @return this alignment score + */ + public float getScore() { + return score; + } + + /** + * @return total score of this alignment including all previous alignments + * on the path + */ + public float getTotalScore() { + return totalScore; + } + + /** + * @return this alignment category + */ + public Category getCategory() { + return category; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithm.java b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithm.java new file mode 100755 index 0000000..31532cb --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithm.java @@ -0,0 +1,216 @@ + +package net.sourceforge.align.filter.aligner.align.hmm.viterbi; + +import static net.sourceforge.align.filter.aligner.align.hmm.Util.elementExists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.matrix.Matrix; +import net.sourceforge.align.matrix.MatrixFactory; +import net.sourceforge.align.matrix.MatrixIterator; +import net.sourceforge.align.progress.ProgressManager; +import net.sourceforge.align.progress.ProgressMeter; + + +/** + * Represents alignment algorithm which uses Viterbi algorithm. + * In simple words it finds a path in alignment matrix (representing + * all possible alignments) with maximum total probability. + * + * This algorithm is independent of method of calculating the individual + * alignment probabilities (see {@link Calculator} and the way the + * matrix is iterated (some irrelevant elements may be omitted by + * {@link MatrixIterator}, implemented by a {@link Matrix}). + * + * @see Viterbi Algorithm + * + * @see "A Tutorial on Hidden Markov Models and Selected + * Applications in Speech Recognition, Lawrence R. Rabiner" + * + * @author loomchild + * + */ +public class ViterbiAlgorithm implements AlignAlgorithm { + + private Map categoryMap; + + private Calculator calculator; + + private MatrixFactory matrixFactory; + + /** + * Creates an algorithm. + * @param calculator probability calculator + * @param categoryMap possible alignment categories with their probabilities + * @param matrixFactory factory creating two dimensional matrices + */ + public ViterbiAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory) { + this.matrixFactory = matrixFactory; + this.calculator = calculator; + this.categoryMap = categoryMap; + } + + /** + * Aligns by iterating over the whole matrix created by + * {@link MatrixFactory} (iteration can omit some elements depending on + * matrix implementation) and populating it with {@link ViterbiData} + * elements (obtained by calling + * {@link #createData(int, int, List, List, Matrix)}). After the matrix + * is populated calls {@link #backtrace(List, List, Matrix)} to retrieve + * the most probable alignment from the matrix. + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + + Matrix matrix = matrixFactory.createMatrix( + sourceSegmentList.size() + 1, targetSegmentList.size() + 1); + + ProgressMeter progress = new ProgressMeter("Viterbi Align", matrix.getSize()); + ProgressManager.getInstance().registerProgressMeter(progress); + + MatrixIterator iterator = matrix.getIterator(); + while(iterator.hasNext()) { + iterator.next(); + int x = iterator.getX(); + int y = iterator.getY(); + ViterbiData data = createData(x, y, sourceSegmentList, + targetSegmentList, matrix); + matrix.set(x, y, data); + + progress.completeTask(); + } + + List alignmentList = backtrace(sourceSegmentList, + targetSegmentList, matrix); + + ProgressManager.getInstance().unregisterProgressMeter(progress); + + return alignmentList; + } + + /** + *

Creates {@link ViterbiData} object at (sourceNr, targetNr) position + * on the matrix. To do it calculates most probable path to this element + * by checking all possible ways (categories) to reach it from previously + * calculated data objects (to the left or up, because they are calculated + * before current one) and adds new alignment score + * (calculated with {@link Calculator}).

+ * + *

When sourceNr == 0 and targetNr == 0 (upper left + * corner), then zero-to-zero category alignment is created. + * Does not insert created object into the matrix.

+ * + * @param sourceNr source segment position in new alignment (x position) + * @param targetNr target segment position in new alignment (y position) + * @param sourceSegmentList list of source segments + * @param targetSegmentList list of target segments + * @param matrix matrix where the data object will be later stored, used + * to calculate best alignment and total score + * @return data object, should never return null + */ + private ViterbiData createData(int sourceNr, int targetNr, + List sourceSegmentList, List targetSegmentList, + Matrix matrix) { + if (sourceNr == 0 && targetNr == 0) { + return new ViterbiData(new Category(0, 0), 0, 0); + } + Category bestCategory = null; + float minScore = Float.POSITIVE_INFINITY; + float minTotalScore = Float.POSITIVE_INFINITY; + for (Map.Entry entry : categoryMap.entrySet()) { + Category category = entry.getKey(); + float categoryScore = entry.getValue(); + int sourceStart = sourceNr - category.getSourceSegmentCount(); + int targetStart = targetNr - category.getTargetSegmentCount(); + if (elementExists(matrix, sourceStart, targetStart)) { + List sourceList = sourceSegmentList.subList(sourceStart, + sourceNr); + List targetList = targetSegmentList.subList(targetStart, + targetNr); + float score = categoryScore + + calculator.calculateScore(sourceList, targetList); + float totalScore = score + matrix.get( + sourceStart, targetStart).getTotalScore(); + if (totalScore < minTotalScore) { + minTotalScore = totalScore; + minScore = score; + bestCategory = category; + } + } + } + if (bestCategory == null) { + return null; + } else { + return new ViterbiData(bestCategory, minScore, minTotalScore); + } + } + + /** + * Retrieves best alignment from populated matrix by reconstructing the + * most probable path by iterating over it backwards and always selecting + * the most probable alignment. + * + * @param sourceSegmentList initial source segment list + * @param targetSegmentList initial target segment list + * @param matrix populated matrix + * @return alignment with highest total probability + */ + private List backtrace(List sourceSegmentList, + List targetSegmentList, Matrix matrix) { + + ListIterator sourceIterator = + sourceSegmentList.listIterator(sourceSegmentList.size()); + ListIterator targetIterator = + targetSegmentList.listIterator(targetSegmentList.size()); + List alignmentList = new ArrayList(); + + while (sourceIterator.hasPrevious() || targetIterator.hasPrevious()) { + ViterbiData data = matrix.get(sourceIterator.previousIndex() + 1, + targetIterator.previousIndex() + 1); + if (data == null) { + throw new IllegalStateException("Unable to reconstruct " + + "previously calculated alignment during backtrace."); + } + List sourceList = createReverseList(sourceIterator, + data.getCategory().getSourceSegmentCount()); + List targetList = createReverseList(targetIterator, + data.getCategory().getTargetSegmentCount()); + Alignment alignment = new Alignment(sourceList, targetList, + data.getScore()); + alignmentList.add(alignment); + } + Collections.reverse(alignmentList); + + return alignmentList; + } + + /** + * Retrieves given count of elements from list iterator by going backward + * (using {@link ListIterator#previous()}) and returns them as a list in + * reverse the order. + * + * @param iterator list iterator + * @param count number of elements to retrieve from iterator + * @return list of elements + */ + private List createReverseList(ListIterator iterator, + int count) { + List list = new ArrayList(count); + for (int i = 0; i < count; ++i) { + list.add(iterator.previous()); + } + Collections.reverse(list); + return list; + } + + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmFactory.java b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmFactory.java new file mode 100755 index 0000000..7bbbd8c --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmFactory.java @@ -0,0 +1,22 @@ +package net.sourceforge.align.filter.aligner.align.hmm.viterbi; + +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +/** + * Factory always producing objects of {@link ViterbiAlgorithm}. + * @author loomchild + */ +public class ViterbiAlgorithmFactory implements HmmAlignAlgorithmFactory { + + public AlignAlgorithm createAlignAlgorithm(Calculator calculator, + Map categoryMap, MatrixFactory matrixFactory) { + return new ViterbiAlgorithm(calculator, categoryMap, matrixFactory); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmTest.java b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmTest.java new file mode 100644 index 0000000..ffcb5bf --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiAlgorithmTest.java @@ -0,0 +1,40 @@ +package net.sourceforge.align.filter.aligner.align.hmm.viterbi; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.CategoryDefaults; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmTest; +import net.sourceforge.align.matrix.FullMatrixFactory; +import net.sourceforge.align.matrix.MatrixFactory; + +import org.junit.Before; + +/** + * Represents {@link ViterbiAlgorithm} unit test. + * @author loomchild + * + */ +public class ViterbiAlgorithmTest extends HmmAlignAlgorithmTest { + + private ViterbiAlgorithm algorithm; + + protected ViterbiAlgorithm getAlgorithm() { + return algorithm; + } + + /** + * Constructs algorithm object. It is similar to Gale and Church algorithm. + */ + @Before + public void setUp() { + Counter counter = new CharCounter(); + Calculator calculator = new NormalDistributionCalculator(counter); + MatrixFactory matrixFactory = new FullMatrixFactory(); + + algorithm = new ViterbiAlgorithm(calculator, + CategoryDefaults.BEST_CATEGORY_MAP, matrixFactory); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiData.java b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiData.java new file mode 100755 index 0000000..cfe3c11 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/hmm/viterbi/ViterbiData.java @@ -0,0 +1,57 @@ +package net.sourceforge.align.filter.aligner.align.hmm.viterbi; + +import net.sourceforge.align.coretypes.Category; + +/** + * Represents alignment data type stored in a matrix by {@link ViterbiAlgorithm}. + * Includes current alignment category, its score and cumulative score of + * all alignments scores from best path leading to this alignment including + * its score. + * + * @author loomchild + */ +public class ViterbiData { + + private Category category; + + private float score; + + private float totalScore; + + /** + * Creates data. + * @param category category of an alignment + * @param score score of this alignment + * @param totalScore total score of this alignment including all previous + * alignments on the path + */ + public ViterbiData(Category category, + float score, float totalScore) { + this.category = category; + this.score = score; + this.totalScore = totalScore; + } + + /** + * @return this alignment score + */ + public float getScore() { + return score; + } + + /** + * @return total score of this alignment including all previous alignments + * on the path + */ + public float getTotalScore() { + return totalScore; + } + + /** + * @return this alignment category + */ + public Category getCategory() { + return category; + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/all-wcprops b/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/all-wcprops new file mode 100644 index 0000000..3b88cf2 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/onetoone +END +OneToOneAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 123 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithmTest.java +END +OneToOneAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 119 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithm.java +END diff --git a/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/entries b/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/entries new file mode 100644 index 0000000..684c3f8 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/aligner/align/onetoone +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-02T23:37:42.328942Z +42 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +OneToOneAlgorithm.java +file +53 + + + +2011-02-04T18:32:08.000000Z +92a3e37e425249047f4f54747e3f400e +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +3244 + +OneToOneAlgorithmTest.java +file + + + + +2010-10-28T16:40:14.000000Z +d036fb4f2bd2adb75f2df5207de8305d +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +3104 + diff --git a/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/text-base/OneToOneAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/text-base/OneToOneAlgorithm.java.svn-base new file mode 100644 index 0000000..08af4c6 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/text-base/OneToOneAlgorithm.java.svn-base @@ -0,0 +1,94 @@ +package net.sourceforge.align.filter.aligner.align.onetoone; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.AlignmentImpossibleException; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; + +/** + * Represents an alignment algorithm that always returns one-to-one alignments. + * If such alignment is impossible can throw + * {@link AlignmentImpossibleException} or return some one-to-zero alignments + * depending on configuration. Useful for forcing certain alignment - for + * example when we know that in both text there is the same number of + * paragraphs, using this algorithm we can assure they will be aligned correctly. + * + * @author Jarek Lipski (loomchild) + */ +public class OneToOneAlgorithm implements AlignAlgorithm { + + public static final boolean DEFAULT_STRICT = false; + + private boolean strict; + + /** + * Creates one to one alignment algorithm + * @param strict if it is true then aligner will throw an exception if + * source and target segment counts are not equal + */ + public OneToOneAlgorithm(boolean strict) { + this.strict = strict; + } + + /** + * Creates one-to-one alignment algorithm with strict setting equal to + * {@link #DEFAULT_STRICT}. + */ + public OneToOneAlgorithm() { + this(DEFAULT_STRICT); + } + + /** + * Aligns source and target segments returning only one-to-one alignments + * (one source segment to one target segment). + * + * If numbers of source and target segments are not equal throws + * {@link AlignmentImpossibleException} if strict was set to true or + * returns remaining alignments as zero-to-one if strict is set to false. + * + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return alignment list containing all source and target segments. + * @throws AlignmentImpossibleException when strict is true and counts + * of source and target input segments are different + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + if (strict && (sourceSegmentList.size() != targetSegmentList.size())) { + throw new AlignmentImpossibleException("Cannot align 1 to 1 " + + "- segment amounts are not equal"); + } else if (sourceSegmentList.size() == 0 && + targetSegmentList.size() == 0) { + return Collections.emptyList(); + } else { + List alignmentList = new ArrayList( + sourceSegmentList.size()); + Iterator sourceIterator = sourceSegmentList.iterator(); + Iterator targetIterator = targetSegmentList.iterator(); + while (sourceIterator.hasNext() || targetIterator.hasNext()) { + Alignment alignment = new Alignment( + getSegmentList(sourceIterator), + getSegmentList(targetIterator), 0.0f); + alignmentList.add(alignment); + } + return alignmentList; + } + } + + private List getSegmentList(Iterator iterator) { + if (iterator.hasNext()) { + return singletonList(iterator.next()); + } else { + return emptyList(); + } + + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/text-base/OneToOneAlgorithmTest.java.svn-base b/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/text-base/OneToOneAlgorithmTest.java.svn-base new file mode 100644 index 0000000..a5e32e8 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/onetoone/.svn/text-base/OneToOneAlgorithmTest.java.svn-base @@ -0,0 +1,111 @@ +package net.sourceforge.align.filter.aligner.align.onetoone; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.AlignmentImpossibleException; + +import org.junit.Test; + +/** + * Represents {@link OneToOneAlgorithm} unit test. + * + * @author Jarek Lipski (loomchild) + */ +public class OneToOneAlgorithmTest { + + public static final String[] SOURCE_ARRAY = new String[] { + "a", "b", "c" + }; + + public static final String[] TARGET_ARRAY = new String[] { + "1", "2", "3" + }; + + public static final String[][] RESULT_SOURCE_ARRAY = new String[][] { + new String[]{"a"}, + new String[]{"b"}, + new String[]{"c"}, + }; + + public static final String[][] RESULT_TARGET_ARRAY = new String[][] { + new String[]{"1"}, + new String[]{"2"}, + new String[]{"3"}, + }; + + /** + * Test the case when there is equal number of source and target segments. + */ + @Test + public void alignEqualSize() { + OneToOneAlgorithm algorithm = new OneToOneAlgorithm(false); + List alignmentList = algorithm.align( + Arrays.asList(SOURCE_ARRAY), Arrays.asList(TARGET_ARRAY)); + assertAlignmentListEquals(RESULT_SOURCE_ARRAY, RESULT_TARGET_ARRAY, + alignmentList); + } + + public static final String[] NE_SOURCE_ARRAY = new String[] { + "a", "b", "c" + }; + + public static final String[] NE_TARGET_ARRAY = new String[] { + "1" + }; + + public static final String[][] NE_RESULT_SOURCE_ARRAY = new String[][] { + new String[]{"a"}, + new String[]{"b"}, + new String[]{"c"}, + }; + + public static final String[][] NE_RESULT_TARGET_ARRAY = new String[][] { + new String[]{"1"}, + new String[]{}, + new String[]{}, + }; + + /** + * Checks the case where source and target segment counts are unequal, + * but the aligner is not in strict mode. + */ + @Test + public void alignNotEqualSize() { + OneToOneAlgorithm algorithm = new OneToOneAlgorithm(false); + List alignmentList = algorithm.align( + Arrays.asList(NE_SOURCE_ARRAY), Arrays.asList(NE_TARGET_ARRAY)); + assertAlignmentListEquals(NE_RESULT_SOURCE_ARRAY, + NE_RESULT_TARGET_ARRAY, alignmentList); + } + + /** + * Checks whether exception will be thrown when source and target segment + * counts are unequal and the aligner is in strict mode. + */ + @Test(expected=AlignmentImpossibleException.class) + public void alignNotEqualSizeStrict() { + OneToOneAlgorithm algorithm = new OneToOneAlgorithm(true); + algorithm.align(Arrays.asList(NE_SOURCE_ARRAY), + Arrays.asList(NE_TARGET_ARRAY)); + } + + /** + * Checks if alignment of empty source and target segment lists will return + * empty list. + */ + @Test + public void alignEmpty() { + OneToOneAlgorithm algorithm = new OneToOneAlgorithm(true); + List sourceSegmentList = Arrays.asList(new String[]{}); + List targetSegmentList = Arrays.asList(new String[]{}); + List alignmentList = + algorithm.align(sourceSegmentList, targetSegmentList); + assertEquals(0, alignmentList.size()); + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithm.java b/src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithm.java new file mode 100755 index 0000000..08af4c6 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithm.java @@ -0,0 +1,94 @@ +package net.sourceforge.align.filter.aligner.align.onetoone; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.AlignmentImpossibleException; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; + +/** + * Represents an alignment algorithm that always returns one-to-one alignments. + * If such alignment is impossible can throw + * {@link AlignmentImpossibleException} or return some one-to-zero alignments + * depending on configuration. Useful for forcing certain alignment - for + * example when we know that in both text there is the same number of + * paragraphs, using this algorithm we can assure they will be aligned correctly. + * + * @author Jarek Lipski (loomchild) + */ +public class OneToOneAlgorithm implements AlignAlgorithm { + + public static final boolean DEFAULT_STRICT = false; + + private boolean strict; + + /** + * Creates one to one alignment algorithm + * @param strict if it is true then aligner will throw an exception if + * source and target segment counts are not equal + */ + public OneToOneAlgorithm(boolean strict) { + this.strict = strict; + } + + /** + * Creates one-to-one alignment algorithm with strict setting equal to + * {@link #DEFAULT_STRICT}. + */ + public OneToOneAlgorithm() { + this(DEFAULT_STRICT); + } + + /** + * Aligns source and target segments returning only one-to-one alignments + * (one source segment to one target segment). + * + * If numbers of source and target segments are not equal throws + * {@link AlignmentImpossibleException} if strict was set to true or + * returns remaining alignments as zero-to-one if strict is set to false. + * + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return alignment list containing all source and target segments. + * @throws AlignmentImpossibleException when strict is true and counts + * of source and target input segments are different + */ + public List align(List sourceSegmentList, + List targetSegmentList) { + if (strict && (sourceSegmentList.size() != targetSegmentList.size())) { + throw new AlignmentImpossibleException("Cannot align 1 to 1 " + + "- segment amounts are not equal"); + } else if (sourceSegmentList.size() == 0 && + targetSegmentList.size() == 0) { + return Collections.emptyList(); + } else { + List alignmentList = new ArrayList( + sourceSegmentList.size()); + Iterator sourceIterator = sourceSegmentList.iterator(); + Iterator targetIterator = targetSegmentList.iterator(); + while (sourceIterator.hasNext() || targetIterator.hasNext()) { + Alignment alignment = new Alignment( + getSegmentList(sourceIterator), + getSegmentList(targetIterator), 0.0f); + alignmentList.add(alignment); + } + return alignmentList; + } + } + + private List getSegmentList(Iterator iterator) { + if (iterator.hasNext()) { + return singletonList(iterator.next()); + } else { + return emptyList(); + } + + } + +} diff --git a/src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithmTest.java b/src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithmTest.java new file mode 100755 index 0000000..a5e32e8 --- /dev/null +++ b/src/net/sourceforge/align/filter/aligner/align/onetoone/OneToOneAlgorithmTest.java @@ -0,0 +1,111 @@ +package net.sourceforge.align.filter.aligner.align.onetoone; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.aligner.AlignmentImpossibleException; + +import org.junit.Test; + +/** + * Represents {@link OneToOneAlgorithm} unit test. + * + * @author Jarek Lipski (loomchild) + */ +public class OneToOneAlgorithmTest { + + public static final String[] SOURCE_ARRAY = new String[] { + "a", "b", "c" + }; + + public static final String[] TARGET_ARRAY = new String[] { + "1", "2", "3" + }; + + public static final String[][] RESULT_SOURCE_ARRAY = new String[][] { + new String[]{"a"}, + new String[]{"b"}, + new String[]{"c"}, + }; + + public static final String[][] RESULT_TARGET_ARRAY = new String[][] { + new String[]{"1"}, + new String[]{"2"}, + new String[]{"3"}, + }; + + /** + * Test the case when there is equal number of source and target segments. + */ + @Test + public void alignEqualSize() { + OneToOneAlgorithm algorithm = new OneToOneAlgorithm(false); + List alignmentList = algorithm.align( + Arrays.asList(SOURCE_ARRAY), Arrays.asList(TARGET_ARRAY)); + assertAlignmentListEquals(RESULT_SOURCE_ARRAY, RESULT_TARGET_ARRAY, + alignmentList); + } + + public static final String[] NE_SOURCE_ARRAY = new String[] { + "a", "b", "c" + }; + + public static final String[] NE_TARGET_ARRAY = new String[] { + "1" + }; + + public static final String[][] NE_RESULT_SOURCE_ARRAY = new String[][] { + new String[]{"a"}, + new String[]{"b"}, + new String[]{"c"}, + }; + + public static final String[][] NE_RESULT_TARGET_ARRAY = new String[][] { + new String[]{"1"}, + new String[]{}, + new String[]{}, + }; + + /** + * Checks the case where source and target segment counts are unequal, + * but the aligner is not in strict mode. + */ + @Test + public void alignNotEqualSize() { + OneToOneAlgorithm algorithm = new OneToOneAlgorithm(false); + List alignmentList = algorithm.align( + Arrays.asList(NE_SOURCE_ARRAY), Arrays.asList(NE_TARGET_ARRAY)); + assertAlignmentListEquals(NE_RESULT_SOURCE_ARRAY, + NE_RESULT_TARGET_ARRAY, alignmentList); + } + + /** + * Checks whether exception will be thrown when source and target segment + * counts are unequal and the aligner is in strict mode. + */ + @Test(expected=AlignmentImpossibleException.class) + public void alignNotEqualSizeStrict() { + OneToOneAlgorithm algorithm = new OneToOneAlgorithm(true); + algorithm.align(Arrays.asList(NE_SOURCE_ARRAY), + Arrays.asList(NE_TARGET_ARRAY)); + } + + /** + * Checks if alignment of empty source and target segment lists will return + * empty list. + */ + @Test + public void alignEmpty() { + OneToOneAlgorithm algorithm = new OneToOneAlgorithm(true); + List sourceSegmentList = Arrays.asList(new String[]{}); + List targetSegmentList = Arrays.asList(new String[]{}); + List alignmentList = + algorithm.align(sourceSegmentList, targetSegmentList); + assertEquals(0, alignmentList.size()); + } + +} diff --git a/src/net/sourceforge/align/filter/macro/.svn/all-wcprops b/src/net/sourceforge/align/filter/macro/.svn/all-wcprops new file mode 100644 index 0000000..758e204 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/all-wcprops @@ -0,0 +1,53 @@ +K 25 +svn:wc:ra_dav:version-url +V 79 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/macro +END +MooreMacroTest.java +K 25 +svn:wc:ra_dav:version-url +V 99 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/macro/MooreMacroTest.java +END +Macro.java +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/macro/Macro.java +END +MooreMacro.java +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/macro/MooreMacro.java +END +TranslationMacro.java +K 25 +svn:wc:ra_dav:version-url +V 101 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/macro/TranslationMacro.java +END +MacroTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 99 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/filter/macro/MacroTestSuite.java +END +PoissonTranslationMacro.java +K 25 +svn:wc:ra_dav:version-url +V 108 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/macro/PoissonTranslationMacro.java +END +PoissonMacro.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/macro/PoissonMacro.java +END +GaleAndChurchMacro.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/macro/GaleAndChurchMacro.java +END diff --git a/src/net/sourceforge/align/filter/macro/.svn/entries b/src/net/sourceforge/align/filter/macro/.svn/entries new file mode 100644 index 0000000..5d3fe04 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/entries @@ -0,0 +1,300 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/macro +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +GaleAndChurchMacro.java +file + + + + +2010-12-02T07:43:34.000000Z +a58296597bdcd88a55407683583c0aa4 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1584 + +Macro.java +file + + + + +2010-10-26T07:55:19.000000Z +6feeb84f76d42f132db0822708e2a602 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +400 + +MacroTestSuite.java +file + + + + +2010-11-13T18:38:49.000000Z +4c03675e0dd6204478d0cfef27165829 +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + + + + + + + + +287 + +MooreMacro.java +file + + + + +2010-12-01T18:44:39.000000Z +3c3b8198a94735c0324a472819b726b1 +2010-12-02T11:07:14.247557Z +50 +jarekl + + + + + + + + + + + + + + + + + + + + + +7695 + +MooreMacroTest.java +file + + + + +2010-11-13T19:36:27.000000Z +abaff825843a1fec2827618e9f49240b +2010-11-13T19:43:41.835402Z +45 +jarekl + + + + + + + + + + + + + + + + + + + + + +1774 + +PoissonMacro.java +file + + + + +2010-12-02T07:43:35.000000Z +75c9d3d7f7454af92797d314bdf1c37a +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1648 + +PoissonTranslationMacro.java +file + + + + +2010-12-02T07:43:34.000000Z +a195902b0f08117e97cc08dfead85040 +2010-12-02T11:07:14.247557Z +50 +jarekl + + + + + + + + + + + + + + + + + + + + + +4059 + +TranslationMacro.java +file + + + + +2010-12-02T07:43:35.000000Z +1f6f8b367a0cb02ed8f5cb33d1e692e5 +2010-12-02T11:07:14.247557Z +50 +jarekl + + + + + + + + + + + + + + + + + + + + + +3644 + diff --git a/src/net/sourceforge/align/filter/macro/.svn/text-base/GaleAndChurchMacro.java.svn-base b/src/net/sourceforge/align/filter/macro/.svn/text-base/GaleAndChurchMacro.java.svn-base new file mode 100644 index 0000000..6f329b8 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/text-base/GaleAndChurchMacro.java.svn-base @@ -0,0 +1,45 @@ +package net.sourceforge.align.filter.macro; + +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithmFactory; + +/** + * Represents macro to align a text using Gale and Church algorithm. + * Actual implementation can be slightly different but the result should be + * very similar. + * + * @see "A Program for Aligning Sentences in Bilingual Corpora, + * Gale, W.A., Church, K.W." + * @author loomchild + */ +public class GaleAndChurchMacro implements Macro { + + public List apply(List alignmentList) { + + Counter counter = new CharCounter(); + Calculator calculator = new NormalDistributionCalculator(counter); + + HmmAlignAlgorithmFactory algorithmFactory = + new ViterbiAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + +} diff --git a/src/net/sourceforge/align/filter/macro/.svn/text-base/Macro.java.svn-base b/src/net/sourceforge/align/filter/macro/.svn/text-base/Macro.java.svn-base new file mode 100644 index 0000000..d90a5e7 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/text-base/Macro.java.svn-base @@ -0,0 +1,14 @@ +package net.sourceforge.align.filter.macro; + +import net.sourceforge.align.filter.Filter; + +/** + * Represents a macro filter which consists of multiple filtering operations + * (for example complete alignment using Moore's algorithm - + * see {@link MooreMacro}). + * Created to simplify complex operations and improve the performance. + * @author loomchild + */ +public interface Macro extends Filter { + +} diff --git a/src/net/sourceforge/align/filter/macro/.svn/text-base/MacroTestSuite.java.svn-base b/src/net/sourceforge/align/filter/macro/.svn/text-base/MacroTestSuite.java.svn-base new file mode 100644 index 0000000..415711c --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/text-base/MacroTestSuite.java.svn-base @@ -0,0 +1,16 @@ +package net.sourceforge.align.filter.macro; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents macro package unit test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MooreMacroTest.class +}) +public class MacroTestSuite { + +} diff --git a/src/net/sourceforge/align/filter/macro/.svn/text-base/MooreMacro.java.svn-base b/src/net/sourceforge/align/filter/macro/.svn/text-base/MooreMacro.java.svn-base new file mode 100644 index 0000000..06d0253 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/text-base/MooreMacro.java.svn-base @@ -0,0 +1,211 @@ +package net.sourceforge.align.filter.macro; + +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.content.TranslationCalculator; +import net.sourceforge.align.calculator.length.PoissonDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.calculator.length.counter.SplitCounter; +import net.sourceforge.align.calculator.meta.CompositeCalculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.UnifyAligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; +import net.sourceforge.align.filter.meta.CompositeFilter; +import net.sourceforge.align.filter.modifier.Modifier; +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.UnifyRareWordsCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.filter.selector.FractionSelector; +import net.sourceforge.align.filter.selector.OneToOneSelector; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Represents macro to align a text using Moore's algorithm. + * Actual implementation can be slightly different (for example does not + * normalize scores, selects a fraction instead, or uses different distribution + * because results seem to be better), but the result should be + * very similar (in reality they are worse, investigating the issue). + * + * @see "Fast and Accurate Sentence Alignment of Bilingual + * Corpora, Robert C. Moore" + * + * @see + * A new tool for the bilingual text aligning at the sentence level, + * Krzystof Jassem, Jarek Lipski + * + * @author loomchild + */ +public class MooreMacro implements Macro { + + private static final Log log = LogFactory.getLog(MooreMacro.class); + + public static final float SELECT_FRACTION = 0.85f; + + /** + * Performs the alignment: + *
    + *
  1. Removes rare words from the input
  2. + *
  3. Aligns by length and selects best alignments from the result
  4. + *
  5. Trains language and translation models based on initial alignment
  6. + *
  7. Performs actual alignment using the models
  8. + *
  9. Unifies initial alignment with resulting one to recover rare words
  10. + *
+ */ + public List apply(List alignmentList) { + List unifiedAlignmentList = unifyRareWords(alignmentList); + + List lengthAlignmentList = lengthAlign(unifiedAlignmentList); + + List bestAlignmentList = selectBestAlignments(lengthAlignmentList); + + if (bestAlignmentList.size() == 0) { + log.warn("Content alignment is impossible because zero " + + "best alignments were selected from length alignment. " + + "Returning result of length alignment only."); + return unifyAlignments(alignmentList, lengthAlignmentList); + } + + List contentAlignmentList = + contentAlign(unifiedAlignmentList, bestAlignmentList); + + return unifyAlignments(alignmentList, contentAlignmentList); + + } + + /** + * Changes rare words in the input to some predefined unknown + * word. This improves alignment speed and reduces translation and language + * models size. + * + * @param alignmentList input alignment list + * @return modified alignment list + */ + private List unifyRareWords(List alignmentList) { + + SplitAlgorithm splitAlgorithm = DEFAULT_TOKENIZE_ALGORITHM; + + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + + VocabularyUtil.tokenize(splitAlgorithm, alignmentList, + sourceVocabulary, targetVocabulary, + sourceWidList, targetWidList); + + sourceVocabulary = VocabularyUtil.createTruncatedVocabulary( + sourceWidList, sourceVocabulary); + targetVocabulary = VocabularyUtil.createTruncatedVocabulary( + targetWidList, targetVocabulary); + + ModifyAlgorithm sourceAlgorithm = + new UnifyRareWordsCleanAlgorithm(sourceVocabulary); + ModifyAlgorithm targetAlgorithm = + new UnifyRareWordsCleanAlgorithm(targetVocabulary); + + Filter filter = new Modifier(sourceAlgorithm, targetAlgorithm); + + return filter.apply(alignmentList); + + } + + /** + * First algorithm phase - align text by segment length (using similar + * method to the one used in {@link PoissonMacro}). + * @param alignmentList input alignment list + * @return aligned list + */ + private List lengthAlign(List alignmentList) { + Counter counter = new SplitCounter(); + Calculator calculator = + new PoissonDistributionCalculator(counter, alignmentList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + } + + /** + * Selects only {@link #SELECT_FRACTION} one-to-one alignments from the + * result. + * @param alignmentList + * @return + */ + private List selectBestAlignments(List alignmentList) { + List filterList = new ArrayList(); + filterList.add(new OneToOneSelector()); + filterList.add(new FractionSelector(SELECT_FRACTION)); + Filter filter = new CompositeFilter(filterList); + return filter.apply(alignmentList); + } + + /** + * Second algorithm phase - align by segment contents. First trains + * translation model and language models using alignment obtained in first + * phase, and after that aligns by calculating translation probability. + * + * @param alignmentList + * @param bestAlignmentList + * @return + */ + private List contentAlign(List alignmentList, + List bestAlignmentList) { + + List calculatorList = new ArrayList(); + + Counter counter = new SplitCounter(); + calculatorList.add(new PoissonDistributionCalculator(counter, alignmentList)); + + calculatorList.add(new TranslationCalculator(bestAlignmentList)); + + Calculator calculator = new CompositeCalculator(calculatorList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + + /** + * Unifies alignments from alignment list with reference alignment list. + * @param alignmentList alignment list + * @param referenceAlignmentList reference alignment list + * @return unified alignment list + * @see UnifyAligner + */ + private List unifyAlignments(List alignmentList, + List referenceAlignmentList) { + + Filter filter = new UnifyAligner(referenceAlignmentList); + + return filter.apply(alignmentList); + + } + + +} diff --git a/src/net/sourceforge/align/filter/macro/.svn/text-base/MooreMacroTest.java.svn-base b/src/net/sourceforge/align/filter/macro/.svn/text-base/MooreMacroTest.java.svn-base new file mode 100644 index 0000000..e01d3f7 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/text-base/MooreMacroTest.java.svn-base @@ -0,0 +1,45 @@ +package net.sourceforge.align.filter.macro; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.Util; + +import org.junit.Before; +import org.junit.Test; + +public class MooreMacroTest { + + private MooreMacro macro; + + @Before + public void setUp() { + this.macro = new MooreMacro(); + } + + /** + * Tests if when aligning three to one no {@link NullPointerException} + * will be thrown, as it was the case. + */ + @Test + public void testPreservesAllSegments() { + String[] sourceSegments = new String[]{ + "He had given up attending to matters of practical importance; he had lost all desire to do so.", + "Nothing that any landlady could do had a real terror for him.", + "But to be stopped on the stairs, to be forced to listen to her trivial, irrelevant gossip, to pestering demands for payment, threats and complaints, and to rack his brains for excuses, to prevaricate, to lie—no, rather than that, he would creep down the stairs like a cat and slip out unseen." + }; + + String[] targetSegments = new String[]{ + "Aber auf der Treppe stehenzubleiben, allerlei Gewäsch über allen möglichen ihm ganz gleichgültigen Alltagskram, all diese Mahnungen ans Bezahlen, die Drohungen und Klagen anzuhören und dabei selbst sich herauszuwinden, sich zu entschuldigen, zu lügen – nein, da war es schon besser, wie eine Katze auf der Treppe vorbeizuschlüpfen und sich, ohne von jemand gesehen zu werden, flink davonzumachen." + }; + + List alignmentList = Util.createAlignmentList( + new String[][] {sourceSegments}, + new String[][] {targetSegments}); + + List result = macro.apply(alignmentList); + + Util.assertAlignmentListContains(sourceSegments, targetSegments, result); + } + +} diff --git a/src/net/sourceforge/align/filter/macro/.svn/text-base/PoissonMacro.java.svn-base b/src/net/sourceforge/align/filter/macro/.svn/text-base/PoissonMacro.java.svn-base new file mode 100644 index 0000000..42fb510 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/text-base/PoissonMacro.java.svn-base @@ -0,0 +1,46 @@ +package net.sourceforge.align.filter.macro; + +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.PoissonDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.calculator.length.counter.SplitCounter; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; + +/** + * Uses algorithm similar to Gale and Church (see {@link GaleAndChurchMacro}), + * but instead of normal distribution uses Poisson distribution and + * measures length of sentence in words instead of characters as in original. + * + * Seems to give better results than Gale and Church algorithm. + * + * @author loomchild + */ +public class PoissonMacro implements Macro { + + public List apply(List alignmentList) { + + Counter counter = new SplitCounter(); + Calculator calculator = + new PoissonDistributionCalculator(counter, alignmentList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + +} diff --git a/src/net/sourceforge/align/filter/macro/.svn/text-base/PoissonTranslationMacro.java.svn-base b/src/net/sourceforge/align/filter/macro/.svn/text-base/PoissonTranslationMacro.java.svn-base new file mode 100644 index 0000000..d5aa20f --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/text-base/PoissonTranslationMacro.java.svn-base @@ -0,0 +1,119 @@ +package net.sourceforge.align.filter.macro; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.content.TranslationCalculator; +import net.sourceforge.align.calculator.length.PoissonDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.calculator.length.counter.SplitCounter; +import net.sourceforge.align.calculator.meta.CompositeCalculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; +import net.sourceforge.align.filter.meta.CompositeFilter; +import net.sourceforge.align.filter.selector.FractionSelector; +import net.sourceforge.align.filter.selector.OneToOneSelector; + +/** + * Uses algorithm very similar to {@link TranslationMacro} but when calculating + * final alignment phase combines translation probability and + * length probability {using @link PoissonMacro}. + * + * @author loomchild + */ + +public class PoissonTranslationMacro implements Macro { + + public static final float SELECT_FRACTION = 0.9f; + + /** + * Performs the alignment: + *
    + *
  1. Aligns by length and selects best alignments from the result
  2. + *
  3. Trains language and translation models based on initial alignment
  4. + *
  5. Performs actual alignment using the models and lengths combined
  6. + *
+ */ + public List apply(List alignmentList) { + + List bestAlignmentList = lengthAlign(alignmentList); + + return contentAlign(alignmentList, bestAlignmentList); + + } + + /** + * First algorithm phase - align text by segment length (using similar + * method to the one used in {@link PoissonMacro}). + * Selects only {@link #SELECT_FRACTION} one-to-one alignments from the + * result. + * @param alignmentList input alignment list + * @return aligned list + */ + private List lengthAlign(List alignmentList) { + + List filterList = new ArrayList(); + + Counter counter = new SplitCounter(); + Calculator calculator = + new PoissonDistributionCalculator(counter, alignmentList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + filterList.add(new Aligner(algorithm)); + + filterList.add(new OneToOneSelector()); + + filterList.add(new FractionSelector(SELECT_FRACTION)); + + Filter filter = new CompositeFilter(filterList); + + return filter.apply(alignmentList); + + } + + /** + * Second algorithm phase - align by segment contents and. First trains + * translation model and language models using alignment obtained in first + * phase, and after that aligns by calculating translation probability + * combined with length probability using {@link CompositeCalculator}. + * + * @param alignmentList + * @param bestAlignmentList + * @return + */ + private List contentAlign(List alignmentList, + List bestAlignmentList) { + + List calculatorList = new ArrayList(); + + Counter counter = new SplitCounter(); + calculatorList.add(new PoissonDistributionCalculator(counter, alignmentList)); + + calculatorList.add(new TranslationCalculator(bestAlignmentList)); + + Calculator calculator = new CompositeCalculator(calculatorList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + +} diff --git a/src/net/sourceforge/align/filter/macro/.svn/text-base/TranslationMacro.java.svn-base b/src/net/sourceforge/align/filter/macro/.svn/text-base/TranslationMacro.java.svn-base new file mode 100644 index 0000000..4e0ebd2 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/.svn/text-base/TranslationMacro.java.svn-base @@ -0,0 +1,109 @@ +package net.sourceforge.align.filter.macro; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.content.TranslationCalculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; +import net.sourceforge.align.filter.meta.CompositeFilter; +import net.sourceforge.align.filter.selector.FractionSelector; +import net.sourceforge.align.filter.selector.OneToOneSelector; + +/** + * Uses algorithm similar to Moore's (see {@link MooreMacro}) but instead + * of Poisson distribution uses normal distribution and calculates length + * of sentence in characters (similar to Gale and Church algorithm). + * + * @author loomchild + */ +public class TranslationMacro implements Macro { + + public static final float SELECT_FRACTION = 0.9f; + + /** + * Performs the alignment: + *
    + *
  1. Aligns by length and selects best alignments from the result
  2. + *
  3. Trains language and translation models based on initial alignment
  4. + *
  5. Performs actual alignment using the models
  6. + *
+ */ + public List apply(List alignmentList) { + + List bestAlignmentList = lengthAlign(alignmentList); + + return contentAlign(alignmentList, bestAlignmentList); + + } + + /** + * First algorithm phase - align text by segment length (using similar + * method to the one used in {@link GaleAndChurchMacro}). + * Selects only {@link #SELECT_FRACTION} one-to-one alignments from the + * result. + * @param alignmentList input alignment list + * @return aligned list + */ + private List lengthAlign(List alignmentList) { + + List filterList = new ArrayList(); + + Counter counter = new CharCounter(); + Calculator calculator = new NormalDistributionCalculator(counter); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + filterList.add(new Aligner(algorithm)); + + filterList.add(new OneToOneSelector()); + + filterList.add(new FractionSelector(SELECT_FRACTION)); + + Filter filter = new CompositeFilter(filterList); + + return filter.apply(alignmentList); + + } + + /** + * Second algorithm phase - align by segment contents. First trains + * translation model and language models using alignment obtained in first + * phase, and after that aligns by calculating translation probability. + * + * @param alignmentList + * @param bestAlignmentList + * @return + */ + private List contentAlign(List alignmentList, + List bestAlignmentList) { + + Calculator calculator = + new TranslationCalculator(bestAlignmentList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + +} diff --git a/src/net/sourceforge/align/filter/macro/GaleAndChurchMacro.java b/src/net/sourceforge/align/filter/macro/GaleAndChurchMacro.java new file mode 100755 index 0000000..6f329b8 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/GaleAndChurchMacro.java @@ -0,0 +1,45 @@ +package net.sourceforge.align.filter.macro; + +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithmFactory; + +/** + * Represents macro to align a text using Gale and Church algorithm. + * Actual implementation can be slightly different but the result should be + * very similar. + * + * @see "A Program for Aligning Sentences in Bilingual Corpora, + * Gale, W.A., Church, K.W." + * @author loomchild + */ +public class GaleAndChurchMacro implements Macro { + + public List apply(List alignmentList) { + + Counter counter = new CharCounter(); + Calculator calculator = new NormalDistributionCalculator(counter); + + HmmAlignAlgorithmFactory algorithmFactory = + new ViterbiAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + +} diff --git a/src/net/sourceforge/align/filter/macro/Macro.java b/src/net/sourceforge/align/filter/macro/Macro.java new file mode 100755 index 0000000..d90a5e7 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/Macro.java @@ -0,0 +1,14 @@ +package net.sourceforge.align.filter.macro; + +import net.sourceforge.align.filter.Filter; + +/** + * Represents a macro filter which consists of multiple filtering operations + * (for example complete alignment using Moore's algorithm - + * see {@link MooreMacro}). + * Created to simplify complex operations and improve the performance. + * @author loomchild + */ +public interface Macro extends Filter { + +} diff --git a/src/net/sourceforge/align/filter/macro/MacroTestSuite.java b/src/net/sourceforge/align/filter/macro/MacroTestSuite.java new file mode 100644 index 0000000..415711c --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/MacroTestSuite.java @@ -0,0 +1,16 @@ +package net.sourceforge.align.filter.macro; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents macro package unit test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MooreMacroTest.class +}) +public class MacroTestSuite { + +} diff --git a/src/net/sourceforge/align/filter/macro/MooreMacro.java b/src/net/sourceforge/align/filter/macro/MooreMacro.java new file mode 100755 index 0000000..06d0253 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/MooreMacro.java @@ -0,0 +1,211 @@ +package net.sourceforge.align.filter.macro; + +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.content.TranslationCalculator; +import net.sourceforge.align.calculator.length.PoissonDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.calculator.length.counter.SplitCounter; +import net.sourceforge.align.calculator.meta.CompositeCalculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.UnifyAligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; +import net.sourceforge.align.filter.meta.CompositeFilter; +import net.sourceforge.align.filter.modifier.Modifier; +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.UnifyRareWordsCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.filter.selector.FractionSelector; +import net.sourceforge.align.filter.selector.OneToOneSelector; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Represents macro to align a text using Moore's algorithm. + * Actual implementation can be slightly different (for example does not + * normalize scores, selects a fraction instead, or uses different distribution + * because results seem to be better), but the result should be + * very similar (in reality they are worse, investigating the issue). + * + * @see "Fast and Accurate Sentence Alignment of Bilingual + * Corpora, Robert C. Moore" + * + * @see + * A new tool for the bilingual text aligning at the sentence level, + * Krzystof Jassem, Jarek Lipski + * + * @author loomchild + */ +public class MooreMacro implements Macro { + + private static final Log log = LogFactory.getLog(MooreMacro.class); + + public static final float SELECT_FRACTION = 0.85f; + + /** + * Performs the alignment: + *
    + *
  1. Removes rare words from the input
  2. + *
  3. Aligns by length and selects best alignments from the result
  4. + *
  5. Trains language and translation models based on initial alignment
  6. + *
  7. Performs actual alignment using the models
  8. + *
  9. Unifies initial alignment with resulting one to recover rare words
  10. + *
+ */ + public List apply(List alignmentList) { + List unifiedAlignmentList = unifyRareWords(alignmentList); + + List lengthAlignmentList = lengthAlign(unifiedAlignmentList); + + List bestAlignmentList = selectBestAlignments(lengthAlignmentList); + + if (bestAlignmentList.size() == 0) { + log.warn("Content alignment is impossible because zero " + + "best alignments were selected from length alignment. " + + "Returning result of length alignment only."); + return unifyAlignments(alignmentList, lengthAlignmentList); + } + + List contentAlignmentList = + contentAlign(unifiedAlignmentList, bestAlignmentList); + + return unifyAlignments(alignmentList, contentAlignmentList); + + } + + /** + * Changes rare words in the input to some predefined unknown + * word. This improves alignment speed and reduces translation and language + * models size. + * + * @param alignmentList input alignment list + * @return modified alignment list + */ + private List unifyRareWords(List alignmentList) { + + SplitAlgorithm splitAlgorithm = DEFAULT_TOKENIZE_ALGORITHM; + + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + + VocabularyUtil.tokenize(splitAlgorithm, alignmentList, + sourceVocabulary, targetVocabulary, + sourceWidList, targetWidList); + + sourceVocabulary = VocabularyUtil.createTruncatedVocabulary( + sourceWidList, sourceVocabulary); + targetVocabulary = VocabularyUtil.createTruncatedVocabulary( + targetWidList, targetVocabulary); + + ModifyAlgorithm sourceAlgorithm = + new UnifyRareWordsCleanAlgorithm(sourceVocabulary); + ModifyAlgorithm targetAlgorithm = + new UnifyRareWordsCleanAlgorithm(targetVocabulary); + + Filter filter = new Modifier(sourceAlgorithm, targetAlgorithm); + + return filter.apply(alignmentList); + + } + + /** + * First algorithm phase - align text by segment length (using similar + * method to the one used in {@link PoissonMacro}). + * @param alignmentList input alignment list + * @return aligned list + */ + private List lengthAlign(List alignmentList) { + Counter counter = new SplitCounter(); + Calculator calculator = + new PoissonDistributionCalculator(counter, alignmentList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + } + + /** + * Selects only {@link #SELECT_FRACTION} one-to-one alignments from the + * result. + * @param alignmentList + * @return + */ + private List selectBestAlignments(List alignmentList) { + List filterList = new ArrayList(); + filterList.add(new OneToOneSelector()); + filterList.add(new FractionSelector(SELECT_FRACTION)); + Filter filter = new CompositeFilter(filterList); + return filter.apply(alignmentList); + } + + /** + * Second algorithm phase - align by segment contents. First trains + * translation model and language models using alignment obtained in first + * phase, and after that aligns by calculating translation probability. + * + * @param alignmentList + * @param bestAlignmentList + * @return + */ + private List contentAlign(List alignmentList, + List bestAlignmentList) { + + List calculatorList = new ArrayList(); + + Counter counter = new SplitCounter(); + calculatorList.add(new PoissonDistributionCalculator(counter, alignmentList)); + + calculatorList.add(new TranslationCalculator(bestAlignmentList)); + + Calculator calculator = new CompositeCalculator(calculatorList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + + /** + * Unifies alignments from alignment list with reference alignment list. + * @param alignmentList alignment list + * @param referenceAlignmentList reference alignment list + * @return unified alignment list + * @see UnifyAligner + */ + private List unifyAlignments(List alignmentList, + List referenceAlignmentList) { + + Filter filter = new UnifyAligner(referenceAlignmentList); + + return filter.apply(alignmentList); + + } + + +} diff --git a/src/net/sourceforge/align/filter/macro/MooreMacroTest.java b/src/net/sourceforge/align/filter/macro/MooreMacroTest.java new file mode 100644 index 0000000..e01d3f7 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/MooreMacroTest.java @@ -0,0 +1,45 @@ +package net.sourceforge.align.filter.macro; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.Util; + +import org.junit.Before; +import org.junit.Test; + +public class MooreMacroTest { + + private MooreMacro macro; + + @Before + public void setUp() { + this.macro = new MooreMacro(); + } + + /** + * Tests if when aligning three to one no {@link NullPointerException} + * will be thrown, as it was the case. + */ + @Test + public void testPreservesAllSegments() { + String[] sourceSegments = new String[]{ + "He had given up attending to matters of practical importance; he had lost all desire to do so.", + "Nothing that any landlady could do had a real terror for him.", + "But to be stopped on the stairs, to be forced to listen to her trivial, irrelevant gossip, to pestering demands for payment, threats and complaints, and to rack his brains for excuses, to prevaricate, to lie—no, rather than that, he would creep down the stairs like a cat and slip out unseen." + }; + + String[] targetSegments = new String[]{ + "Aber auf der Treppe stehenzubleiben, allerlei Gewäsch über allen möglichen ihm ganz gleichgültigen Alltagskram, all diese Mahnungen ans Bezahlen, die Drohungen und Klagen anzuhören und dabei selbst sich herauszuwinden, sich zu entschuldigen, zu lügen – nein, da war es schon besser, wie eine Katze auf der Treppe vorbeizuschlüpfen und sich, ohne von jemand gesehen zu werden, flink davonzumachen." + }; + + List alignmentList = Util.createAlignmentList( + new String[][] {sourceSegments}, + new String[][] {targetSegments}); + + List result = macro.apply(alignmentList); + + Util.assertAlignmentListContains(sourceSegments, targetSegments, result); + } + +} diff --git a/src/net/sourceforge/align/filter/macro/PoissonMacro.java b/src/net/sourceforge/align/filter/macro/PoissonMacro.java new file mode 100755 index 0000000..42fb510 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/PoissonMacro.java @@ -0,0 +1,46 @@ +package net.sourceforge.align.filter.macro; + +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.length.PoissonDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.calculator.length.counter.SplitCounter; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; + +/** + * Uses algorithm similar to Gale and Church (see {@link GaleAndChurchMacro}), + * but instead of normal distribution uses Poisson distribution and + * measures length of sentence in words instead of characters as in original. + * + * Seems to give better results than Gale and Church algorithm. + * + * @author loomchild + */ +public class PoissonMacro implements Macro { + + public List apply(List alignmentList) { + + Counter counter = new SplitCounter(); + Calculator calculator = + new PoissonDistributionCalculator(counter, alignmentList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + +} diff --git a/src/net/sourceforge/align/filter/macro/PoissonTranslationMacro.java b/src/net/sourceforge/align/filter/macro/PoissonTranslationMacro.java new file mode 100755 index 0000000..d5aa20f --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/PoissonTranslationMacro.java @@ -0,0 +1,119 @@ +package net.sourceforge.align.filter.macro; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.content.TranslationCalculator; +import net.sourceforge.align.calculator.length.PoissonDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.calculator.length.counter.SplitCounter; +import net.sourceforge.align.calculator.meta.CompositeCalculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; +import net.sourceforge.align.filter.meta.CompositeFilter; +import net.sourceforge.align.filter.selector.FractionSelector; +import net.sourceforge.align.filter.selector.OneToOneSelector; + +/** + * Uses algorithm very similar to {@link TranslationMacro} but when calculating + * final alignment phase combines translation probability and + * length probability {using @link PoissonMacro}. + * + * @author loomchild + */ + +public class PoissonTranslationMacro implements Macro { + + public static final float SELECT_FRACTION = 0.9f; + + /** + * Performs the alignment: + *
    + *
  1. Aligns by length and selects best alignments from the result
  2. + *
  3. Trains language and translation models based on initial alignment
  4. + *
  5. Performs actual alignment using the models and lengths combined
  6. + *
+ */ + public List apply(List alignmentList) { + + List bestAlignmentList = lengthAlign(alignmentList); + + return contentAlign(alignmentList, bestAlignmentList); + + } + + /** + * First algorithm phase - align text by segment length (using similar + * method to the one used in {@link PoissonMacro}). + * Selects only {@link #SELECT_FRACTION} one-to-one alignments from the + * result. + * @param alignmentList input alignment list + * @return aligned list + */ + private List lengthAlign(List alignmentList) { + + List filterList = new ArrayList(); + + Counter counter = new SplitCounter(); + Calculator calculator = + new PoissonDistributionCalculator(counter, alignmentList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + filterList.add(new Aligner(algorithm)); + + filterList.add(new OneToOneSelector()); + + filterList.add(new FractionSelector(SELECT_FRACTION)); + + Filter filter = new CompositeFilter(filterList); + + return filter.apply(alignmentList); + + } + + /** + * Second algorithm phase - align by segment contents and. First trains + * translation model and language models using alignment obtained in first + * phase, and after that aligns by calculating translation probability + * combined with length probability using {@link CompositeCalculator}. + * + * @param alignmentList + * @param bestAlignmentList + * @return + */ + private List contentAlign(List alignmentList, + List bestAlignmentList) { + + List calculatorList = new ArrayList(); + + Counter counter = new SplitCounter(); + calculatorList.add(new PoissonDistributionCalculator(counter, alignmentList)); + + calculatorList.add(new TranslationCalculator(bestAlignmentList)); + + Calculator calculator = new CompositeCalculator(calculatorList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + +} diff --git a/src/net/sourceforge/align/filter/macro/TranslationMacro.java b/src/net/sourceforge/align/filter/macro/TranslationMacro.java new file mode 100755 index 0000000..4e0ebd2 --- /dev/null +++ b/src/net/sourceforge/align/filter/macro/TranslationMacro.java @@ -0,0 +1,109 @@ +package net.sourceforge.align.filter.macro; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.content.TranslationCalculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; +import net.sourceforge.align.filter.meta.CompositeFilter; +import net.sourceforge.align.filter.selector.FractionSelector; +import net.sourceforge.align.filter.selector.OneToOneSelector; + +/** + * Uses algorithm similar to Moore's (see {@link MooreMacro}) but instead + * of Poisson distribution uses normal distribution and calculates length + * of sentence in characters (similar to Gale and Church algorithm). + * + * @author loomchild + */ +public class TranslationMacro implements Macro { + + public static final float SELECT_FRACTION = 0.9f; + + /** + * Performs the alignment: + *
    + *
  1. Aligns by length and selects best alignments from the result
  2. + *
  3. Trains language and translation models based on initial alignment
  4. + *
  5. Performs actual alignment using the models
  6. + *
+ */ + public List apply(List alignmentList) { + + List bestAlignmentList = lengthAlign(alignmentList); + + return contentAlign(alignmentList, bestAlignmentList); + + } + + /** + * First algorithm phase - align text by segment length (using similar + * method to the one used in {@link GaleAndChurchMacro}). + * Selects only {@link #SELECT_FRACTION} one-to-one alignments from the + * result. + * @param alignmentList input alignment list + * @return aligned list + */ + private List lengthAlign(List alignmentList) { + + List filterList = new ArrayList(); + + Counter counter = new CharCounter(); + Calculator calculator = new NormalDistributionCalculator(counter); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + filterList.add(new Aligner(algorithm)); + + filterList.add(new OneToOneSelector()); + + filterList.add(new FractionSelector(SELECT_FRACTION)); + + Filter filter = new CompositeFilter(filterList); + + return filter.apply(alignmentList); + + } + + /** + * Second algorithm phase - align by segment contents. First trains + * translation model and language models using alignment obtained in first + * phase, and after that aligns by calculating translation probability. + * + * @param alignmentList + * @param bestAlignmentList + * @return + */ + private List contentAlign(List alignmentList, + List bestAlignmentList) { + + Calculator calculator = + new TranslationCalculator(bestAlignmentList); + + HmmAlignAlgorithmFactory algorithmFactory = + new ForwardBackwardAlgorithmFactory(); + + AlignAlgorithm algorithm = + new AdaptiveBandAlgorithm(algorithmFactory, calculator); + + Filter filter = new Aligner(algorithm); + + return filter.apply(alignmentList); + + } + +} diff --git a/src/net/sourceforge/align/filter/meta/.svn/all-wcprops b/src/net/sourceforge/align/filter/meta/.svn/all-wcprops new file mode 100644 index 0000000..caa7a1e --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/all-wcprops @@ -0,0 +1,41 @@ +K 25 +svn:wc:ra_dav:version-url +V 78 +/svnroot/align/!svn/ver/46/trunk/maligna/src/net/sourceforge/align/filter/meta +END +FilterDecorators.java +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/46/trunk/maligna/src/net/sourceforge/align/filter/meta/FilterDecorators.java +END +CompositeFilter.java +K 25 +svn:wc:ra_dav:version-url +V 99 +/svnroot/align/!svn/ver/46/trunk/maligna/src/net/sourceforge/align/filter/meta/CompositeFilter.java +END +IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java +K 25 +svn:wc:ra_dav:version-url +V 138 +/svnroot/align/!svn/ver/46/trunk/maligna/src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java +END +IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java +K 25 +svn:wc:ra_dav:version-url +V 134 +/svnroot/align/!svn/ver/46/trunk/maligna/src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java +END +CompositeFilterTest.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/46/trunk/maligna/src/net/sourceforge/align/filter/meta/CompositeFilterTest.java +END +MetaTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/46/trunk/maligna/src/net/sourceforge/align/filter/meta/MetaTestSuite.java +END diff --git a/src/net/sourceforge/align/filter/meta/.svn/entries b/src/net/sourceforge/align/filter/meta/.svn/entries new file mode 100644 index 0000000..ba29743 --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/entries @@ -0,0 +1,239 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/meta +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:05:07.284998Z +46 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +CompositeFilter.java +file + + + + +2010-12-01T08:38:23.000000Z +94a96138478907ca636feed2df7c0670 +2010-12-02T11:05:07.284998Z +46 +jarekl + + + + + + + + + + + + + + + + + + + + + +1174 + +CompositeFilterTest.java +file + + + + +2010-12-01T08:38:24.000000Z +28857d366a382600877a6323f67f3526 +2010-12-02T11:05:07.284998Z +46 +jarekl + + + + + + + + + + + + + + + + + + + + + +2531 + +FilterDecorators.java +file + + + + +2010-12-02T08:30:46.000000Z +450d5931836070a16051d0ef242f6e90 +2010-12-02T11:05:07.284998Z +46 +jarekl + + + + + + + + + + + + + + + + + + + + + +532 + +IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java +file + + + + +2010-12-01T08:46:53.000000Z +36dd81287f1a843a34f593e56377b27d +2010-12-02T11:05:07.284998Z +46 +jarekl + + + + + + + + + + + + + + + + + + + + + +1659 + +IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java +file + + + + +2010-12-01T09:00:16.000000Z +046c59576dbb960552d313e7bafbb60e +2010-12-02T11:05:07.284998Z +46 +jarekl + + + + + + + + + + + + + + + + + + + + + +2067 + +MetaTestSuite.java +file + + + + +2010-12-01T08:49:02.000000Z +e7c58b86ef20946f3c331f7a90e1437a +2010-12-02T11:05:07.284998Z +46 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +404 + diff --git a/src/net/sourceforge/align/filter/meta/.svn/prop-base/MetaTestSuite.java.svn-base b/src/net/sourceforge/align/filter/meta/.svn/prop-base/MetaTestSuite.java.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/prop-base/MetaTestSuite.java.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/src/net/sourceforge/align/filter/meta/.svn/text-base/CompositeFilter.java.svn-base b/src/net/sourceforge/align/filter/meta/.svn/text-base/CompositeFilter.java.svn-base new file mode 100644 index 0000000..6a624cb --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/text-base/CompositeFilter.java.svn-base @@ -0,0 +1,43 @@ +package net.sourceforge.align.filter.meta; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents a pipeline consisting of many filters but behaving as single + * filter. + * Transforms the input by executing all filters in sequence. + * Basically implements composite design pattern. + * + * @author Jarek Lipski (loomchild) + */ +public class CompositeFilter implements Filter { + + private List filterList; + + /** + * Creates composite filter. + * @param filterList filter list; filters will be applied in the same order + * as they appear on this list + */ + public CompositeFilter(List filterList) { + this.filterList = filterList; + } + + /** + * Applies the composite filter by executing all the configured filters + * is sequence, where output of previous filter is input of the next + * filter. + * @param alignmentList input alignment list + * @return transformed alignment list + */ + public List apply(List alignmentList) { + for (Filter filter : filterList) { + alignmentList = filter.apply(alignmentList); + } + return alignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/meta/.svn/text-base/CompositeFilterTest.java.svn-base b/src/net/sourceforge/align/filter/meta/.svn/text-base/CompositeFilterTest.java.svn-base new file mode 100644 index 0000000..c2e5b44 --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/text-base/CompositeFilterTest.java.svn-base @@ -0,0 +1,71 @@ +package net.sourceforge.align.filter.meta; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithmMock; +import net.sourceforge.align.filter.modifier.Modifier; +import net.sourceforge.align.filter.modifier.modify.merge.MergeAlgorithm; +import net.sourceforge.align.filter.modifier.modify.merge.SeparatorMergeAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithmMock; + +import org.junit.Test; + +/** + * Represents {@link CompositeFilter} unit test. + * @author loomchild + */ +public class CompositeFilterTest { + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"abcdef"} + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"12345"} + }; + + public static final String[][] EXPECTED_SOURCE_SEGMENT_ARRAY = { + new String[] {"ab"}, + new String[] {"cd"}, + new String[] {"ef"}, + }; + + public static final String[][] EXPECTED_TARGET_SEGMENT_ARRAY = { + new String[] {"12"}, + new String[] {"34"}, + new String[] {"5"}, + }; + + /** + * Creates a composite filter consisting of + * {@link SplitAlgorithmMock} filter, {@link AlignAlgorithmMock} filter and + * {@link SeparatorMergeAlgorithm}, applies the filter and checks + * if the results are correct. + */ + @Test + public void testRunAllFilters() { + SplitAlgorithm splitAlgorithm = new SplitAlgorithmMock(1); + AlignAlgorithm alignAlgorithm = new AlignAlgorithmMock(2); + MergeAlgorithm mergeAlgorithm = new SeparatorMergeAlgorithm(); + List filterList = new ArrayList(); + filterList.add(new Modifier(splitAlgorithm, splitAlgorithm)); + filterList.add(new Aligner(alignAlgorithm)); + filterList.add(new Modifier(mergeAlgorithm, mergeAlgorithm)); + CompositeFilter composite = new CompositeFilter(filterList); + List alignmentList = createAlignmentList( + SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY); + List resultAlignmentList = composite.apply(alignmentList); + assertAlignmentListEquals(EXPECTED_SOURCE_SEGMENT_ARRAY, + EXPECTED_TARGET_SEGMENT_ARRAY, resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/filter/meta/.svn/text-base/FilterDecorators.java.svn-base b/src/net/sourceforge/align/filter/meta/.svn/text-base/FilterDecorators.java.svn-base new file mode 100644 index 0000000..4833a25 --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/text-base/FilterDecorators.java.svn-base @@ -0,0 +1,23 @@ +package net.sourceforge.align.filter.meta; + +import net.sourceforge.align.filter.Filter; + +/** + * Filter decorator helper methods. + * @author loomchild + */ +public class FilterDecorators { + + /** + * Decorate given filter with standard decorators. Currently uses only + * {@link IgnoreInfiniteProbabilityAlignmentsFilterDecorator}. + * + * @param filter + * @return decorated filter + */ + public static Filter decorate(Filter filter) { + filter = new IgnoreInfiniteProbabilityAlignmentsFilterDecorator(filter); + return filter; + } + +} diff --git a/src/net/sourceforge/align/filter/meta/.svn/text-base/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java.svn-base b/src/net/sourceforge/align/filter/meta/.svn/text-base/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java.svn-base new file mode 100644 index 0000000..2bab538 --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/text-base/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java.svn-base @@ -0,0 +1,57 @@ +package net.sourceforge.align.filter.meta; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents a filter decorator ignoring all alignments with score + * equal to {@link Float#NEGATIVE_INFINITY}. Can be used to force + * certain alignments / segmentations because they were checked by human. + * + * Note: + * Decorators are classes that enhance or change behavior of underlying class. + * + * @author loomchild + */ +public class IgnoreInfiniteProbabilityAlignmentsFilterDecorator implements Filter { + + private Filter filter; + + /** + * Creates decorator. + * @param filter filter to be decorated + */ + public IgnoreInfiniteProbabilityAlignmentsFilterDecorator(Filter filter) { + this.filter = filter; + } + + /** + * Iterates over a list of alignments and if the alignment has + * score equal to {@link Float#NEGATIVE_INFINITY} then it + * is copied to resulting list. Otherwise alignment is stored + * in a helper list to which underlying filter will be applied + * when the next ignored alignment is encountered. + */ + public List apply(List alignmentList) { + List resultList = new ArrayList(); + + List currentList = new ArrayList(); + + for (Alignment alignment : alignmentList) { + if (alignment.getScore() == Float.NEGATIVE_INFINITY) { + resultList.addAll(filter.apply(currentList)); + currentList.clear(); + resultList.add(alignment); + } else { + currentList.add(alignment); + } + } + resultList.addAll(filter.apply(currentList)); + + return resultList; + } + +} diff --git a/src/net/sourceforge/align/filter/meta/.svn/text-base/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java.svn-base b/src/net/sourceforge/align/filter/meta/.svn/text-base/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java.svn-base new file mode 100644 index 0000000..93fa45b --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/text-base/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java.svn-base @@ -0,0 +1,71 @@ +package net.sourceforge.align.filter.meta; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.onetoone.OneToOneAlgorithm; + +import org.junit.Test; + +/** + * Represents {@link IgnoreInfiniteProbabilityAlignmentsFilterDecorator} + * unit test. + * @author loomchild + */ +public class IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest { + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"A", "B"}, + new String[] {"X", "Y"}, + new String[] {"C", "D"}, + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"1", "2"}, + new String[] {"9", "8"}, + new String[] {"3", "4"}, + }; + + public static final String[][] EXPECTED_SOURCE_SEGMENT_ARRAY = { + new String[] {"A"}, + new String[] {"B"}, + new String[] {"X", "Y"}, + new String[] {"C"}, + new String[] {"D"}, + }; + + public static final String[][] EXPECTED_TARGET_SEGMENT_ARRAY = { + new String[] {"1"}, + new String[] {"2"}, + new String[] {"9", "8"}, + new String[] {"3"}, + new String[] {"4"}, + }; + + /** + * Tests whether alignments with infinite score are ignored and + * the ones without are not by using {@link OneToOneAlgorithm} aligner. + */ + @Test + public void testIgnoreInfiniteProbability() { + Filter oneToOneAligner = new Aligner(new OneToOneAlgorithm()); + Filter filter = + new IgnoreInfiniteProbabilityAlignmentsFilterDecorator(oneToOneAligner); + + List alignmentList = createAlignmentList( + SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY); + + // Mark middle alignment as fixed. + alignmentList.get(1).setScore(Float.NEGATIVE_INFINITY); + + List resultAlignmentList = filter.apply(alignmentList); + assertAlignmentListEquals(EXPECTED_SOURCE_SEGMENT_ARRAY, + EXPECTED_TARGET_SEGMENT_ARRAY, resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/filter/meta/.svn/text-base/MetaTestSuite.java.svn-base b/src/net/sourceforge/align/filter/meta/.svn/text-base/MetaTestSuite.java.svn-base new file mode 100644 index 0000000..c4afede --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/.svn/text-base/MetaTestSuite.java.svn-base @@ -0,0 +1,17 @@ +package net.sourceforge.align.filter.meta; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents test suite covering all unit tests in filter.meta package and its + * subpackages. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + CompositeFilterTest.class, + IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.class +}) +public class MetaTestSuite { +} diff --git a/src/net/sourceforge/align/filter/meta/CompositeFilter.java b/src/net/sourceforge/align/filter/meta/CompositeFilter.java new file mode 100755 index 0000000..6a624cb --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/CompositeFilter.java @@ -0,0 +1,43 @@ +package net.sourceforge.align.filter.meta; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents a pipeline consisting of many filters but behaving as single + * filter. + * Transforms the input by executing all filters in sequence. + * Basically implements composite design pattern. + * + * @author Jarek Lipski (loomchild) + */ +public class CompositeFilter implements Filter { + + private List filterList; + + /** + * Creates composite filter. + * @param filterList filter list; filters will be applied in the same order + * as they appear on this list + */ + public CompositeFilter(List filterList) { + this.filterList = filterList; + } + + /** + * Applies the composite filter by executing all the configured filters + * is sequence, where output of previous filter is input of the next + * filter. + * @param alignmentList input alignment list + * @return transformed alignment list + */ + public List apply(List alignmentList) { + for (Filter filter : filterList) { + alignmentList = filter.apply(alignmentList); + } + return alignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/meta/CompositeFilterTest.java b/src/net/sourceforge/align/filter/meta/CompositeFilterTest.java new file mode 100755 index 0000000..c2e5b44 --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/CompositeFilterTest.java @@ -0,0 +1,71 @@ +package net.sourceforge.align.filter.meta; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithmMock; +import net.sourceforge.align.filter.modifier.Modifier; +import net.sourceforge.align.filter.modifier.modify.merge.MergeAlgorithm; +import net.sourceforge.align.filter.modifier.modify.merge.SeparatorMergeAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithmMock; + +import org.junit.Test; + +/** + * Represents {@link CompositeFilter} unit test. + * @author loomchild + */ +public class CompositeFilterTest { + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"abcdef"} + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"12345"} + }; + + public static final String[][] EXPECTED_SOURCE_SEGMENT_ARRAY = { + new String[] {"ab"}, + new String[] {"cd"}, + new String[] {"ef"}, + }; + + public static final String[][] EXPECTED_TARGET_SEGMENT_ARRAY = { + new String[] {"12"}, + new String[] {"34"}, + new String[] {"5"}, + }; + + /** + * Creates a composite filter consisting of + * {@link SplitAlgorithmMock} filter, {@link AlignAlgorithmMock} filter and + * {@link SeparatorMergeAlgorithm}, applies the filter and checks + * if the results are correct. + */ + @Test + public void testRunAllFilters() { + SplitAlgorithm splitAlgorithm = new SplitAlgorithmMock(1); + AlignAlgorithm alignAlgorithm = new AlignAlgorithmMock(2); + MergeAlgorithm mergeAlgorithm = new SeparatorMergeAlgorithm(); + List filterList = new ArrayList(); + filterList.add(new Modifier(splitAlgorithm, splitAlgorithm)); + filterList.add(new Aligner(alignAlgorithm)); + filterList.add(new Modifier(mergeAlgorithm, mergeAlgorithm)); + CompositeFilter composite = new CompositeFilter(filterList); + List alignmentList = createAlignmentList( + SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY); + List resultAlignmentList = composite.apply(alignmentList); + assertAlignmentListEquals(EXPECTED_SOURCE_SEGMENT_ARRAY, + EXPECTED_TARGET_SEGMENT_ARRAY, resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/filter/meta/FilterDecorators.java b/src/net/sourceforge/align/filter/meta/FilterDecorators.java new file mode 100644 index 0000000..4833a25 --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/FilterDecorators.java @@ -0,0 +1,23 @@ +package net.sourceforge.align.filter.meta; + +import net.sourceforge.align.filter.Filter; + +/** + * Filter decorator helper methods. + * @author loomchild + */ +public class FilterDecorators { + + /** + * Decorate given filter with standard decorators. Currently uses only + * {@link IgnoreInfiniteProbabilityAlignmentsFilterDecorator}. + * + * @param filter + * @return decorated filter + */ + public static Filter decorate(Filter filter) { + filter = new IgnoreInfiniteProbabilityAlignmentsFilterDecorator(filter); + return filter; + } + +} diff --git a/src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java b/src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java new file mode 100644 index 0000000..2bab538 --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecorator.java @@ -0,0 +1,57 @@ +package net.sourceforge.align.filter.meta; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents a filter decorator ignoring all alignments with score + * equal to {@link Float#NEGATIVE_INFINITY}. Can be used to force + * certain alignments / segmentations because they were checked by human. + * + * Note: + * Decorators are classes that enhance or change behavior of underlying class. + * + * @author loomchild + */ +public class IgnoreInfiniteProbabilityAlignmentsFilterDecorator implements Filter { + + private Filter filter; + + /** + * Creates decorator. + * @param filter filter to be decorated + */ + public IgnoreInfiniteProbabilityAlignmentsFilterDecorator(Filter filter) { + this.filter = filter; + } + + /** + * Iterates over a list of alignments and if the alignment has + * score equal to {@link Float#NEGATIVE_INFINITY} then it + * is copied to resulting list. Otherwise alignment is stored + * in a helper list to which underlying filter will be applied + * when the next ignored alignment is encountered. + */ + public List apply(List alignmentList) { + List resultList = new ArrayList(); + + List currentList = new ArrayList(); + + for (Alignment alignment : alignmentList) { + if (alignment.getScore() == Float.NEGATIVE_INFINITY) { + resultList.addAll(filter.apply(currentList)); + currentList.clear(); + resultList.add(alignment); + } else { + currentList.add(alignment); + } + } + resultList.addAll(filter.apply(currentList)); + + return resultList; + } + +} diff --git a/src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java b/src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java new file mode 100644 index 0000000..93fa45b --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.java @@ -0,0 +1,71 @@ +package net.sourceforge.align.filter.meta; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.align.onetoone.OneToOneAlgorithm; + +import org.junit.Test; + +/** + * Represents {@link IgnoreInfiniteProbabilityAlignmentsFilterDecorator} + * unit test. + * @author loomchild + */ +public class IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest { + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"A", "B"}, + new String[] {"X", "Y"}, + new String[] {"C", "D"}, + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"1", "2"}, + new String[] {"9", "8"}, + new String[] {"3", "4"}, + }; + + public static final String[][] EXPECTED_SOURCE_SEGMENT_ARRAY = { + new String[] {"A"}, + new String[] {"B"}, + new String[] {"X", "Y"}, + new String[] {"C"}, + new String[] {"D"}, + }; + + public static final String[][] EXPECTED_TARGET_SEGMENT_ARRAY = { + new String[] {"1"}, + new String[] {"2"}, + new String[] {"9", "8"}, + new String[] {"3"}, + new String[] {"4"}, + }; + + /** + * Tests whether alignments with infinite score are ignored and + * the ones without are not by using {@link OneToOneAlgorithm} aligner. + */ + @Test + public void testIgnoreInfiniteProbability() { + Filter oneToOneAligner = new Aligner(new OneToOneAlgorithm()); + Filter filter = + new IgnoreInfiniteProbabilityAlignmentsFilterDecorator(oneToOneAligner); + + List alignmentList = createAlignmentList( + SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY); + + // Mark middle alignment as fixed. + alignmentList.get(1).setScore(Float.NEGATIVE_INFINITY); + + List resultAlignmentList = filter.apply(alignmentList); + assertAlignmentListEquals(EXPECTED_SOURCE_SEGMENT_ARRAY, + EXPECTED_TARGET_SEGMENT_ARRAY, resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/filter/meta/MetaTestSuite.java b/src/net/sourceforge/align/filter/meta/MetaTestSuite.java new file mode 100755 index 0000000..c4afede --- /dev/null +++ b/src/net/sourceforge/align/filter/meta/MetaTestSuite.java @@ -0,0 +1,17 @@ +package net.sourceforge.align.filter.meta; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents test suite covering all unit tests in filter.meta package and its + * subpackages. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + CompositeFilterTest.class, + IgnoreInfiniteProbabilityAlignmentsFilterDecoratorTest.class +}) +public class MetaTestSuite { +} diff --git a/src/net/sourceforge/align/filter/modifier/.svn/all-wcprops b/src/net/sourceforge/align/filter/modifier/.svn/all-wcprops new file mode 100644 index 0000000..c6428a7 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 82 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/modifier +END +ModifierTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 105 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/ModifierTestSuite.java +END +Modifier.java +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/Modifier.java +END diff --git a/src/net/sourceforge/align/filter/modifier/.svn/entries b/src/net/sourceforge/align/filter/modifier/.svn/entries new file mode 100644 index 0000000..a613729 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/.svn/entries @@ -0,0 +1,99 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/modifier +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Modifier.java +file + + + + +2010-10-28T16:40:14.000000Z +5002187641da101769574fb25ebe2d21 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2063 + +ModifierTestSuite.java +file + + + + +2010-10-22T07:55:56.000000Z +0030045511db075fb1ec762183dc588c +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +388 + +modify +dir + diff --git a/src/net/sourceforge/align/filter/modifier/.svn/text-base/Modifier.java.svn-base b/src/net/sourceforge/align/filter/modifier/.svn/text-base/Modifier.java.svn-base new file mode 100644 index 0000000..e966be4 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/.svn/text-base/Modifier.java.svn-base @@ -0,0 +1,59 @@ +package net.sourceforge.align.filter.modifier; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; + +/** + *

Represents a filter manipulating source or target segments in an + * alignment list.

+ *

The modification can be for example merging segments (merge package), + * splitting segments (split package) or changing segment contents + * (clean package).

+ *

Applies separate algorithms ({@link ModifyAlgorithm}) to source + * and target segments in each alignment on input list.

+ * @author loomchild + */ +public class Modifier implements Filter { + + private ModifyAlgorithm sourceAlgorithm; + + private ModifyAlgorithm targetAlgorithm; + + /** + * Creates modifies using two separate source and target segment + * modification algorithms. + * @param sourceAlgorithm source segment modification algorithm + * @param targetAlgorithm target segment modification algorithm + */ + public Modifier(ModifyAlgorithm sourceAlgorithm, + ModifyAlgorithm targetAlgorithm) { + this.sourceAlgorithm = sourceAlgorithm; + this.targetAlgorithm = targetAlgorithm; + } + + /** + * Iterates over input alignment list and applies source algorithm + * to source segments and target algorithm to target segments to each + * alignment. + * @param alignmentList input alignment list + * @return list containing alignments with modified segments + */ + public List apply(List alignmentList) { + List newAlignmentList = new ArrayList(); + for(Alignment alignment : alignmentList) { + List sourceSegmentList = + sourceAlgorithm.modify(alignment.getSourceSegmentList()); + List targetSegmentList = + targetAlgorithm.modify(alignment.getTargetSegmentList()); + Alignment newAlignment = new Alignment(sourceSegmentList, + targetSegmentList, alignment.getScore()); + newAlignmentList.add(newAlignment); + } + return newAlignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/.svn/text-base/ModifierTestSuite.java.svn-base b/src/net/sourceforge/align/filter/modifier/.svn/text-base/ModifierTestSuite.java.svn-base new file mode 100644 index 0000000..2360d1c --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/.svn/text-base/ModifierTestSuite.java.svn-base @@ -0,0 +1,18 @@ +package net.sourceforge.align.filter.modifier; + +import net.sourceforge.align.filter.modifier.modify.ModifyTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Represents test suite for all classes in filter.modifier package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + ModifyTestSuite.class +}) +public class ModifierTestSuite { +} diff --git a/src/net/sourceforge/align/filter/modifier/Modifier.java b/src/net/sourceforge/align/filter/modifier/Modifier.java new file mode 100755 index 0000000..e966be4 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/Modifier.java @@ -0,0 +1,59 @@ +package net.sourceforge.align.filter.modifier; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; + +/** + *

Represents a filter manipulating source or target segments in an + * alignment list.

+ *

The modification can be for example merging segments (merge package), + * splitting segments (split package) or changing segment contents + * (clean package).

+ *

Applies separate algorithms ({@link ModifyAlgorithm}) to source + * and target segments in each alignment on input list.

+ * @author loomchild + */ +public class Modifier implements Filter { + + private ModifyAlgorithm sourceAlgorithm; + + private ModifyAlgorithm targetAlgorithm; + + /** + * Creates modifies using two separate source and target segment + * modification algorithms. + * @param sourceAlgorithm source segment modification algorithm + * @param targetAlgorithm target segment modification algorithm + */ + public Modifier(ModifyAlgorithm sourceAlgorithm, + ModifyAlgorithm targetAlgorithm) { + this.sourceAlgorithm = sourceAlgorithm; + this.targetAlgorithm = targetAlgorithm; + } + + /** + * Iterates over input alignment list and applies source algorithm + * to source segments and target algorithm to target segments to each + * alignment. + * @param alignmentList input alignment list + * @return list containing alignments with modified segments + */ + public List apply(List alignmentList) { + List newAlignmentList = new ArrayList(); + for(Alignment alignment : alignmentList) { + List sourceSegmentList = + sourceAlgorithm.modify(alignment.getSourceSegmentList()); + List targetSegmentList = + targetAlgorithm.modify(alignment.getTargetSegmentList()); + Alignment newAlignment = new Alignment(sourceSegmentList, + targetSegmentList, alignment.getScore()); + newAlignmentList.add(newAlignment); + } + return newAlignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/ModifierTestSuite.java b/src/net/sourceforge/align/filter/modifier/ModifierTestSuite.java new file mode 100755 index 0000000..2360d1c --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/ModifierTestSuite.java @@ -0,0 +1,18 @@ +package net.sourceforge.align.filter.modifier; + +import net.sourceforge.align.filter.modifier.modify.ModifyTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Represents test suite for all classes in filter.modifier package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + ModifyTestSuite.class +}) +public class ModifierTestSuite { +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/.svn/all-wcprops b/src/net/sourceforge/align/filter/modifier/modify/.svn/all-wcprops new file mode 100644 index 0000000..d02a3f2 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify +END +NullModifyAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 114 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/NullModifyAlgorithm.java +END +ModifyTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 110 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/ModifyTestSuite.java +END +ModifyAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 110 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/ModifyAlgorithm.java +END diff --git a/src/net/sourceforge/align/filter/modifier/modify/.svn/entries b/src/net/sourceforge/align/filter/modifier/modify/.svn/entries new file mode 100644 index 0000000..c913dd7 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/.svn/entries @@ -0,0 +1,139 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +ModifyAlgorithm.java +file + + + + +2010-10-22T08:00:34.000000Z +7bff7b7cfbaee1d49e9e509f6d13a6c4 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +706 + +ModifyTestSuite.java +file + + + + +2010-10-22T07:57:32.000000Z +8850c11f769685267ad30af5e8b1b58b +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +550 + +NullModifyAlgorithm.java +file + + + + +2010-11-11T10:11:03.000000Z +45e9491dd5334673dd8f76beca9df88d +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +564 + +clean +dir + +merge +dir + +split +dir + diff --git a/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/ModifyAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/ModifyAlgorithm.java.svn-base new file mode 100644 index 0000000..8368c69 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/ModifyAlgorithm.java.svn-base @@ -0,0 +1,24 @@ +package net.sourceforge.align.filter.modifier.modify; + +import java.util.List; + +import net.sourceforge.align.filter.modifier.Modifier; + +/** + * Represents modify algorithm used by {@link Modifier}. + * @author loomchild + */ +public interface ModifyAlgorithm { + + /** + * Returns segment list containing modified input segment list. + * Modification can include merging or splitting of elements (resulting + * list can have different size than input list). + * Does not know distinguish between source and target segments (does not + * know which ones are processed). + * @param segmentList source segment list + * @return modified segment list + */ + public List modify(List segmentList); + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/ModifyTestSuite.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/ModifyTestSuite.java.svn-base new file mode 100644 index 0000000..239655c --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/ModifyTestSuite.java.svn-base @@ -0,0 +1,20 @@ +package net.sourceforge.align.filter.modifier.modify; + +import net.sourceforge.align.filter.modifier.modify.merge.MergeTestSuite; +import net.sourceforge.align.filter.modifier.modify.split.SplitTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Represents test suite for classes in filter.modifier.moify package ( + * mostly implementations of {@link ModifyAlgorithm}. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MergeTestSuite.class, SplitTestSuite.class +}) +public class ModifyTestSuite { +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/NullModifyAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/NullModifyAlgorithm.java.svn-base new file mode 100644 index 0000000..e35950c --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/.svn/text-base/NullModifyAlgorithm.java.svn-base @@ -0,0 +1,22 @@ +package net.sourceforge.align.filter.modifier.modify; + +import java.util.List; + +/** + * Represents modify algorithm that is not changing the input in any way. + * Useful when we want to perform operation just on source or target + * segments and leave the other as it is. + * Null design pattern. + * @author loomchild + */ +public class NullModifyAlgorithm implements ModifyAlgorithm { + + /** + * @param segmentList source segment list + * @return unmodified source segment list + */ + public List modify(List segmentList) { + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/ModifyAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/ModifyAlgorithm.java new file mode 100755 index 0000000..8368c69 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/ModifyAlgorithm.java @@ -0,0 +1,24 @@ +package net.sourceforge.align.filter.modifier.modify; + +import java.util.List; + +import net.sourceforge.align.filter.modifier.Modifier; + +/** + * Represents modify algorithm used by {@link Modifier}. + * @author loomchild + */ +public interface ModifyAlgorithm { + + /** + * Returns segment list containing modified input segment list. + * Modification can include merging or splitting of elements (resulting + * list can have different size than input list). + * Does not know distinguish between source and target segments (does not + * know which ones are processed). + * @param segmentList source segment list + * @return modified segment list + */ + public List modify(List segmentList); + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/ModifyTestSuite.java b/src/net/sourceforge/align/filter/modifier/modify/ModifyTestSuite.java new file mode 100755 index 0000000..239655c --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/ModifyTestSuite.java @@ -0,0 +1,20 @@ +package net.sourceforge.align.filter.modifier.modify; + +import net.sourceforge.align.filter.modifier.modify.merge.MergeTestSuite; +import net.sourceforge.align.filter.modifier.modify.split.SplitTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Represents test suite for classes in filter.modifier.moify package ( + * mostly implementations of {@link ModifyAlgorithm}. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MergeTestSuite.class, SplitTestSuite.class +}) +public class ModifyTestSuite { +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/NullModifyAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/NullModifyAlgorithm.java new file mode 100755 index 0000000..e35950c --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/NullModifyAlgorithm.java @@ -0,0 +1,22 @@ +package net.sourceforge.align.filter.modifier.modify; + +import java.util.List; + +/** + * Represents modify algorithm that is not changing the input in any way. + * Useful when we want to perform operation just on source or target + * segments and leave the other as it is. + * Null design pattern. + * @author loomchild + */ +public class NullModifyAlgorithm implements ModifyAlgorithm { + + /** + * @param segmentList source segment list + * @return unmodified source segment list + */ + public List modify(List segmentList) { + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/all-wcprops b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/all-wcprops new file mode 100644 index 0000000..e415406 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/all-wcprops @@ -0,0 +1,35 @@ +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/clean +END +FilterNonWordsCleanAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 129 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/clean/FilterNonWordsCleanAlgorithm.java +END +UnifyRareWordsCleanAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 129 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/clean/UnifyRareWordsCleanAlgorithm.java +END +TrimCleanAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 119 +/svnroot/align/!svn/ver/50/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/clean/TrimCleanAlgorithm.java +END +LowercaseCleanAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 124 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/clean/LowercaseCleanAlgorithm.java +END +CleanAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 115 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/clean/CleanAlgorithm.java +END diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/entries b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/entries new file mode 100644 index 0000000..1c6ae88 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/entries @@ -0,0 +1,198 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/clean +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:07:14.247557Z +50 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +CleanAlgorithm.java +file + + + + +2010-10-22T08:10:36.000000Z +ddf95b383b96cf4b56f6f83511ac3cef +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1290 + +FilterNonWordsCleanAlgorithm.java +file + + + + +2010-10-22T08:13:37.000000Z +cf067d36111e82e048a6e84082ab74ea +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +432 + +LowercaseCleanAlgorithm.java +file + + + + +2010-10-22T08:12:26.000000Z +96beaed8fb5f63ceccd8830c6b7275fe +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +334 + +TrimCleanAlgorithm.java +file + + + + +2010-11-13T21:22:15.000000Z +a9e7a2f4b4efc982938454165ef21dce +2010-12-02T11:07:14.247557Z +50 +jarekl + + + + + + + + + + + + + + + + + + + + + +479 + +UnifyRareWordsCleanAlgorithm.java +file +53 + + + +2010-12-29T17:10:36.000000Z +562de364ae2c32d4599145b146b8f0d8 +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +2306 + diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/CleanAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/CleanAlgorithm.java.svn-base new file mode 100644 index 0000000..b61af3b --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/CleanAlgorithm.java.svn-base @@ -0,0 +1,43 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; + + +/** + * Represents modify algorithm that cleans input segment list from useless + * segments or characters inside segments. + * @author loomchild + */ +public abstract class CleanAlgorithm implements ModifyAlgorithm { + + /** + * Modifies each individual segment by calling {@link #clean(String)} + * method (implemented by this class subclasses) for it. Stores the + * results in output list, ignoring a segment when {@link #clean(String)} + * returns null. + * @param segmentList source segment list + * @return cleaned segment list + */ + public List modify(List segmentList) { + List newSegmentList = new ArrayList(); + for (String segment : segmentList) { + String newSegment = clean(segment); + if (newSegment != null) { + newSegmentList.add(newSegment); + } + } + return newSegmentList; + } + + /** + * Modifies single individual segment. If returns null the segment is + * removed from resulting list. + * @param segment Sinput segment + * @return modified segment or null if it should be removed from the result + */ + public abstract String clean(String segment); + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/FilterNonWordsCleanAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/FilterNonWordsCleanAlgorithm.java.svn-base new file mode 100644 index 0000000..b2055c0 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/FilterNonWordsCleanAlgorithm.java.svn-base @@ -0,0 +1,20 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + + +/** + * Represents clean algorithm removing all segments that do not contain any + * letters. + * @author loomchild + */ +public class FilterNonWordsCleanAlgorithm extends CleanAlgorithm { + + public String clean(String segment) { + for (int i = 0; i < segment.length(); ++i) { + if (Character.isLetter(segment.charAt(i))) { + return segment; + } + } + return null; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/LowercaseCleanAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/LowercaseCleanAlgorithm.java.svn-base new file mode 100644 index 0000000..ed200c2 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/LowercaseCleanAlgorithm.java.svn-base @@ -0,0 +1,15 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + + +/** + * Represents clean algorithm changing input segment to lower case. + * @author loomchild + */ +public class LowercaseCleanAlgorithm extends CleanAlgorithm { + + public String clean(String segment) { + String newSegment = segment.toLowerCase(); + return newSegment; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/TrimCleanAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/TrimCleanAlgorithm.java.svn-base new file mode 100644 index 0000000..d6b2674 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/TrimCleanAlgorithm.java.svn-base @@ -0,0 +1,21 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + + +/** + * Represents clean algorithm trimming all the segments (removing leading and + * trailing whitespace). + * It also omits segments that are empty after trimming. + * + * @author loomchild + */ +public class TrimCleanAlgorithm extends CleanAlgorithm { + + public String clean(String segment) { + String newSegment = segment.trim(); + if (newSegment.length() == 0) { + newSegment = null; + } + return newSegment; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/UnifyRareWordsCleanAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/UnifyRareWordsCleanAlgorithm.java.svn-base new file mode 100644 index 0000000..db8eecd --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/.svn/text-base/UnifyRareWordsCleanAlgorithm.java.svn-base @@ -0,0 +1,75 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; + +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.model.vocabulary.Vocabulary; + + +/** + *

Represents clean algorithm changing all words in segments that are not + * present in given vocabulary to given string (in other words replacing + * all unknown words with predefined string).

+ * + *

To split segments into words uses given splitting algorithm or default, + * simple one.

+ * + * @author loomchild + */ +public class UnifyRareWordsCleanAlgorithm extends CleanAlgorithm { + + public static final String DEFAULT_OTHER_WORD = "{OTHER}"; + + private Vocabulary vocabulary; + + private SplitAlgorithm splitAlgorithm; + + private String otherWord; + + /** + * Creates algorithm. + * @param vocabulary vocabulary containing known words + * @param splitAlgorithm algorithm used to split segment into words + * @param otherWord string that will be used to replace unknown words + */ + public UnifyRareWordsCleanAlgorithm(Vocabulary vocabulary, + SplitAlgorithm splitAlgorithm, String otherWord) { + this.vocabulary = vocabulary; + this.splitAlgorithm = splitAlgorithm; + this.otherWord = otherWord; + } + + /** + * Creates algorithm with default tokenize algorithm + * ({@link net.sourceforge.align.model.vocabulary.VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}) + * and default unknown word replacement ({@link #DEFAULT_OTHER_WORD}). + * @param vocabulary known words vocabulary + */ + public UnifyRareWordsCleanAlgorithm(Vocabulary vocabulary) { + this(vocabulary, DEFAULT_TOKENIZE_ALGORITHM, DEFAULT_OTHER_WORD); + } + + /** + * Cleans a segment. Result contains all words separated by a single space. + * @param segment + * @return cleaned segment + */ + public String clean(String segment) { + List wordList = splitAlgorithm.split(segment); + StringBuilder resultSegment = new StringBuilder(); + for (String word : wordList) { + if (resultSegment.length() > 0) { + resultSegment.append(" "); + } + if (vocabulary.containsWord(word)) { + resultSegment.append(word); + } else { + resultSegment.append(otherWord); + } + } + return resultSegment.toString(); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/CleanAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/clean/CleanAlgorithm.java new file mode 100755 index 0000000..b61af3b --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/CleanAlgorithm.java @@ -0,0 +1,43 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; + + +/** + * Represents modify algorithm that cleans input segment list from useless + * segments or characters inside segments. + * @author loomchild + */ +public abstract class CleanAlgorithm implements ModifyAlgorithm { + + /** + * Modifies each individual segment by calling {@link #clean(String)} + * method (implemented by this class subclasses) for it. Stores the + * results in output list, ignoring a segment when {@link #clean(String)} + * returns null. + * @param segmentList source segment list + * @return cleaned segment list + */ + public List modify(List segmentList) { + List newSegmentList = new ArrayList(); + for (String segment : segmentList) { + String newSegment = clean(segment); + if (newSegment != null) { + newSegmentList.add(newSegment); + } + } + return newSegmentList; + } + + /** + * Modifies single individual segment. If returns null the segment is + * removed from resulting list. + * @param segment Sinput segment + * @return modified segment or null if it should be removed from the result + */ + public abstract String clean(String segment); + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/FilterNonWordsCleanAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/clean/FilterNonWordsCleanAlgorithm.java new file mode 100755 index 0000000..b2055c0 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/FilterNonWordsCleanAlgorithm.java @@ -0,0 +1,20 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + + +/** + * Represents clean algorithm removing all segments that do not contain any + * letters. + * @author loomchild + */ +public class FilterNonWordsCleanAlgorithm extends CleanAlgorithm { + + public String clean(String segment) { + for (int i = 0; i < segment.length(); ++i) { + if (Character.isLetter(segment.charAt(i))) { + return segment; + } + } + return null; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/LowercaseCleanAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/clean/LowercaseCleanAlgorithm.java new file mode 100755 index 0000000..ed200c2 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/LowercaseCleanAlgorithm.java @@ -0,0 +1,15 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + + +/** + * Represents clean algorithm changing input segment to lower case. + * @author loomchild + */ +public class LowercaseCleanAlgorithm extends CleanAlgorithm { + + public String clean(String segment) { + String newSegment = segment.toLowerCase(); + return newSegment; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/TrimCleanAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/clean/TrimCleanAlgorithm.java new file mode 100755 index 0000000..d6b2674 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/TrimCleanAlgorithm.java @@ -0,0 +1,21 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + + +/** + * Represents clean algorithm trimming all the segments (removing leading and + * trailing whitespace). + * It also omits segments that are empty after trimming. + * + * @author loomchild + */ +public class TrimCleanAlgorithm extends CleanAlgorithm { + + public String clean(String segment) { + String newSegment = segment.trim(); + if (newSegment.length() == 0) { + newSegment = null; + } + return newSegment; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/clean/UnifyRareWordsCleanAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/clean/UnifyRareWordsCleanAlgorithm.java new file mode 100755 index 0000000..db8eecd --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/clean/UnifyRareWordsCleanAlgorithm.java @@ -0,0 +1,75 @@ +package net.sourceforge.align.filter.modifier.modify.clean; + +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; + +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.model.vocabulary.Vocabulary; + + +/** + *

Represents clean algorithm changing all words in segments that are not + * present in given vocabulary to given string (in other words replacing + * all unknown words with predefined string).

+ * + *

To split segments into words uses given splitting algorithm or default, + * simple one.

+ * + * @author loomchild + */ +public class UnifyRareWordsCleanAlgorithm extends CleanAlgorithm { + + public static final String DEFAULT_OTHER_WORD = "{OTHER}"; + + private Vocabulary vocabulary; + + private SplitAlgorithm splitAlgorithm; + + private String otherWord; + + /** + * Creates algorithm. + * @param vocabulary vocabulary containing known words + * @param splitAlgorithm algorithm used to split segment into words + * @param otherWord string that will be used to replace unknown words + */ + public UnifyRareWordsCleanAlgorithm(Vocabulary vocabulary, + SplitAlgorithm splitAlgorithm, String otherWord) { + this.vocabulary = vocabulary; + this.splitAlgorithm = splitAlgorithm; + this.otherWord = otherWord; + } + + /** + * Creates algorithm with default tokenize algorithm + * ({@link net.sourceforge.align.model.vocabulary.VocabularyUtil#DEFAULT_TOKENIZE_ALGORITHM}) + * and default unknown word replacement ({@link #DEFAULT_OTHER_WORD}). + * @param vocabulary known words vocabulary + */ + public UnifyRareWordsCleanAlgorithm(Vocabulary vocabulary) { + this(vocabulary, DEFAULT_TOKENIZE_ALGORITHM, DEFAULT_OTHER_WORD); + } + + /** + * Cleans a segment. Result contains all words separated by a single space. + * @param segment + * @return cleaned segment + */ + public String clean(String segment) { + List wordList = splitAlgorithm.split(segment); + StringBuilder resultSegment = new StringBuilder(); + for (String word : wordList) { + if (resultSegment.length() > 0) { + resultSegment.append(" "); + } + if (vocabulary.containsWord(word)) { + resultSegment.append(word); + } else { + resultSegment.append(otherWord); + } + } + return resultSegment.toString(); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/all-wcprops b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/all-wcprops new file mode 100644 index 0000000..f65da14 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/merge +END +MergeTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 115 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/merge/MergeTestSuite.java +END +SeparatorMergeAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 128 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithmTest.java +END +SeparatorMergeAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 124 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithm.java +END +MergeAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 115 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/merge/MergeAlgorithm.java +END diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/entries b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/entries new file mode 100644 index 0000000..f667272 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/entries @@ -0,0 +1,164 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/merge +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-02T23:37:42.328942Z +42 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +MergeAlgorithm.java +file + + + + +2010-10-22T16:10:28.000000Z +7250c082b4ae3f45c60f85c660d783b3 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +885 + +MergeTestSuite.java +file + + + + +2010-10-22T16:05:51.000000Z +591cb5f59329f0554bb3d66a3f5e5a27 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +320 + +SeparatorMergeAlgorithm.java +file + + + + +2010-10-22T16:14:29.000000Z +8366d8b23ecd906e0c2542f91f50ef53 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1299 + +SeparatorMergeAlgorithmTest.java +file + + + + +2010-10-22T16:11:15.000000Z +f34620aafa52cc0c1c138e9fad245cea +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1593 + diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/MergeAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/MergeAlgorithm.java.svn-base new file mode 100644 index 0000000..0281e4b --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/MergeAlgorithm.java.svn-base @@ -0,0 +1,31 @@ +package net.sourceforge.align.filter.modifier.modify.merge; + +import static java.util.Collections.singletonList; + +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; + + +/** + * Represents algorithm merging a few segments into one. + * This operation can add extra characters between segments or modify segment + * contents - the important characteristic of it is that it always takes + * segment list but returns just one segment. + * + * @author Jarek Lipski (loomchild) + */ +public abstract class MergeAlgorithm implements ModifyAlgorithm { + + public List modify(List segmentList) { + return singletonList(merge(segmentList)); + } + + /** + * Merges segments from input list into one output segment. + * @param segmentList source segment list + * @return output segment + */ + public abstract String merge(List segmentList); + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/MergeTestSuite.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/MergeTestSuite.java.svn-base new file mode 100644 index 0000000..d51e050 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/MergeTestSuite.java.svn-base @@ -0,0 +1,16 @@ +package net.sourceforge.align.filter.modifier.modify.merge; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Test suite for modifier.modify.merge package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + SeparatorMergeAlgorithmTest.class +}) +public class MergeTestSuite { +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/SeparatorMergeAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/SeparatorMergeAlgorithm.java.svn-base new file mode 100644 index 0000000..3441fb8 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/SeparatorMergeAlgorithm.java.svn-base @@ -0,0 +1,55 @@ +package net.sourceforge.align.filter.modifier.modify.merge; + +import java.util.Iterator; +import java.util.List; + +/** + * Represents and algorithm merging a list of segments into one segment by + * concatenating them. It can insert given separator string between segments. + * + * @author Jarek Lipski (loomchild) + */ +public class SeparatorMergeAlgorithm extends MergeAlgorithm { + + /** + * Default segment separator. + */ + public static final String DEFAULT_SEPARATOR = ""; + + private String separator; + + /** + * Creates merge algorithm. + * @param separator separator + */ + public SeparatorMergeAlgorithm(String separator) { + this.separator = separator; + } + + /** + * Creates merge algoruthm with {@link #DEFAULT_SEPARATOR}. + */ + public SeparatorMergeAlgorithm() { + this(DEFAULT_SEPARATOR); + } + + /** + * Merges list of segments into one segment by concatenating them and + * inserting separator between. + * @param segmentList input segment list + * @return merged segment + */ + public String merge(List segmentList) { + StringBuilder builder = new StringBuilder(); + Iterator i = segmentList.iterator(); + while (i.hasNext()) { + String segment = i.next(); + builder.append(segment); + if (i.hasNext()) { + builder.append(separator); + } + } + return builder.toString(); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/SeparatorMergeAlgorithmTest.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/SeparatorMergeAlgorithmTest.java.svn-base new file mode 100644 index 0000000..508139d --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/.svn/text-base/SeparatorMergeAlgorithmTest.java.svn-base @@ -0,0 +1,70 @@ +package net.sourceforge.align.filter.modifier.modify.merge; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + + +/** + * Represents {@link SeparatorMergeAlgorithm} unit test. + * @author loomchild + */ +public class SeparatorMergeAlgorithmTest { + + private MergeAlgorithm merger; + + @Before + public void setUp() { + merger = new SeparatorMergeAlgorithm(" "); + } + + /** + * Check if merging empty list returns empty segment. + */ + @Test + public void mergeEmpty() { + List list = Collections.emptyList(); + String segment = merger.merge(list); + assertEquals("", segment); + } + + /** + * Checks if merging a list containing just one segment + * returns the same segment. + */ + @Test + public void mergeSingleton() { + List list = Collections.singletonList("ala"); + String segment = merger.merge(list); + assertEquals("ala", segment); + } + + /** + * Test merging with separator. + */ + @Test + public void merge() { + List list = Arrays.asList(new String[] {"ala", "ma", " kota"}); + String segment = merger.merge(list); + assertEquals("ala ma kota", segment); + } + + /** + * Tests merging without a separator - if the result will be + * exactly the same as string contatenation. + */ + @Test + public void mergeNoSeparator() { + MergeAlgorithm emptyMerger = new SeparatorMergeAlgorithm(""); + List list = Arrays.asList(new String[] {"ala", "ma", " kota"}); + String segment = emptyMerger.merge(list); + assertEquals("alama kota", segment); + } + + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/MergeAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/merge/MergeAlgorithm.java new file mode 100755 index 0000000..0281e4b --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/MergeAlgorithm.java @@ -0,0 +1,31 @@ +package net.sourceforge.align.filter.modifier.modify.merge; + +import static java.util.Collections.singletonList; + +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; + + +/** + * Represents algorithm merging a few segments into one. + * This operation can add extra characters between segments or modify segment + * contents - the important characteristic of it is that it always takes + * segment list but returns just one segment. + * + * @author Jarek Lipski (loomchild) + */ +public abstract class MergeAlgorithm implements ModifyAlgorithm { + + public List modify(List segmentList) { + return singletonList(merge(segmentList)); + } + + /** + * Merges segments from input list into one output segment. + * @param segmentList source segment list + * @return output segment + */ + public abstract String merge(List segmentList); + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/MergeTestSuite.java b/src/net/sourceforge/align/filter/modifier/modify/merge/MergeTestSuite.java new file mode 100755 index 0000000..d51e050 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/MergeTestSuite.java @@ -0,0 +1,16 @@ +package net.sourceforge.align.filter.modifier.modify.merge; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Test suite for modifier.modify.merge package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + SeparatorMergeAlgorithmTest.class +}) +public class MergeTestSuite { +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithm.java new file mode 100755 index 0000000..3441fb8 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithm.java @@ -0,0 +1,55 @@ +package net.sourceforge.align.filter.modifier.modify.merge; + +import java.util.Iterator; +import java.util.List; + +/** + * Represents and algorithm merging a list of segments into one segment by + * concatenating them. It can insert given separator string between segments. + * + * @author Jarek Lipski (loomchild) + */ +public class SeparatorMergeAlgorithm extends MergeAlgorithm { + + /** + * Default segment separator. + */ + public static final String DEFAULT_SEPARATOR = ""; + + private String separator; + + /** + * Creates merge algorithm. + * @param separator separator + */ + public SeparatorMergeAlgorithm(String separator) { + this.separator = separator; + } + + /** + * Creates merge algoruthm with {@link #DEFAULT_SEPARATOR}. + */ + public SeparatorMergeAlgorithm() { + this(DEFAULT_SEPARATOR); + } + + /** + * Merges list of segments into one segment by concatenating them and + * inserting separator between. + * @param segmentList input segment list + * @return merged segment + */ + public String merge(List segmentList) { + StringBuilder builder = new StringBuilder(); + Iterator i = segmentList.iterator(); + while (i.hasNext()) { + String segment = i.next(); + builder.append(segment); + if (i.hasNext()) { + builder.append(separator); + } + } + return builder.toString(); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithmTest.java b/src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithmTest.java new file mode 100755 index 0000000..508139d --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/merge/SeparatorMergeAlgorithmTest.java @@ -0,0 +1,70 @@ +package net.sourceforge.align.filter.modifier.modify.merge; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + + +/** + * Represents {@link SeparatorMergeAlgorithm} unit test. + * @author loomchild + */ +public class SeparatorMergeAlgorithmTest { + + private MergeAlgorithm merger; + + @Before + public void setUp() { + merger = new SeparatorMergeAlgorithm(" "); + } + + /** + * Check if merging empty list returns empty segment. + */ + @Test + public void mergeEmpty() { + List list = Collections.emptyList(); + String segment = merger.merge(list); + assertEquals("", segment); + } + + /** + * Checks if merging a list containing just one segment + * returns the same segment. + */ + @Test + public void mergeSingleton() { + List list = Collections.singletonList("ala"); + String segment = merger.merge(list); + assertEquals("ala", segment); + } + + /** + * Test merging with separator. + */ + @Test + public void merge() { + List list = Arrays.asList(new String[] {"ala", "ma", " kota"}); + String segment = merger.merge(list); + assertEquals("ala ma kota", segment); + } + + /** + * Tests merging without a separator - if the result will be + * exactly the same as string contatenation. + */ + @Test + public void mergeNoSeparator() { + MergeAlgorithm emptyMerger = new SeparatorMergeAlgorithm(""); + List list = Arrays.asList(new String[] {"ala", "ma", " kota"}); + String segment = emptyMerger.merge(list); + assertEquals("alama kota", segment); + } + + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/all-wcprops b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/all-wcprops new file mode 100644 index 0000000..b674371 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/all-wcprops @@ -0,0 +1,77 @@ +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split +END +SplitAlgorithmMock.java +K 25 +svn:wc:ra_dav:version-url +V 119 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMock.java +END +WordSplitAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 119 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithm.java +END +SrxSplitAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 118 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/SrxSplitAlgorithm.java +END +SplitTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 115 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/SplitTestSuite.java +END +SentenceSplitAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 127 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithmTest.java +END +SimpleSplitter.java +K 25 +svn:wc:ra_dav:version-url +V 115 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/SimpleSplitter.java +END +SentenceSplitAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 123 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithm.java +END +SplitAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 115 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithm.java +END +ParagraphSplitAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 124 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/ParagraphSplitAlgorithm.java +END +FilterNonWordsSplitAlgorithmDecorator.java +K 25 +svn:wc:ra_dav:version-url +V 138 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/FilterNonWordsSplitAlgorithmDecorator.java +END +SplitAlgorithmMockTest.java +K 25 +svn:wc:ra_dav:version-url +V 123 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMockTest.java +END +WordSplitAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 123 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithmTest.java +END diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/entries b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/entries new file mode 100644 index 0000000..7a94b45 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/entries @@ -0,0 +1,436 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/modifier/modify/split +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +FilterNonWordsSplitAlgorithmDecorator.java +file + + + + +2010-10-25T17:41:57.000000Z +539438a306b28c13fc7a1b3040ed44b2 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1224 + +ParagraphSplitAlgorithm.java +file + + + + +2010-10-22T16:24:55.000000Z +4e8e2275c22dd32d3172c233003970a4 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +853 + +SentenceSplitAlgorithm.java +file + + + + +2010-10-25T17:19:28.000000Z +b60819061f9f867df0f0bffa69e93aea +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1473 + +SentenceSplitAlgorithmTest.java +file + + + + +2010-10-25T17:14:18.000000Z +ab19ea9595b6afdab11cf4075139ed18 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +928 + +SimpleSplitter.java +file + + + + +2010-10-25T17:40:50.000000Z +0f576ed4274a3cfea4508c70b0329dc9 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +4603 + +SplitAlgorithm.java +file + + + + +2010-10-25T17:18:47.000000Z +f09dbc34893e750e463a0e2d2d21cdf0 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1049 + +SplitAlgorithmMock.java +file + + + + +2010-10-22T16:22:12.000000Z +665ead4b65a3cd47df249385d89f9b06 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1222 + +SplitAlgorithmMockTest.java +file + + + + +2010-10-22T16:23:10.000000Z +001b5b6fdfe7eb791f9bc66661731457 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +937 + +SplitTestSuite.java +file + + + + +2010-10-22T16:19:36.000000Z +57e48163122220bd906e07c11947e5f3 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +413 + +SrxSplitAlgorithm.java +file + + + + +2010-11-11T09:55:02.000000Z +8c869411f98b6485e5a7a1a9a154b668 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1566 + +WordSplitAlgorithm.java +file + + + + +2010-10-25T17:13:34.000000Z +18aa3b45eb2c08a87caf34ad813269cc +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1122 + +WordSplitAlgorithmTest.java +file + + + + +2010-10-25T17:13:00.000000Z +87b9eab500cd97cff826e6ab241ddb77 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1431 + diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/FilterNonWordsSplitAlgorithmDecorator.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/FilterNonWordsSplitAlgorithmDecorator.java.svn-base new file mode 100644 index 0000000..ef610e7 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/FilterNonWordsSplitAlgorithmDecorator.java.svn-base @@ -0,0 +1,42 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a split algorithm that splits input segment using + * given algorithm but ignores all punctuation in the output segments. + * To be used together with {@link WordSplitAlgorithm}. + * Decorator design pattern. + * + * @author loomchild + * + */ +public class FilterNonWordsSplitAlgorithmDecorator extends SplitAlgorithm { + + private SplitAlgorithm splitAlgorithm; + + /** + * Creates splitter decorator. + * @param splitAlgorithm split algorithm to be used + */ + public FilterNonWordsSplitAlgorithmDecorator(SplitAlgorithm splitAlgorithm) { + this.splitAlgorithm = splitAlgorithm; + } + + @Override + public List split(String string) { + List segmentList = splitAlgorithm.split(string); + List resultSegmentList = new ArrayList(); + for (String segment : segmentList) { + // Checks whether segment consists only of letters and numbers. + // Assumes that if the first character is a letter or number + // then that's true. + if (Character.isLetterOrDigit(segment.charAt(0))) { + resultSegmentList.add(segment.toLowerCase()); + } + } + return resultSegmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/ParagraphSplitAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/ParagraphSplitAlgorithm.java.svn-base new file mode 100644 index 0000000..2a1a5de --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/ParagraphSplitAlgorithm.java.svn-base @@ -0,0 +1,32 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Represents simple split algorithm dividing input segment into paragraphs, + * ending with end-of-line character ('\n'). + * TODO: merge with WordSplitAlgorithm + * @author Jarek Lipski (loomchild) + */ +public class ParagraphSplitAlgorithm extends SplitAlgorithm { + + public List split(String string) { + List paragraphList = new ArrayList(); + int start = 0; + for (int end = 0; end < string.length(); ++end) { + if (string.charAt(end) == '\n') { + String paragraph = string.substring(start, end); + paragraphList.add(paragraph); + start = end + 1; + } + } + if (start < string.length()) { + String paragraph = string.substring(start); + paragraphList.add(paragraph); + } + return paragraphList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SentenceSplitAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SentenceSplitAlgorithm.java.svn-base new file mode 100644 index 0000000..899ad4a --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SentenceSplitAlgorithm.java.svn-base @@ -0,0 +1,52 @@ + package net.sourceforge.align.filter.modifier.modify.split; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.util.ImpossibleException; + + +/** + *

Represents simple sentence splitter using hardcoded rules.

+ * + *

Splitting does not omit any characters. Uses {@link SimpleSplitter}.

+ * + *

For more accurate sentence segmentation see {@link SrxSplitAlgorithm}.

+ * + * @author Jarek Lipski (loomchild) + */ +public class SentenceSplitAlgorithm extends SplitAlgorithm { + + /** + * Splits input segment to a list of sentences. Spltting occurrs + * after end-of-line character and after end of sentence character (.?!), + * if the next character is capital letter. + * + * @param string input segment + * @return list of sentences + */ + public List split(String string) { + Reader stringReader = new StringReader(string); + List segmentList = null; + try { + segmentList = split(stringReader); + } catch (IOException e) { + throw new ImpossibleException("IOException reading StringReader", e); + } + return segmentList; + } + + private List split(Reader reader) throws IOException { + List segmentList = new ArrayList(); + SimpleSplitter splitter = new SimpleSplitter(reader); + while(splitter.hasNext()) { + String segment = splitter.next(); + segmentList.add(segment); + } + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SentenceSplitAlgorithmTest.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SentenceSplitAlgorithmTest.java.svn-base new file mode 100644 index 0000000..c5fd475 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SentenceSplitAlgorithmTest.java.svn-base @@ -0,0 +1,43 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + + + +/** + * Represents {@link SentenceSplitAlgorithm} unit test. + * + * @author Jarek Lipski (loomchild) + */ +public class SentenceSplitAlgorithmTest { + + public static final String TEXT = + "Ala ma kota. Prof. Kot nie wie kim jest. Ech\nNic."; + + public static final String[] SEGMENT_ARRAY = + {"Ala ma kota.", " Prof.", " Kot nie wie kim jest.", " Ech\n", + "Nic."}; + + private SentenceSplitAlgorithm splitter; + + @Before + public void setUp() { + this.splitter = new SentenceSplitAlgorithm(); + } + + /** + * Tests simple split. + */ + @Test + public void stringSplit() { + List segmentList = splitter.split(TEXT); + String[] segmentArray = segmentList.toArray(new String[segmentList.size()]); + assertEquals(SEGMENT_ARRAY, segmentArray); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SimpleSplitter.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SimpleSplitter.java.svn-base new file mode 100644 index 0000000..3d075f9 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SimpleSplitter.java.svn-base @@ -0,0 +1,180 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.io.IOException; +import java.io.Reader; + +import net.sourceforge.align.util.IORuntimeException; +import net.sourceforge.align.util.ImpossibleException; + + +/** + * Represents simple sentence splitter. + * Split a text after end-of-line character and after end of sentence + * character (.?!) if the next characters are whitespace and a capital letter. + * Works on a character stream. + * + * @author loomchild + */ +public class SimpleSplitter { + + /** + * End of sentence characters. + */ + public static final char[] BREAK_CHARACTER_LIST = {'.', '!', '?'}; + + public enum State {READY, AFTER_BREAK, AFTER_SPACE, END}; + + /** + * Initializes splitter. + * @param reader input stream containing the text to be splitted + */ + public SimpleSplitter(Reader reader) { + this.reader = reader; + this.state = State.READY; + this.builder = new StringBuilder(); + this.segment = null; + } + + /** + * Iterates to the next segment. + * @return next segment or null if there are no more segments + */ + public String next() { + if (hasNext()) { + readSegment(true); + String newSegment = segment; + segment = null; + return newSegment; + } else { + return null; + } + } + + /** + * @return false if there are no more segments + */ + public boolean hasNext() { + return (state != State.END) || (segment != null); + } + + /** + * @return true if subsequent {@link #next()} call will not block the + * thread waiting for more characters from input stream + * @throws IORuntimeException when IO error reading stream occurs + */ + public boolean isReady() { + if (hasNext()) { + return (segment != null) || (readSegment(false)); + } else { + return false; + } + } + + /** + * Reads next segment. + * + * @param canBlock if this is true then this method cannot block the + * thread waiting for next character from a stream + * @return false if it cannot read more characters because it would + * block the stream + * @throws IORuntimeException when IO error reading input stream occurs + */ + private boolean readSegment(boolean canBlock) { + try { + if (segment != null) { + return true; + } + int leftCharacters = 0; + while (state != State.END) { + if (!(canBlock || reader.ready())) { + return false; + } + int readResult = reader.read(); + if (readResult == -1) { + state = State.END; + leftCharacters = 0; + } else { + char character = (char)readResult; + builder.append(character); + if (character == '\n') { + state = State.READY; + leftCharacters = 0; + break; + } else if (state == State.READY) { + if (isBreakCharacter(character)) { + state = State.AFTER_BREAK; + } + } else if (state == State.AFTER_BREAK) { + if (Character.isWhitespace(character)) { + ++leftCharacters; + state = State.AFTER_SPACE; + } else if (isBreakCharacter(character)) { + //Do nothing + } else { + state = State.READY; + leftCharacters = 0; + } + } else if (state == State.AFTER_SPACE) { + if (Character.isUpperCase(character)) { + state = State.READY; + ++leftCharacters; + break; + } else if (isBreakCharacter(character)) { + state = State.AFTER_BREAK; + ++leftCharacters; + break; + } else if (Character.isWhitespace(character)) { + ++leftCharacters; + } else { + state = State.READY; + leftCharacters = 0; + } + } else { + throw new ImpossibleException( + "Impossible SimpleSplitter state."); + } + } + } + segment = separateString(leftCharacters); + return true; + } catch (IOException e) { + throw new IORuntimeException(e); + } + } + + /** + * Retrieves a string from a buffer leaving given number of characters + * in the buffer (string length is equal to buffer length - leftCharacters). + * Removes the returned string from a buffer. + * @param leftCharacters how many characters to leave in the buffer + * @return retrieved segment + */ + private String separateString(int leftCharacters) { + String result = builder.substring(0, builder.length() - leftCharacters); + builder.delete(0, builder.length() - leftCharacters); + return result; + } + + /** + * @param character + * @return true if given character is end of sentence character + * (is present on {@link #BREAK_CHARACTER_LIST}). + */ + private boolean isBreakCharacter(char character) { + for (char ch : BREAK_CHARACTER_LIST) { + if (ch == character) { + return true; + } + } + return false; + } + + private Reader reader; + + private State state; + + private StringBuilder builder; + + private String segment; + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithm.java.svn-base new file mode 100644 index 0000000..42c2ff9 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithm.java.svn-base @@ -0,0 +1,38 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; + + +/** + * Represents modify algorithm splitting single segment into a list of segments. + * + * @author Jarek Lipski (loomchild) + */ +public abstract class SplitAlgorithm implements ModifyAlgorithm { + + /** + * Modifies a segment list by splitting each segment on the list and + * adding the resulting list to an output list. + * @param segmentList source segment list + * @return output segment list + */ + public List modify(List segmentList) { + List newSegmentList = new ArrayList(); + for (String segment : segmentList) { + List currentSegmentList = split(segment); + newSegmentList.addAll(currentSegmentList); + } + return newSegmentList; + } + + /** + * Splits a segment into a list of segments. + * @param string input segment + * @return resulting segment list + */ + public abstract List split(String string); + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithmMock.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithmMock.java.svn-base new file mode 100644 index 0000000..5b62434 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithmMock.java.svn-base @@ -0,0 +1,46 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Represents split algorithm mock. + * Responsible for splitting input segment int susbsegments of given lenght. + * Used for testing. + * + * @author Jarek Lipski (loomchild) + */ +public class SplitAlgorithmMock extends SplitAlgorithm { + + private int charsInSegment; + + /** + * Creates split algorithm splitting input segment into segments of given + * length. + * @param charsInSegment output segment length. + */ + public SplitAlgorithmMock(int charsInSegment) { + assert charsInSegment > 0; + this.charsInSegment = charsInSegment; + } + + /** + * Splits text into segments of given length (the last one can be shorter). + * @param string input segment + * @return output segment list + */ + public List split(String string) { + List segmentList = new ArrayList(); + int start = 0; + for(int end = start + charsInSegment; end < string.length(); + start += charsInSegment, end += charsInSegment) { + String segment = string.substring(start, end); + segmentList.add(segment); + } + String segment = string.substring(start); + segmentList.add(segment); + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithmMockTest.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithmMockTest.java.svn-base new file mode 100644 index 0000000..112f8e2 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitAlgorithmMockTest.java.svn-base @@ -0,0 +1,32 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.merge.MergeAlgorithm; +import net.sourceforge.align.filter.modifier.modify.merge.SeparatorMergeAlgorithm; + +import org.junit.Test; + + +/** + * Tests {@link SplitAlgorithmMock}. This is a little paranoid because mock is + * used for testing itself. + * @author loomchild + */ +public class SplitAlgorithmMockTest { + + @Test + public void split() { + String[] segments = new String[] {"aa", "bb", "c"}; + MergeAlgorithm merger = new SeparatorMergeAlgorithm(""); + String text = merger.merge(Arrays.asList(segments)); + SplitAlgorithm splitter = new SplitAlgorithmMock(2); + List splitted = splitter.split(text); + String[] splittedArray = splitted.toArray(new String[splitted.size()]); + assertEquals(segments, splittedArray); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitTestSuite.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitTestSuite.java.svn-base new file mode 100644 index 0000000..3599b35 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SplitTestSuite.java.svn-base @@ -0,0 +1,20 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + + +/** + * Represents {@link SplitAlgorithm} unit test suite. + * @author loomchild + * + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + SplitAlgorithmMockTest.class, SentenceSplitAlgorithmTest.class, + WordSplitAlgorithmTest.class + }) +public class SplitTestSuite { + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SrxSplitAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SrxSplitAlgorithm.java.svn-base new file mode 100644 index 0000000..88939bb --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/SrxSplitAlgorithm.java.svn-base @@ -0,0 +1,52 @@ +package net.sourceforge.align.filter.modifier.modify.split; + + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.segment.TextIterator; +import net.sourceforge.segment.srx.SrxDocument; +import net.sourceforge.segment.srx.SrxParser; +import net.sourceforge.segment.srx.SrxTextIterator; +import net.sourceforge.segment.srx.io.SrxAnyParser; + + +/** + * Represents a sentence splitter using rules defined in SRX format. + * Uses external segment library. + * + * @see Segment Project + * @see SRX Standard + * @author Jarek Lipski (loomchild) + */ +public class SrxSplitAlgorithm extends SplitAlgorithm { + + private SrxDocument document; + + private String languageCode; + + /** + * Creates a SRX splitter using given rules and selecting the ones to apply + * using given language code. + * @param reader reader containing SRX rules + * @param languageCode language code used to select the rules to apply + */ + public SrxSplitAlgorithm(Reader reader, String languageCode) { + SrxParser parser = new SrxAnyParser(); + this.document = parser.parse(reader); + this.languageCode = languageCode; + } + + public List split(String string) { + TextIterator textIterator = + new SrxTextIterator(document, languageCode, string); + List segmentList = new ArrayList(); + while(textIterator.hasNext()) { + String segment = textIterator.next(); + segmentList.add(segment); + } + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/WordSplitAlgorithm.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/WordSplitAlgorithm.java.svn-base new file mode 100644 index 0000000..bfad0d5 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/WordSplitAlgorithm.java.svn-base @@ -0,0 +1,42 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import static java.lang.Character.isLetterOrDigit; +import static java.lang.Character.isWhitespace; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents simple split algorithm separating input segment into words. + * Word boundaries are assumed to be everything that is not a character or + * digit. Whitespace characters are removed from the output. + * + * @author loomchild + */ +public class WordSplitAlgorithm extends SplitAlgorithm { + + public List split(String string) { + List wordList = new ArrayList(); + int start = 0; + for (int end = 0; end < string.length(); ++end) { + char ch = string.charAt(end); + if (!isLetterOrDigit(ch)) { + if ((end - start) > 0) { + String word = string.substring(start, end); + wordList.add(word); + } + if (!isWhitespace(ch)) { + String word = string.substring(end, end + 1); + wordList.add(word); + } + start = end + 1; + } + } + if (start < string.length()) { + String word = string.substring(start); + wordList.add(word); + } + return wordList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/WordSplitAlgorithmTest.java.svn-base b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/WordSplitAlgorithmTest.java.svn-base new file mode 100644 index 0000000..8afe2d1 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/.svn/text-base/WordSplitAlgorithmTest.java.svn-base @@ -0,0 +1,51 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Test; + + +/** + * Represents {@link WordSplitAlgorithm} unit test. + * @author loomchild + */ +public class WordSplitAlgorithmTest { + + public static final String SPACE = " ab\t 9\net "; + + public static final String[] EXPECTED_SPACE = + new String[] {"ab", "9", "et"}; + + /** + * Checks if splitting on whitespace works as expected and that whitespace + * characters are removed from the output. + */ + @Test + public void splitSpace() { + WordSplitAlgorithm splitter = new WordSplitAlgorithm(); + List wordList = splitter.split(SPACE); + String[] wordArray = wordList.toArray(new String[wordList.size()]); + assertEquals(EXPECTED_SPACE, wordArray); + } + + public static final String PUNCTUATION = + "1. Ja, niżej podpisan(I'm \"batman01\")."; + + public static final String[] EXPECTED_PUNCTUATION = new String[] { + "1", ".", "Ja", ",", "niżej", "podpisan", "(", "I", "'", "m", + "\"", "batman01", "\"", ")", "."}; + + /** + * Checks if splitting after punctuation characters works as expected. + */ + @Test + public void splitPunctuation() { + WordSplitAlgorithm splitter = new WordSplitAlgorithm(); + List wordList = splitter.split(PUNCTUATION); + String[] wordArray = wordList.toArray(new String[wordList.size()]); + assertEquals(EXPECTED_PUNCTUATION, wordArray); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/FilterNonWordsSplitAlgorithmDecorator.java b/src/net/sourceforge/align/filter/modifier/modify/split/FilterNonWordsSplitAlgorithmDecorator.java new file mode 100755 index 0000000..ef610e7 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/FilterNonWordsSplitAlgorithmDecorator.java @@ -0,0 +1,42 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a split algorithm that splits input segment using + * given algorithm but ignores all punctuation in the output segments. + * To be used together with {@link WordSplitAlgorithm}. + * Decorator design pattern. + * + * @author loomchild + * + */ +public class FilterNonWordsSplitAlgorithmDecorator extends SplitAlgorithm { + + private SplitAlgorithm splitAlgorithm; + + /** + * Creates splitter decorator. + * @param splitAlgorithm split algorithm to be used + */ + public FilterNonWordsSplitAlgorithmDecorator(SplitAlgorithm splitAlgorithm) { + this.splitAlgorithm = splitAlgorithm; + } + + @Override + public List split(String string) { + List segmentList = splitAlgorithm.split(string); + List resultSegmentList = new ArrayList(); + for (String segment : segmentList) { + // Checks whether segment consists only of letters and numbers. + // Assumes that if the first character is a letter or number + // then that's true. + if (Character.isLetterOrDigit(segment.charAt(0))) { + resultSegmentList.add(segment.toLowerCase()); + } + } + return resultSegmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/ParagraphSplitAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/split/ParagraphSplitAlgorithm.java new file mode 100755 index 0000000..2a1a5de --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/ParagraphSplitAlgorithm.java @@ -0,0 +1,32 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Represents simple split algorithm dividing input segment into paragraphs, + * ending with end-of-line character ('\n'). + * TODO: merge with WordSplitAlgorithm + * @author Jarek Lipski (loomchild) + */ +public class ParagraphSplitAlgorithm extends SplitAlgorithm { + + public List split(String string) { + List paragraphList = new ArrayList(); + int start = 0; + for (int end = 0; end < string.length(); ++end) { + if (string.charAt(end) == '\n') { + String paragraph = string.substring(start, end); + paragraphList.add(paragraph); + start = end + 1; + } + } + if (start < string.length()) { + String paragraph = string.substring(start); + paragraphList.add(paragraph); + } + return paragraphList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithm.java new file mode 100755 index 0000000..899ad4a --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithm.java @@ -0,0 +1,52 @@ + package net.sourceforge.align.filter.modifier.modify.split; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.util.ImpossibleException; + + +/** + *

Represents simple sentence splitter using hardcoded rules.

+ * + *

Splitting does not omit any characters. Uses {@link SimpleSplitter}.

+ * + *

For more accurate sentence segmentation see {@link SrxSplitAlgorithm}.

+ * + * @author Jarek Lipski (loomchild) + */ +public class SentenceSplitAlgorithm extends SplitAlgorithm { + + /** + * Splits input segment to a list of sentences. Spltting occurrs + * after end-of-line character and after end of sentence character (.?!), + * if the next character is capital letter. + * + * @param string input segment + * @return list of sentences + */ + public List split(String string) { + Reader stringReader = new StringReader(string); + List segmentList = null; + try { + segmentList = split(stringReader); + } catch (IOException e) { + throw new ImpossibleException("IOException reading StringReader", e); + } + return segmentList; + } + + private List split(Reader reader) throws IOException { + List segmentList = new ArrayList(); + SimpleSplitter splitter = new SimpleSplitter(reader); + while(splitter.hasNext()) { + String segment = splitter.next(); + segmentList.add(segment); + } + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithmTest.java b/src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithmTest.java new file mode 100755 index 0000000..c5fd475 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/SentenceSplitAlgorithmTest.java @@ -0,0 +1,43 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + + + +/** + * Represents {@link SentenceSplitAlgorithm} unit test. + * + * @author Jarek Lipski (loomchild) + */ +public class SentenceSplitAlgorithmTest { + + public static final String TEXT = + "Ala ma kota. Prof. Kot nie wie kim jest. Ech\nNic."; + + public static final String[] SEGMENT_ARRAY = + {"Ala ma kota.", " Prof.", " Kot nie wie kim jest.", " Ech\n", + "Nic."}; + + private SentenceSplitAlgorithm splitter; + + @Before + public void setUp() { + this.splitter = new SentenceSplitAlgorithm(); + } + + /** + * Tests simple split. + */ + @Test + public void stringSplit() { + List segmentList = splitter.split(TEXT); + String[] segmentArray = segmentList.toArray(new String[segmentList.size()]); + assertEquals(SEGMENT_ARRAY, segmentArray); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/SimpleSplitter.java b/src/net/sourceforge/align/filter/modifier/modify/split/SimpleSplitter.java new file mode 100755 index 0000000..3d075f9 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/SimpleSplitter.java @@ -0,0 +1,180 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.io.IOException; +import java.io.Reader; + +import net.sourceforge.align.util.IORuntimeException; +import net.sourceforge.align.util.ImpossibleException; + + +/** + * Represents simple sentence splitter. + * Split a text after end-of-line character and after end of sentence + * character (.?!) if the next characters are whitespace and a capital letter. + * Works on a character stream. + * + * @author loomchild + */ +public class SimpleSplitter { + + /** + * End of sentence characters. + */ + public static final char[] BREAK_CHARACTER_LIST = {'.', '!', '?'}; + + public enum State {READY, AFTER_BREAK, AFTER_SPACE, END}; + + /** + * Initializes splitter. + * @param reader input stream containing the text to be splitted + */ + public SimpleSplitter(Reader reader) { + this.reader = reader; + this.state = State.READY; + this.builder = new StringBuilder(); + this.segment = null; + } + + /** + * Iterates to the next segment. + * @return next segment or null if there are no more segments + */ + public String next() { + if (hasNext()) { + readSegment(true); + String newSegment = segment; + segment = null; + return newSegment; + } else { + return null; + } + } + + /** + * @return false if there are no more segments + */ + public boolean hasNext() { + return (state != State.END) || (segment != null); + } + + /** + * @return true if subsequent {@link #next()} call will not block the + * thread waiting for more characters from input stream + * @throws IORuntimeException when IO error reading stream occurs + */ + public boolean isReady() { + if (hasNext()) { + return (segment != null) || (readSegment(false)); + } else { + return false; + } + } + + /** + * Reads next segment. + * + * @param canBlock if this is true then this method cannot block the + * thread waiting for next character from a stream + * @return false if it cannot read more characters because it would + * block the stream + * @throws IORuntimeException when IO error reading input stream occurs + */ + private boolean readSegment(boolean canBlock) { + try { + if (segment != null) { + return true; + } + int leftCharacters = 0; + while (state != State.END) { + if (!(canBlock || reader.ready())) { + return false; + } + int readResult = reader.read(); + if (readResult == -1) { + state = State.END; + leftCharacters = 0; + } else { + char character = (char)readResult; + builder.append(character); + if (character == '\n') { + state = State.READY; + leftCharacters = 0; + break; + } else if (state == State.READY) { + if (isBreakCharacter(character)) { + state = State.AFTER_BREAK; + } + } else if (state == State.AFTER_BREAK) { + if (Character.isWhitespace(character)) { + ++leftCharacters; + state = State.AFTER_SPACE; + } else if (isBreakCharacter(character)) { + //Do nothing + } else { + state = State.READY; + leftCharacters = 0; + } + } else if (state == State.AFTER_SPACE) { + if (Character.isUpperCase(character)) { + state = State.READY; + ++leftCharacters; + break; + } else if (isBreakCharacter(character)) { + state = State.AFTER_BREAK; + ++leftCharacters; + break; + } else if (Character.isWhitespace(character)) { + ++leftCharacters; + } else { + state = State.READY; + leftCharacters = 0; + } + } else { + throw new ImpossibleException( + "Impossible SimpleSplitter state."); + } + } + } + segment = separateString(leftCharacters); + return true; + } catch (IOException e) { + throw new IORuntimeException(e); + } + } + + /** + * Retrieves a string from a buffer leaving given number of characters + * in the buffer (string length is equal to buffer length - leftCharacters). + * Removes the returned string from a buffer. + * @param leftCharacters how many characters to leave in the buffer + * @return retrieved segment + */ + private String separateString(int leftCharacters) { + String result = builder.substring(0, builder.length() - leftCharacters); + builder.delete(0, builder.length() - leftCharacters); + return result; + } + + /** + * @param character + * @return true if given character is end of sentence character + * (is present on {@link #BREAK_CHARACTER_LIST}). + */ + private boolean isBreakCharacter(char character) { + for (char ch : BREAK_CHARACTER_LIST) { + if (ch == character) { + return true; + } + } + return false; + } + + private Reader reader; + + private State state; + + private StringBuilder builder; + + private String segment; + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithm.java new file mode 100755 index 0000000..42c2ff9 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithm.java @@ -0,0 +1,38 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; + + +/** + * Represents modify algorithm splitting single segment into a list of segments. + * + * @author Jarek Lipski (loomchild) + */ +public abstract class SplitAlgorithm implements ModifyAlgorithm { + + /** + * Modifies a segment list by splitting each segment on the list and + * adding the resulting list to an output list. + * @param segmentList source segment list + * @return output segment list + */ + public List modify(List segmentList) { + List newSegmentList = new ArrayList(); + for (String segment : segmentList) { + List currentSegmentList = split(segment); + newSegmentList.addAll(currentSegmentList); + } + return newSegmentList; + } + + /** + * Splits a segment into a list of segments. + * @param string input segment + * @return resulting segment list + */ + public abstract List split(String string); + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMock.java b/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMock.java new file mode 100755 index 0000000..5b62434 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMock.java @@ -0,0 +1,46 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Represents split algorithm mock. + * Responsible for splitting input segment int susbsegments of given lenght. + * Used for testing. + * + * @author Jarek Lipski (loomchild) + */ +public class SplitAlgorithmMock extends SplitAlgorithm { + + private int charsInSegment; + + /** + * Creates split algorithm splitting input segment into segments of given + * length. + * @param charsInSegment output segment length. + */ + public SplitAlgorithmMock(int charsInSegment) { + assert charsInSegment > 0; + this.charsInSegment = charsInSegment; + } + + /** + * Splits text into segments of given length (the last one can be shorter). + * @param string input segment + * @return output segment list + */ + public List split(String string) { + List segmentList = new ArrayList(); + int start = 0; + for(int end = start + charsInSegment; end < string.length(); + start += charsInSegment, end += charsInSegment) { + String segment = string.substring(start, end); + segmentList.add(segment); + } + String segment = string.substring(start); + segmentList.add(segment); + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMockTest.java b/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMockTest.java new file mode 100755 index 0000000..112f8e2 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/SplitAlgorithmMockTest.java @@ -0,0 +1,32 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.filter.modifier.modify.merge.MergeAlgorithm; +import net.sourceforge.align.filter.modifier.modify.merge.SeparatorMergeAlgorithm; + +import org.junit.Test; + + +/** + * Tests {@link SplitAlgorithmMock}. This is a little paranoid because mock is + * used for testing itself. + * @author loomchild + */ +public class SplitAlgorithmMockTest { + + @Test + public void split() { + String[] segments = new String[] {"aa", "bb", "c"}; + MergeAlgorithm merger = new SeparatorMergeAlgorithm(""); + String text = merger.merge(Arrays.asList(segments)); + SplitAlgorithm splitter = new SplitAlgorithmMock(2); + List splitted = splitter.split(text); + String[] splittedArray = splitted.toArray(new String[splitted.size()]); + assertEquals(segments, splittedArray); + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/SplitTestSuite.java b/src/net/sourceforge/align/filter/modifier/modify/split/SplitTestSuite.java new file mode 100755 index 0000000..3599b35 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/SplitTestSuite.java @@ -0,0 +1,20 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + + +/** + * Represents {@link SplitAlgorithm} unit test suite. + * @author loomchild + * + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + SplitAlgorithmMockTest.class, SentenceSplitAlgorithmTest.class, + WordSplitAlgorithmTest.class + }) +public class SplitTestSuite { + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/SrxSplitAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/split/SrxSplitAlgorithm.java new file mode 100755 index 0000000..88939bb --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/SrxSplitAlgorithm.java @@ -0,0 +1,52 @@ +package net.sourceforge.align.filter.modifier.modify.split; + + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.segment.TextIterator; +import net.sourceforge.segment.srx.SrxDocument; +import net.sourceforge.segment.srx.SrxParser; +import net.sourceforge.segment.srx.SrxTextIterator; +import net.sourceforge.segment.srx.io.SrxAnyParser; + + +/** + * Represents a sentence splitter using rules defined in SRX format. + * Uses external segment library. + * + * @see Segment Project + * @see SRX Standard + * @author Jarek Lipski (loomchild) + */ +public class SrxSplitAlgorithm extends SplitAlgorithm { + + private SrxDocument document; + + private String languageCode; + + /** + * Creates a SRX splitter using given rules and selecting the ones to apply + * using given language code. + * @param reader reader containing SRX rules + * @param languageCode language code used to select the rules to apply + */ + public SrxSplitAlgorithm(Reader reader, String languageCode) { + SrxParser parser = new SrxAnyParser(); + this.document = parser.parse(reader); + this.languageCode = languageCode; + } + + public List split(String string) { + TextIterator textIterator = + new SrxTextIterator(document, languageCode, string); + List segmentList = new ArrayList(); + while(textIterator.hasNext()) { + String segment = textIterator.next(); + segmentList.add(segment); + } + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithm.java b/src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithm.java new file mode 100755 index 0000000..bfad0d5 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithm.java @@ -0,0 +1,42 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import static java.lang.Character.isLetterOrDigit; +import static java.lang.Character.isWhitespace; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents simple split algorithm separating input segment into words. + * Word boundaries are assumed to be everything that is not a character or + * digit. Whitespace characters are removed from the output. + * + * @author loomchild + */ +public class WordSplitAlgorithm extends SplitAlgorithm { + + public List split(String string) { + List wordList = new ArrayList(); + int start = 0; + for (int end = 0; end < string.length(); ++end) { + char ch = string.charAt(end); + if (!isLetterOrDigit(ch)) { + if ((end - start) > 0) { + String word = string.substring(start, end); + wordList.add(word); + } + if (!isWhitespace(ch)) { + String word = string.substring(end, end + 1); + wordList.add(word); + } + start = end + 1; + } + } + if (start < string.length()) { + String word = string.substring(start); + wordList.add(word); + } + return wordList; + } + +} diff --git a/src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithmTest.java b/src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithmTest.java new file mode 100755 index 0000000..8afe2d1 --- /dev/null +++ b/src/net/sourceforge/align/filter/modifier/modify/split/WordSplitAlgorithmTest.java @@ -0,0 +1,51 @@ +package net.sourceforge.align.filter.modifier.modify.split; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Test; + + +/** + * Represents {@link WordSplitAlgorithm} unit test. + * @author loomchild + */ +public class WordSplitAlgorithmTest { + + public static final String SPACE = " ab\t 9\net "; + + public static final String[] EXPECTED_SPACE = + new String[] {"ab", "9", "et"}; + + /** + * Checks if splitting on whitespace works as expected and that whitespace + * characters are removed from the output. + */ + @Test + public void splitSpace() { + WordSplitAlgorithm splitter = new WordSplitAlgorithm(); + List wordList = splitter.split(SPACE); + String[] wordArray = wordList.toArray(new String[wordList.size()]); + assertEquals(EXPECTED_SPACE, wordArray); + } + + public static final String PUNCTUATION = + "1. Ja, niżej podpisan(I'm \"batman01\")."; + + public static final String[] EXPECTED_PUNCTUATION = new String[] { + "1", ".", "Ja", ",", "niżej", "podpisan", "(", "I", "'", "m", + "\"", "batman01", "\"", ")", "."}; + + /** + * Checks if splitting after punctuation characters works as expected. + */ + @Test + public void splitPunctuation() { + WordSplitAlgorithm splitter = new WordSplitAlgorithm(); + List wordList = splitter.split(PUNCTUATION); + String[] wordArray = wordList.toArray(new String[wordList.size()]); + assertEquals(EXPECTED_PUNCTUATION, wordArray); + } + +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/all-wcprops b/src/net/sourceforge/align/filter/selector/.svn/all-wcprops new file mode 100644 index 0000000..9b86fd3 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/all-wcprops @@ -0,0 +1,65 @@ +K 25 +svn:wc:ra_dav:version-url +V 82 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/selector +END +DifferenceSelectorTest.java +K 25 +svn:wc:ra_dav:version-url +V 110 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/selector/DifferenceSelectorTest.java +END +DifferenceSelector.java +K 25 +svn:wc:ra_dav:version-url +V 106 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/selector/DifferenceSelector.java +END +IntersectionSelectorTest.java +K 25 +svn:wc:ra_dav:version-url +V 112 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/selector/IntersectionSelectorTest.java +END +IntersectionSelector.java +K 25 +svn:wc:ra_dav:version-url +V 108 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/filter/selector/IntersectionSelector.java +END +SelectorTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 105 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/selector/SelectorTestSuite.java +END +OneToOneSelectorTest.java +K 25 +svn:wc:ra_dav:version-url +V 108 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/selector/OneToOneSelectorTest.java +END +OneToOneSelector.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/selector/OneToOneSelector.java +END +ProbabilitySelector.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/selector/ProbabilitySelector.java +END +FractionSelectorTest.java +K 25 +svn:wc:ra_dav:version-url +V 108 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/selector/FractionSelectorTest.java +END +FractionSelector.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/filter/selector/FractionSelector.java +END diff --git a/src/net/sourceforge/align/filter/selector/.svn/entries b/src/net/sourceforge/align/filter/selector/.svn/entries new file mode 100644 index 0000000..2c6bd99 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/entries @@ -0,0 +1,368 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/filter/selector +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +DifferenceSelector.java +file + + + + +2010-11-11T10:09:21.000000Z +15e990abef3189f0b8c840c1c05f5a7c +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1264 + +DifferenceSelectorTest.java +file + + + + +2010-10-28T16:40:14.000000Z +100814c9f4d546f5a73112d111f639ce +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1283 + +FractionSelector.java +file + + + + +2010-10-28T16:40:14.000000Z +eec4164b4d350352301b9c56f66117be +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2182 + +FractionSelectorTest.java +file + + + + +2010-10-28T16:40:14.000000Z +4b5264fe960c1f3a1d53981ba0f06ff8 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2628 + +IntersectionSelector.java +file + + + + +2010-11-11T10:09:53.000000Z +0fc71c31782757946c3c01afa83df339 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1291 + +IntersectionSelectorTest.java +file + + + + +2010-10-28T16:40:14.000000Z +8b7c28fd7152d6c0613358a58fddef1b +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1361 + +OneToOneSelector.java +file + + + + +2010-10-28T16:40:14.000000Z +6e9bd6fe0cfcf60a6a9fe39eb8f838e8 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +921 + +OneToOneSelectorTest.java +file + + + + +2010-10-28T16:40:14.000000Z +d8b33b8424589370ac2073be08db76ac +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1481 + +ProbabilitySelector.java +file + + + + +2010-10-28T16:40:14.000000Z +05b92e50c171a301b31e025c35fdc729 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1277 + +SelectorTestSuite.java +file + + + + +2010-10-21T18:32:17.000000Z +faa243a9bdbe6bb9a0130578e73d40ee +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +420 + diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/DifferenceSelector.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/DifferenceSelector.java.svn-base new file mode 100644 index 0000000..d5eda21 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/DifferenceSelector.java.svn-base @@ -0,0 +1,40 @@ +package net.sourceforge.align.filter.selector; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.comparator.Comparator; +import net.sourceforge.align.comparator.Diff; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents a filter that selects only those alignments from input list + * that are not present in configured reference alingnment (set difference). + * + * @author loomchild + */ +public class DifferenceSelector implements Filter { + + private List rightAlignmentList; + + /** + * Creates difference selector filter. + * @param rightAlignmentList reference alignment list + */ + public DifferenceSelector(List rightAlignmentList) { + this.rightAlignmentList = new ArrayList(rightAlignmentList); + } + + /** + * Filters input alignment leaving only alignments that do not exist in + * configured reference alignment (set difference between alignment lists). + * @param leftAlignmentList Input alignment list. + * @return List containing selected alignments. + */ + public List apply(List leftAlignmentList) { + Diff diff = Comparator.compare(leftAlignmentList, rightAlignmentList); + return diff.getLeftList(); + } + +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/DifferenceSelectorTest.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/DifferenceSelectorTest.java.svn-base new file mode 100644 index 0000000..78471ff --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/DifferenceSelectorTest.java.svn-base @@ -0,0 +1,39 @@ +package net.sourceforge.align.filter.selector; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +import org.junit.Test; + +/** + * Represents {@link DifferenceSelector} unit test. + * @author loomchild + */ +public class DifferenceSelectorTest { + + @Test + public void testSimple() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Filter filter = new DifferenceSelector(rightAlignmentList); + List resultAlignmentList = filter.apply(leftAlignmentList); + + assertEquals(1, resultAlignmentList.size()); + assertEquals(leftAlignmentList.get(1), resultAlignmentList.get(0)); + + } +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/FractionSelector.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/FractionSelector.java.svn-base new file mode 100644 index 0000000..fbdf870 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/FractionSelector.java.svn-base @@ -0,0 +1,73 @@ +package net.sourceforge.align.filter.selector; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + + +/** + * Represents a filter that selects given fraction of most probable + * alignments. + * + * @author Jarek Lipski (loomchild) + */ +public class FractionSelector implements Filter { + + private float fraction; + + /** + * Creates filter. + * @param fraction fraction that will be left after filtering, <0,1> + */ + public FractionSelector(float fraction) { + assert fraction >= 0.0f && fraction <= 1.0f; + this.fraction = fraction; + } + + /** + * Selects most probable alignments from input list and leaves only + * given fraction of the best ones. For example if list has 100 alignments + * and the fraction was set to 0.8, then the resulting list will have + * 80 alignments with highest probability (lowest score). + * Does not change alignments order. + * Resulting list can have few more elements if they have equal score. + * + * TODO: why return more elements sometimes - maybe fix it so the number + * is always correct, by keeping only calculated number of identical + * elements? + * @param alignmentList input alignment list + * @return filtered alignment list + */ + public List apply(List alignmentList) { + float threshold = calculateThreshold(alignmentList); + List filteredAlignmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + if (alignment.getScore() <= threshold) { + filteredAlignmentList.add(alignment); + } + } + return filteredAlignmentList; + } + + private float calculateThreshold(List alignmentList) { + float[] scoreArray = new float[alignmentList.size()]; + int index = 0; + for (Alignment alignment : alignmentList) { + scoreArray[index] = alignment.getScore(); + ++index; + } + Arrays.sort(scoreArray); + float firstFiltered = fraction * (float)scoreArray.length - 0.5f; + float threshold; + if (firstFiltered < 0.0f) { + threshold = Float.NEGATIVE_INFINITY; + } else { + threshold = scoreArray[(int)firstFiltered]; + } + return threshold; + } + +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/FractionSelectorTest.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/FractionSelectorTest.java.svn-base new file mode 100644 index 0000000..f2852e5 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/FractionSelectorTest.java.svn-base @@ -0,0 +1,92 @@ +package net.sourceforge.align.filter.selector; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +import org.junit.Test; + +/** + * Represents {@link FractionSelector} unit test. + * @author loomchild + */ +public class FractionSelectorTest { + + /** + * Test of selecting from empty list returns empty list and does not + * throw an exception. + */ + @Test + public void testEmpty() { + Filter filter = new FractionSelector(0.8f); + List alignmentList = new ArrayList(); + alignmentList = filter.apply(alignmentList); + assertEquals(0, alignmentList.size()); + } + + /** + * Test if a selecting from a list containing one element returns empty + * list if fraction is < 0.5, and one element list if fraction >= 0.5. + */ + @Test + public void testSingleton() { + Filter filter; + List alignmentList = new ArrayList(); + List filteredAlignmentList; + Alignment alignment = new Alignment(); + alignment.setScore(1.0f); + alignmentList.add(alignment); + filter = new FractionSelector(0.4999f); + filteredAlignmentList = filter.apply(alignmentList); + assertEquals(0, filteredAlignmentList.size()); + filter = new FractionSelector(0.5f); + filteredAlignmentList = filter.apply(alignmentList); + assertEquals(1, filteredAlignmentList.size()); + } + + /** + * Test if the list contains elements with identical score, + * they will all be returned if fraction > 0. + */ + @Test + public void testIdentical() { + Filter filter = new FractionSelector(0.79f); + List alignmentList = createAlignmentList( + new float[]{2.0f, 2.0f, 2.0f, 2.0f, 2.0f}); + alignmentList = filter.apply(alignmentList); + assertEquals(5, alignmentList.size()); + } + + /** + * Tests if fraction selector selects correct number of elements. + */ + @Test + public void testDifferent() { + Filter filter = new FractionSelector(0.79f); + List alignmentList = createAlignmentList( + new float[]{1.0f, 4.0f, 2.0f, 5.0f, 2.0f}); + alignmentList = filter.apply(alignmentList); + assertEquals(4, alignmentList.size()); + } + + /** + * Helper function to create mock alignment list containing elements + * with given scores. + * @param scoreArray + * @return + */ + private List createAlignmentList(float[] scoreArray) { + List alignmentList = new ArrayList(); + for (float score : scoreArray) { + Alignment alignment = new Alignment(); + alignment.setScore(score); + alignmentList.add(alignment); + } + return alignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/IntersectionSelector.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/IntersectionSelector.java.svn-base new file mode 100644 index 0000000..fd3c626 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/IntersectionSelector.java.svn-base @@ -0,0 +1,41 @@ +package net.sourceforge.align.filter.selector; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.comparator.Comparator; +import net.sourceforge.align.comparator.Diff; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents a filter that selects only alignments also occurring in given + * reference alignment list - creating set intersection of reference alignments + * and input alignment. + * + * @author loomchild + */ +public class IntersectionSelector implements Filter { + + private List rightAlignmentList; + + /** + * Creates intersection selector. + * @param rightAlignmentList reference alignment list + */ + public IntersectionSelector(List rightAlignmentList) { + this.rightAlignmentList = new ArrayList(rightAlignmentList); + } + + /** + * Filters input alignment leaving only alignments that exist in + * configured reference alignment (set intersection between alignment lists). + * @param leftAlignmentList Input alignment list. + * @return List containing selected alignments. + */ + public List apply(List leftAlignmentList) { + Diff diff = Comparator.compare(leftAlignmentList, rightAlignmentList); + return diff.getCommonList(); + } + +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/IntersectionSelectorTest.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/IntersectionSelectorTest.java.svn-base new file mode 100644 index 0000000..5aa7d57 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/IntersectionSelectorTest.java.svn-base @@ -0,0 +1,40 @@ +package net.sourceforge.align.filter.selector; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +import org.junit.Test; + +/** + * Represents {@link IntersectionSelector} unit test. + * @author loomchild + */ +public class IntersectionSelectorTest { + + @Test + public void testSimple() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Filter filter = new IntersectionSelector(rightAlignmentList); + List resultAlignmentList = filter.apply(leftAlignmentList); + + assertEquals(2, resultAlignmentList.size()); + assertEquals(rightAlignmentList.get(0), resultAlignmentList.get(0)); + assertEquals(rightAlignmentList.get(2), resultAlignmentList.get(1)); + + } +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/OneToOneSelector.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/OneToOneSelector.java.svn-base new file mode 100644 index 0000000..3c3ccf5 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/OneToOneSelector.java.svn-base @@ -0,0 +1,34 @@ +package net.sourceforge.align.filter.selector; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents the filter that selects only one to one alignments and removes + * the rest. + * + * @author Jarek Lipski (loomchild) + */ +public class OneToOneSelector implements Filter { + + /** + * Filters the alignment list by leaving only 1-1 alignments. + * + * @param alignmentList input alignment list + * @return filtered alignment list + */ + public List apply(List alignmentList) { + List filteredAlignmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + if (alignment.getSourceSegmentList().size() == 1 && + alignment.getTargetSegmentList().size() == 1) { + filteredAlignmentList.add(alignment); + } + } + return filteredAlignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/OneToOneSelectorTest.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/OneToOneSelectorTest.java.svn-base new file mode 100644 index 0000000..fe1d638 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/OneToOneSelectorTest.java.svn-base @@ -0,0 +1,57 @@ +package net.sourceforge.align.filter.selector; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; +import static net.sourceforge.align.util.Util.filterSegmentArray; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +import org.junit.Test; + +/** + * Represents {@link OneToOneSelector} unit test. + * @author loomchild + */ +public class OneToOneSelectorTest { + + public static final String[][] SOURCE_ARRAY = new String[][] { + new String[] {"aa", "bb"}, + new String[] {}, + new String[] {"cc"}, + new String[] {}, + new String[] {"dd"}, + new String[] {"ee", "ff"}, + }; + + public static final String[][] TARGET_ARRAY = new String[][] { + new String[] {"11"}, + new String[] {"22"}, + new String[] {"33"}, + new String[] {}, + new String[] {"44"}, + new String[] {"55", "66"}, + }; + + public static final int[] RESULT_INDEXES = new int[] { + 2, 4 + }; + + /** + * Checks if selector leaves only and all one to one alignments. + */ + @Test + public void compare() { + List alignmentList = createAlignmentList( + SOURCE_ARRAY, TARGET_ARRAY); + Filter filter = new OneToOneSelector(); + List resultAlignmentList = filter.apply(alignmentList); + assertAlignmentListEquals( + filterSegmentArray(SOURCE_ARRAY, RESULT_INDEXES), + filterSegmentArray(TARGET_ARRAY, RESULT_INDEXES), + resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/ProbabilitySelector.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/ProbabilitySelector.java.svn-base new file mode 100644 index 0000000..35fc7f5 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/ProbabilitySelector.java.svn-base @@ -0,0 +1,46 @@ +package net.sourceforge.align.filter.selector; + +import static net.sourceforge.align.util.Util.toScore; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + + +/** + * Selects alignments with probability equal or greater than given threshold. + * + * @author Jarek Lipski (loomchild) + */ +public class ProbabilitySelector implements Filter { + + private double scoreThreshold; + + /** + * Creates selector. + * @param probabilityThreshold Minimum accepted alignment probability. + * From range <0,1>. + */ + public ProbabilitySelector(double probabilityThreshold) { + assert probabilityThreshold >= 0.0f && probabilityThreshold <= 1.0f; + this.scoreThreshold = toScore(probabilityThreshold); + } + + /** + * Selects alignments with probability equal or greater than threshold. + * @param alignmentList input alignment list + * @return list containing selected alignments + */ + public List apply(List alignmentList) { + List selectedAlignmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + if (alignment.getScore() <= scoreThreshold) { + selectedAlignmentList.add(alignment); + } + } + return selectedAlignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/selector/.svn/text-base/SelectorTestSuite.java.svn-base b/src/net/sourceforge/align/filter/selector/.svn/text-base/SelectorTestSuite.java.svn-base new file mode 100644 index 0000000..7af54d5 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/.svn/text-base/SelectorTestSuite.java.svn-base @@ -0,0 +1,16 @@ +package net.sourceforge.align.filter.selector; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents test suite consisting of all the classes in selector package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + FractionSelectorTest.class, OneToOneSelectorTest.class, + IntersectionSelectorTest.class, DifferenceSelectorTest.class +}) +public class SelectorTestSuite { +} diff --git a/src/net/sourceforge/align/filter/selector/DifferenceSelector.java b/src/net/sourceforge/align/filter/selector/DifferenceSelector.java new file mode 100755 index 0000000..d5eda21 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/DifferenceSelector.java @@ -0,0 +1,40 @@ +package net.sourceforge.align.filter.selector; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.comparator.Comparator; +import net.sourceforge.align.comparator.Diff; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents a filter that selects only those alignments from input list + * that are not present in configured reference alingnment (set difference). + * + * @author loomchild + */ +public class DifferenceSelector implements Filter { + + private List rightAlignmentList; + + /** + * Creates difference selector filter. + * @param rightAlignmentList reference alignment list + */ + public DifferenceSelector(List rightAlignmentList) { + this.rightAlignmentList = new ArrayList(rightAlignmentList); + } + + /** + * Filters input alignment leaving only alignments that do not exist in + * configured reference alignment (set difference between alignment lists). + * @param leftAlignmentList Input alignment list. + * @return List containing selected alignments. + */ + public List apply(List leftAlignmentList) { + Diff diff = Comparator.compare(leftAlignmentList, rightAlignmentList); + return diff.getLeftList(); + } + +} diff --git a/src/net/sourceforge/align/filter/selector/DifferenceSelectorTest.java b/src/net/sourceforge/align/filter/selector/DifferenceSelectorTest.java new file mode 100755 index 0000000..78471ff --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/DifferenceSelectorTest.java @@ -0,0 +1,39 @@ +package net.sourceforge.align.filter.selector; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +import org.junit.Test; + +/** + * Represents {@link DifferenceSelector} unit test. + * @author loomchild + */ +public class DifferenceSelectorTest { + + @Test + public void testSimple() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Filter filter = new DifferenceSelector(rightAlignmentList); + List resultAlignmentList = filter.apply(leftAlignmentList); + + assertEquals(1, resultAlignmentList.size()); + assertEquals(leftAlignmentList.get(1), resultAlignmentList.get(0)); + + } +} diff --git a/src/net/sourceforge/align/filter/selector/FractionSelector.java b/src/net/sourceforge/align/filter/selector/FractionSelector.java new file mode 100755 index 0000000..fbdf870 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/FractionSelector.java @@ -0,0 +1,73 @@ +package net.sourceforge.align.filter.selector; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + + +/** + * Represents a filter that selects given fraction of most probable + * alignments. + * + * @author Jarek Lipski (loomchild) + */ +public class FractionSelector implements Filter { + + private float fraction; + + /** + * Creates filter. + * @param fraction fraction that will be left after filtering, <0,1> + */ + public FractionSelector(float fraction) { + assert fraction >= 0.0f && fraction <= 1.0f; + this.fraction = fraction; + } + + /** + * Selects most probable alignments from input list and leaves only + * given fraction of the best ones. For example if list has 100 alignments + * and the fraction was set to 0.8, then the resulting list will have + * 80 alignments with highest probability (lowest score). + * Does not change alignments order. + * Resulting list can have few more elements if they have equal score. + * + * TODO: why return more elements sometimes - maybe fix it so the number + * is always correct, by keeping only calculated number of identical + * elements? + * @param alignmentList input alignment list + * @return filtered alignment list + */ + public List apply(List alignmentList) { + float threshold = calculateThreshold(alignmentList); + List filteredAlignmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + if (alignment.getScore() <= threshold) { + filteredAlignmentList.add(alignment); + } + } + return filteredAlignmentList; + } + + private float calculateThreshold(List alignmentList) { + float[] scoreArray = new float[alignmentList.size()]; + int index = 0; + for (Alignment alignment : alignmentList) { + scoreArray[index] = alignment.getScore(); + ++index; + } + Arrays.sort(scoreArray); + float firstFiltered = fraction * (float)scoreArray.length - 0.5f; + float threshold; + if (firstFiltered < 0.0f) { + threshold = Float.NEGATIVE_INFINITY; + } else { + threshold = scoreArray[(int)firstFiltered]; + } + return threshold; + } + +} diff --git a/src/net/sourceforge/align/filter/selector/FractionSelectorTest.java b/src/net/sourceforge/align/filter/selector/FractionSelectorTest.java new file mode 100755 index 0000000..f2852e5 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/FractionSelectorTest.java @@ -0,0 +1,92 @@ +package net.sourceforge.align.filter.selector; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +import org.junit.Test; + +/** + * Represents {@link FractionSelector} unit test. + * @author loomchild + */ +public class FractionSelectorTest { + + /** + * Test of selecting from empty list returns empty list and does not + * throw an exception. + */ + @Test + public void testEmpty() { + Filter filter = new FractionSelector(0.8f); + List alignmentList = new ArrayList(); + alignmentList = filter.apply(alignmentList); + assertEquals(0, alignmentList.size()); + } + + /** + * Test if a selecting from a list containing one element returns empty + * list if fraction is < 0.5, and one element list if fraction >= 0.5. + */ + @Test + public void testSingleton() { + Filter filter; + List alignmentList = new ArrayList(); + List filteredAlignmentList; + Alignment alignment = new Alignment(); + alignment.setScore(1.0f); + alignmentList.add(alignment); + filter = new FractionSelector(0.4999f); + filteredAlignmentList = filter.apply(alignmentList); + assertEquals(0, filteredAlignmentList.size()); + filter = new FractionSelector(0.5f); + filteredAlignmentList = filter.apply(alignmentList); + assertEquals(1, filteredAlignmentList.size()); + } + + /** + * Test if the list contains elements with identical score, + * they will all be returned if fraction > 0. + */ + @Test + public void testIdentical() { + Filter filter = new FractionSelector(0.79f); + List alignmentList = createAlignmentList( + new float[]{2.0f, 2.0f, 2.0f, 2.0f, 2.0f}); + alignmentList = filter.apply(alignmentList); + assertEquals(5, alignmentList.size()); + } + + /** + * Tests if fraction selector selects correct number of elements. + */ + @Test + public void testDifferent() { + Filter filter = new FractionSelector(0.79f); + List alignmentList = createAlignmentList( + new float[]{1.0f, 4.0f, 2.0f, 5.0f, 2.0f}); + alignmentList = filter.apply(alignmentList); + assertEquals(4, alignmentList.size()); + } + + /** + * Helper function to create mock alignment list containing elements + * with given scores. + * @param scoreArray + * @return + */ + private List createAlignmentList(float[] scoreArray) { + List alignmentList = new ArrayList(); + for (float score : scoreArray) { + Alignment alignment = new Alignment(); + alignment.setScore(score); + alignmentList.add(alignment); + } + return alignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/selector/IntersectionSelector.java b/src/net/sourceforge/align/filter/selector/IntersectionSelector.java new file mode 100755 index 0000000..fd3c626 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/IntersectionSelector.java @@ -0,0 +1,41 @@ +package net.sourceforge.align.filter.selector; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.comparator.Comparator; +import net.sourceforge.align.comparator.Diff; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents a filter that selects only alignments also occurring in given + * reference alignment list - creating set intersection of reference alignments + * and input alignment. + * + * @author loomchild + */ +public class IntersectionSelector implements Filter { + + private List rightAlignmentList; + + /** + * Creates intersection selector. + * @param rightAlignmentList reference alignment list + */ + public IntersectionSelector(List rightAlignmentList) { + this.rightAlignmentList = new ArrayList(rightAlignmentList); + } + + /** + * Filters input alignment leaving only alignments that exist in + * configured reference alignment (set intersection between alignment lists). + * @param leftAlignmentList Input alignment list. + * @return List containing selected alignments. + */ + public List apply(List leftAlignmentList) { + Diff diff = Comparator.compare(leftAlignmentList, rightAlignmentList); + return diff.getCommonList(); + } + +} diff --git a/src/net/sourceforge/align/filter/selector/IntersectionSelectorTest.java b/src/net/sourceforge/align/filter/selector/IntersectionSelectorTest.java new file mode 100755 index 0000000..5aa7d57 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/IntersectionSelectorTest.java @@ -0,0 +1,40 @@ +package net.sourceforge.align.filter.selector; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +import org.junit.Test; + +/** + * Represents {@link IntersectionSelector} unit test. + * @author loomchild + */ +public class IntersectionSelectorTest { + + @Test + public void testSimple() { + + List leftAlignmentList = new ArrayList(); + leftAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + leftAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{})); + leftAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + List rightAlignmentList = new ArrayList(); + rightAlignmentList.add(new Alignment(new String[]{"a"}, new String[]{"1"})); + rightAlignmentList.add(new Alignment(new String[]{"b"}, new String[]{"2"})); + rightAlignmentList.add(new Alignment(new String[]{"c"}, new String[]{"3"})); + + Filter filter = new IntersectionSelector(rightAlignmentList); + List resultAlignmentList = filter.apply(leftAlignmentList); + + assertEquals(2, resultAlignmentList.size()); + assertEquals(rightAlignmentList.get(0), resultAlignmentList.get(0)); + assertEquals(rightAlignmentList.get(2), resultAlignmentList.get(1)); + + } +} diff --git a/src/net/sourceforge/align/filter/selector/OneToOneSelector.java b/src/net/sourceforge/align/filter/selector/OneToOneSelector.java new file mode 100755 index 0000000..3c3ccf5 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/OneToOneSelector.java @@ -0,0 +1,34 @@ +package net.sourceforge.align.filter.selector; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Represents the filter that selects only one to one alignments and removes + * the rest. + * + * @author Jarek Lipski (loomchild) + */ +public class OneToOneSelector implements Filter { + + /** + * Filters the alignment list by leaving only 1-1 alignments. + * + * @param alignmentList input alignment list + * @return filtered alignment list + */ + public List apply(List alignmentList) { + List filteredAlignmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + if (alignment.getSourceSegmentList().size() == 1 && + alignment.getTargetSegmentList().size() == 1) { + filteredAlignmentList.add(alignment); + } + } + return filteredAlignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/selector/OneToOneSelectorTest.java b/src/net/sourceforge/align/filter/selector/OneToOneSelectorTest.java new file mode 100755 index 0000000..fe1d638 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/OneToOneSelectorTest.java @@ -0,0 +1,57 @@ +package net.sourceforge.align.filter.selector; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; +import static net.sourceforge.align.util.Util.filterSegmentArray; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + +import org.junit.Test; + +/** + * Represents {@link OneToOneSelector} unit test. + * @author loomchild + */ +public class OneToOneSelectorTest { + + public static final String[][] SOURCE_ARRAY = new String[][] { + new String[] {"aa", "bb"}, + new String[] {}, + new String[] {"cc"}, + new String[] {}, + new String[] {"dd"}, + new String[] {"ee", "ff"}, + }; + + public static final String[][] TARGET_ARRAY = new String[][] { + new String[] {"11"}, + new String[] {"22"}, + new String[] {"33"}, + new String[] {}, + new String[] {"44"}, + new String[] {"55", "66"}, + }; + + public static final int[] RESULT_INDEXES = new int[] { + 2, 4 + }; + + /** + * Checks if selector leaves only and all one to one alignments. + */ + @Test + public void compare() { + List alignmentList = createAlignmentList( + SOURCE_ARRAY, TARGET_ARRAY); + Filter filter = new OneToOneSelector(); + List resultAlignmentList = filter.apply(alignmentList); + assertAlignmentListEquals( + filterSegmentArray(SOURCE_ARRAY, RESULT_INDEXES), + filterSegmentArray(TARGET_ARRAY, RESULT_INDEXES), + resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/filter/selector/ProbabilitySelector.java b/src/net/sourceforge/align/filter/selector/ProbabilitySelector.java new file mode 100755 index 0000000..35fc7f5 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/ProbabilitySelector.java @@ -0,0 +1,46 @@ +package net.sourceforge.align.filter.selector; + +import static net.sourceforge.align.util.Util.toScore; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; + + +/** + * Selects alignments with probability equal or greater than given threshold. + * + * @author Jarek Lipski (loomchild) + */ +public class ProbabilitySelector implements Filter { + + private double scoreThreshold; + + /** + * Creates selector. + * @param probabilityThreshold Minimum accepted alignment probability. + * From range <0,1>. + */ + public ProbabilitySelector(double probabilityThreshold) { + assert probabilityThreshold >= 0.0f && probabilityThreshold <= 1.0f; + this.scoreThreshold = toScore(probabilityThreshold); + } + + /** + * Selects alignments with probability equal or greater than threshold. + * @param alignmentList input alignment list + * @return list containing selected alignments + */ + public List apply(List alignmentList) { + List selectedAlignmentList = new ArrayList(); + for (Alignment alignment : alignmentList) { + if (alignment.getScore() <= scoreThreshold) { + selectedAlignmentList.add(alignment); + } + } + return selectedAlignmentList; + } + +} diff --git a/src/net/sourceforge/align/filter/selector/SelectorTestSuite.java b/src/net/sourceforge/align/filter/selector/SelectorTestSuite.java new file mode 100755 index 0000000..7af54d5 --- /dev/null +++ b/src/net/sourceforge/align/filter/selector/SelectorTestSuite.java @@ -0,0 +1,16 @@ +package net.sourceforge.align.filter.selector; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents test suite consisting of all the classes in selector package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + FractionSelectorTest.class, OneToOneSelectorTest.class, + IntersectionSelectorTest.class, DifferenceSelectorTest.class +}) +public class SelectorTestSuite { +} diff --git a/src/net/sourceforge/align/formatter/.svn/all-wcprops b/src/net/sourceforge/align/formatter/.svn/all-wcprops new file mode 100644 index 0000000..6653e4e --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/all-wcprops @@ -0,0 +1,71 @@ +K 25 +svn:wc:ra_dav:version-url +V 76 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/formatter +END +PresentationFormatter.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/PresentationFormatter.java +END +AlFormatter.java +K 25 +svn:wc:ra_dav:version-url +V 93 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/AlFormatter.java +END +HtmlFormatter.java +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/HtmlFormatter.java +END +TmxFormatterTest.java +K 25 +svn:wc:ra_dav:version-url +V 98 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/TmxFormatterTest.java +END +FormatterTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/FormatterTestSuite.java +END +InfoFormatter.java +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/InfoFormatter.java +END +TmxFormatter.java +K 25 +svn:wc:ra_dav:version-url +V 94 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/formatter/TmxFormatter.java +END +Formatter.java +K 25 +svn:wc:ra_dav:version-url +V 91 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/Formatter.java +END +PlaintextFormatter.java +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/PlaintextFormatter.java +END +PresentationFormatterTest.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/PresentationFormatterTest.java +END +AlFormatterTest.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/formatter/AlFormatterTest.java +END diff --git a/src/net/sourceforge/align/formatter/.svn/entries b/src/net/sourceforge/align/formatter/.svn/entries new file mode 100644 index 0000000..ba6ca52 --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/entries @@ -0,0 +1,402 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/formatter +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +AlFormatter.java +file + + + + +2010-10-28T16:40:13.000000Z +2a7026fd49d44a8e762c74b61d76d501 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1611 + +AlFormatterTest.java +file + + + + +2010-10-28T16:40:13.000000Z +f524abb37fb30e2236ae0d09fdd74465 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1532 + +Formatter.java +file + + + + +2010-10-28T16:40:14.000000Z +9b4a5c534247a1431c99c7327e9c756d +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +646 + +FormatterTestSuite.java +file + + + + +2010-10-17T22:37:33.000000Z +4902ef2aa5cdcd46efa381f7f5abe313 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +380 + +HtmlFormatter.java +file + + + + +2010-10-28T16:40:14.000000Z +c6d901b8ea656de0b20259550677b3ff +2010-11-02T23:37:42.328942Z +42 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +1622 + +InfoFormatter.java +file + + + + +2010-10-28T16:40:14.000000Z +0fa16cc5c67958b4417f11b00d4d3274 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +3709 + +PlaintextFormatter.java +file + + + + +2010-10-28T16:40:14.000000Z +adb6b8c2884ac50524d4336ba5955d33 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1814 + +PresentationFormatter.java +file + + + + +2010-10-28T16:40:14.000000Z +83e53f8bd8efd4bad30b889838676437 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +4542 + +PresentationFormatterTest.java +file + + + + +2010-10-28T16:40:14.000000Z +9099693ecb1602ec8a472aae0c99c72e +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1944 + +TmxFormatter.java +file + + + + +2010-11-11T09:55:47.000000Z +cc1d2b063a5db3e8349550278041f847 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +3049 + +TmxFormatterTest.java +file + + + + +2010-10-28T16:40:14.000000Z +1b9af39413831e3e5fa1f955e5ef8025 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1757 + diff --git a/src/net/sourceforge/align/formatter/.svn/prop-base/HtmlFormatter.java.svn-base b/src/net/sourceforge/align/formatter/.svn/prop-base/HtmlFormatter.java.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/prop-base/HtmlFormatter.java.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/AlFormatter.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/AlFormatter.java.svn-base new file mode 100644 index 0000000..b168a91 --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/AlFormatter.java.svn-base @@ -0,0 +1,56 @@ +package net.sourceforge.align.formatter; + +import java.io.Writer; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.bind.AlMarshallerUnmarshaller; +import net.sourceforge.align.util.bind.al.Alignmentlist; +import net.sourceforge.align.util.bind.al.Segmentlist; + +/** + * Represents formatter to native .AL format. + * + * This format preserves all information about alignments including scores. + * Alignments are stored using a writer defined in constructor. + * + * @author Jarek Lipski (loomchild) + */ +public class AlFormatter implements Formatter { + + private Writer writer; + + /** + * Creates formatter. + * @param writer writer to which the output will be dumped. + */ + public AlFormatter(Writer writer) { + this.writer = writer; + } + + /** + * Formats alignments to a writer preserving all parameters. + */ + public void format(List alignmentList) { + Alignmentlist al = new Alignmentlist(); + for (Alignment alignment : alignmentList) { + net.sourceforge.align.util.bind.al.Alignment a = new net.sourceforge.align.util.bind.al.Alignment(); + a.setScore((double)alignment.getScore()); + a.setSourcelist(createSegmentList( + alignment.getSourceSegmentList())); + a.setTargetlist(createSegmentList( + alignment.getTargetSegmentList())); + al.getAlignment().add(a); + } + AlMarshallerUnmarshaller.getInstance().marshal(al, writer); + } + + private Segmentlist createSegmentList(List segmentList) { + Segmentlist sl = new Segmentlist(); + for (String segment : segmentList) { + sl.getSegment().add(segment); + } + return sl; + } + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/AlFormatterTest.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/AlFormatterTest.java.svn-base new file mode 100644 index 0000000..0b0d940 --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/AlFormatterTest.java.svn-base @@ -0,0 +1,53 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.parser.AlParser; + +import org.junit.Test; + +/** + * Represents {@link AlFormatter} unit test. + * @author loomchild + */ +public class AlFormatterTest { + + public static final String[][] SOURCE_ARRAY = new String[][]{ + new String[]{"Ala ma kota kot ma\tale nie wie.\nDrugie.", + "Burza mózgów zawsze dobrze robi."}, + new String[]{}, + new String[]{}, + }; + + public static final String[][] TARGET_ARRAY = new String[][]{ + new String[]{"Wasserreservoir, Wasserreservoir..."}, + new String[]{}, + new String[]{"Immer nur Wasser"}, + }; + + /** + * Tests whether alignment formatted by {@link AlFormatter} can be + * successfully parsed by {@link AlParser}. + */ + @Test + public void testFormatParse() { + List alignmentList = createAlignmentList(SOURCE_ARRAY, + TARGET_ARRAY); + StringWriter writer = new StringWriter(); + Formatter formatter = new AlFormatter(writer); + formatter.format(alignmentList); + Reader reader = new StringReader(writer.toString()); + AlParser parser = new AlParser(reader); + List resultAlignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_ARRAY, TARGET_ARRAY, + resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/Formatter.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/Formatter.java.svn-base new file mode 100644 index 0000000..9fd9b9d --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/Formatter.java.svn-base @@ -0,0 +1,25 @@ +package net.sourceforge.align.formatter; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + + +/** + * Represents a alignment list formatter / writer. + * Responsible for writing alignment list in specific format. + * The output location (file, set of files) are defined in individual subclasses + * and should be configured in class constructor. + * + * @author Jarek Lipski (loomchild) + */ +public interface Formatter { + + /** + * Formats alignment list to previously defined location depending + * on concrete implementation. + * @param alignmentList alignment list + */ + public void format(List alignmentList); + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/FormatterTestSuite.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/FormatterTestSuite.java.svn-base new file mode 100644 index 0000000..57a3de6 --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/FormatterTestSuite.java.svn-base @@ -0,0 +1,17 @@ +package net.sourceforge.align.formatter; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Test suite including all formatter tests in this package and subpackages. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlFormatterTest.class, PresentationFormatterTest.class, + TmxFormatterTest.class +}) +public class FormatterTestSuite { + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/HtmlFormatter.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/HtmlFormatter.java.svn-base new file mode 100644 index 0000000..f5f6cfb --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/HtmlFormatter.java.svn-base @@ -0,0 +1,62 @@ +package net.sourceforge.align.formatter; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents HTML formatter that produces human-readable output. + * + * The output is stored using configured writer in two columns of HTML table. + * + * @author loomchild + */ +public class HtmlFormatter implements Formatter { + + private PrintWriter writer; + + /** + * Constructs a formatter + * @param writer writer that will be used as output + */ + public HtmlFormatter(Writer writer) { + this.writer = new PrintWriter(writer, true); + } + + /** + * Formats the alignment into full HTML page containing a table with + * two columns representing source and target texts. + * + * @param alignmentList input alignment list + */ + public void format(List alignmentList) { + writer.println(""); + + writer.println(""); + writer.println(""); + writer.println(""); + + writer.println(""); + writer.println(""); + for (Alignment alignment : alignmentList) { + writer.println(""); + formatStrings(alignment.getSourceSegmentList()); + formatStrings(alignment.getTargetSegmentList()); + writer.println(""); + } + writer.println("
"); + writer.println(""); + writer.println(""); + } + + private void formatStrings(List stringList) { + writer.println(""); + for (String string : stringList) { + writer.println("

" + string + "

"); + } + writer.println(""); + } + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/InfoFormatter.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/InfoFormatter.java.svn-base new file mode 100644 index 0000000..d58de8c --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/InfoFormatter.java.svn-base @@ -0,0 +1,124 @@ +package net.sourceforge.align.formatter; + +import java.io.PrintWriter; +import java.io.Serializable; +import java.io.Writer; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; + +/** + * Represents formatter displaying info and statistics of the whole alignment. + * Stores the result using {@link Writer} defined in constructor. + * + * The statistics include total number of alignments and number of alignments + * per category. + * + * @author Jarek Lipski (loomchild) + */ +public class InfoFormatter implements Formatter { + + private PrintWriter writer; + + /** + * Creates formatter. + * @param writer writer which will be used to store or display the info. + */ + public InfoFormatter(Writer writer) { + this.writer = new PrintWriter(writer); + } + + /** + * Formats the result using configured writer. + */ + public void format(List alignmentList) { + int alignmentCount = alignmentList.size(); + + Map categoryMap = + new TreeMap(new CategoryComparator()); + for (Alignment alignment : alignmentList) { + Category category = alignment.getCategory(); + Integer occurenceCount = categoryMap.get(category); + if (occurenceCount == null) { + occurenceCount = 1; + } else { + ++occurenceCount; + } + categoryMap.put(category, occurenceCount); + } + + for (Map.Entry entry : categoryMap.entrySet()) { + writer.println(entry.getKey().toString() + "\t" + entry.getValue()); + } + writer.println("Total\t" + alignmentCount); + writer.flush(); + } + + /** + * Orders categories in the following ascending order. Example: + * (0-1), (1-0), (1-1), (1-2), (2-1), (2-2), ... + * + * TODO: write test for this class cause there was a problem before + * that (0-1) and (1-0) were equal so the order was undetermined. + * + * @author loomchild + */ + private static class CategoryComparator + implements Comparator, Serializable { + + private static final long serialVersionUID = 2369430623799175503L; + + /** + * Returns negative [positive] number if minimum number of segments + * in left category is lesser [greater] than minimum number of segments + * in right category. + * + * If the numbers are equal then returns negative [positive] number + * if maximum number of segments in left category is lesser [greater] + * than maximum numbers in right category. + * + * If the numbers are still equal then returns negative [positive] + * number if number of source segments in left category is lesser + * [greater] than number of source segments in right category. + */ + public int compare(Category leftCategory, Category rightCategory) { + int result = getMinimumSegmentCount(leftCategory) - + getMinimumSegmentCount(rightCategory); + if (result == 0) { + result = getMaximumSegmentCount(leftCategory) - + getMaximumSegmentCount(rightCategory); + if (result == 0) { + result = leftCategory.getSourceSegmentCount() + - rightCategory.getSourceSegmentCount(); + } + } + return result; + } + + /** + * Returns minimum count of source and target segments in a category. + * @param category + * @return + */ + private int getMinimumSegmentCount(Category category) { + return Math.min(category.getSourceSegmentCount(), + category.getTargetSegmentCount()); + } + + /** + * Returns maximum count of source and target segments in a category. + * @param category + * @return + */ + private int getMaximumSegmentCount(Category category) { + return Math.max(category.getSourceSegmentCount(), + category.getTargetSegmentCount()); + } + + } + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/PlaintextFormatter.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/PlaintextFormatter.java.svn-base new file mode 100644 index 0000000..3cab6a8 --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/PlaintextFormatter.java.svn-base @@ -0,0 +1,61 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.merge; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents a formatter writing to separate source and target plaintext files. + * + * In each line of each file all all given alignment segments are written. + * Subsequent lines in source and target files correspond to each other, number + * of lines is equal in files. If alignment consists of more than one segment, + * they are merged and space is inserted between them. + * + * @author loomchild + */ +public class PlaintextFormatter implements Formatter { + + private PrintWriter sourceWriter; + + private PrintWriter targetWriter; + + /** + * Creates formatter. + * @param sourceWriter source file writer + * @param targetWriter target file writer + */ + public PlaintextFormatter(Writer sourceWriter, Writer targetWriter) { + this.sourceWriter = new PrintWriter(sourceWriter, true); + this.targetWriter = new PrintWriter(targetWriter, true); + } + + /** + * Formats alignment using defined source and target writer. + * @param alignmentList input alignment list + */ + public void format(List alignmentList) { + for (Alignment alignment : alignmentList) { + printSegmentList(sourceWriter, alignment.getSourceSegmentList()); + printSegmentList(targetWriter, alignment.getTargetSegmentList()); + } + } + + /** + * Merges segments and replaces end-of-line characters with spaces to make + * sure resulting files have the same number of lines. + * @param writer + * @param segmentList + */ + private void printSegmentList(PrintWriter writer, + List segmentList) { + String segment = merge(segmentList); + segment = segment.replace("\n", " "); + writer.println(segment); + } + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/PresentationFormatter.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/PresentationFormatter.java.svn-base new file mode 100644 index 0000000..ec324d9 --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/PresentationFormatter.java.svn-base @@ -0,0 +1,156 @@ +package net.sourceforge.align.formatter; + +import static java.lang.Math.min; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents a plaintext formatter that produces human-readable output. + * + * The output is stored using configured writer in two columns + * representing source and target texts. + * + * @author loomchild + */ +public class PresentationFormatter implements Formatter { + + public static final int DEFAULT_WIDTH = 79; + + public static final int MIN_WIDTH = 5; + + private PrintWriter writer; + + private int width; + + private int maxLength; + + private String emptyString; + + /** + * Constructs the formatter. + * @param writer writer that will be used as output + * @param width output text width (usually console width) + */ + public PresentationFormatter(Writer writer, int width) { + if (width < MIN_WIDTH) { + throw new IllegalArgumentException("Width is: " + width + + " and must be at least: " + MIN_WIDTH); + } + this.writer = new PrintWriter(writer, true); + this.width = width; + this.maxLength = (this.width - 3) / 2; + this.emptyString = buildString(' ', maxLength); + } + + /** + * Constructs the formatter with width equal to {@link #DEFAULT_WIDTH}}. + * @param writer writer that will be used as output + */ + public PresentationFormatter(Writer writer) { + this(writer, DEFAULT_WIDTH); + } + + /** + * Formats the alignment list using configured writer. The output + * is stored in two columns. Total width of both columns including frames + * is defined in constructor. + * @see #PresentationFormatter(Writer, int) + * + * @param alignmentList input alignment list + */ + public void format(List alignmentList) { + int index = 0; + for (Alignment alignment : alignmentList) { + List sourceList = + splitStringList(alignment.getSourceSegmentList(), maxLength); + List targetList = + splitStringList(alignment.getTargetSegmentList(), maxLength); + Iterator sourceIterator = sourceList.iterator(); + Iterator targetIterator = targetList.iterator(); + while(sourceIterator.hasNext() && targetIterator.hasNext()) { + String string = formatString(sourceIterator.next(), + targetIterator.next(), maxLength); + writer.println(string); + } + while(sourceIterator.hasNext()) { + String string = formatString(sourceIterator.next(), emptyString, + maxLength); + writer.println(string); + } + while(targetIterator.hasNext()) { + String string = formatString(emptyString, targetIterator.next(), + maxLength); + writer.println(string); + } + if (index < alignmentList.size() - 1) { + writer.print(buildString('_', maxLength + 1)); + writer.print('|'); + writer.println(buildString('_', maxLength + 1)); + } + ++index; + } + } + + private List splitStringList(List stringList, + int maxLength) { + List splitStringList = new ArrayList(); + int index = 0; + for (String string : stringList) { + splitStringList.addAll(splitString(string, maxLength)); + if (index < stringList.size() - 1) { + splitStringList.add(emptyString); + } + ++index; + } + return splitStringList; + } + + private List splitString(String string, int maxLength) { + List stringList = new ArrayList(); + StringBuilder builder = new StringBuilder(); + for (int position = 0; position < string.length(); ++position) { + char ch = string.charAt(position); + if (ch == '\n') { + int eolWidth = maxLength - builder.length(); + builder.append(buildString(' ', eolWidth)); + } else if (ch == '\t') { + int tabWidth = min(4, maxLength - builder.length()); + builder.append(buildString(' ', tabWidth)); + } else { + builder.append(ch); + } + if (builder.length() >= maxLength) { + String line = builder.substring(0, maxLength); + stringList.add(line); + builder.delete(0, maxLength); + } + } + if (builder.length() > 0) { + builder.append(buildString(' ', maxLength - builder.length())); + stringList.add(builder.toString()); + } + return stringList; + } + + private String formatString(String sourceString, String targetString, + int maxLength) { + return sourceString + " | " + targetString; + } + + private String buildString(char character, int length) { + StringBuilder builder = new StringBuilder(); + builder.setLength(length); + for (int i = 0; i < length; ++i) { + builder.setCharAt(i, character); + } + return builder.toString(); + } + + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/PresentationFormatterTest.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/PresentationFormatterTest.java.svn-base new file mode 100644 index 0000000..f1740ee --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/PresentationFormatterTest.java.svn-base @@ -0,0 +1,60 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.createAlignmentList; +import static org.junit.Assert.assertEquals; + +import java.io.StringWriter; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link PresentationFormatter} test. + * + * @author loomchild + */ +public class PresentationFormatterTest { + + public static final String LINE_SEPARATOR = + System.getProperty("line.separator"); + + public static final String EXPECTED = + "Ala ma kota kot ma | Wasserreservoir, Was" + LINE_SEPARATOR + + "ale nie wie. | serreservoir... " + LINE_SEPARATOR + + "Drugie. | " + LINE_SEPARATOR + + " | " + LINE_SEPARATOR + + "Burza mózgów zawsze | " + LINE_SEPARATOR + + "dobrze robi. | " + LINE_SEPARATOR + + "_____________________|_____________________" + LINE_SEPARATOR + + "_____________________|_____________________" + LINE_SEPARATOR + + " | Immer nur Wasser " + LINE_SEPARATOR; + + /** + * Tests if formatting empty text returns empty output. + */ + @Test + public void formatEmpty() { + StringWriter writer = new StringWriter(); + Formatter formatter = new PresentationFormatter(writer, 9); + List alignmentList = Collections.emptyList(); + formatter.format(alignmentList); + assertEquals("", writer.toString()); + } + + /** + * Tests if the output is the same as {@link #EXPECTED}. + */ + @Test + public void format() { + List alignmentList = createAlignmentList( + AlFormatterTest.SOURCE_ARRAY, AlFormatterTest.TARGET_ARRAY); + StringWriter writer = new StringWriter(); + Formatter formatter = new PresentationFormatter(writer, 43); + formatter.format(alignmentList); + assertEquals(EXPECTED + " ", writer.toString() + " "); + } + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/TmxFormatter.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/TmxFormatter.java.svn-base new file mode 100644 index 0000000..7bbf48e --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/TmxFormatter.java.svn-base @@ -0,0 +1,100 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.merge; + +import java.io.Writer; +import java.util.Date; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.bind.TmxMarshallerUnmarshaller; +import net.sourceforge.align.util.bind.tmx.Body; +import net.sourceforge.align.util.bind.tmx.Header; +import net.sourceforge.align.util.bind.tmx.Seg; +import net.sourceforge.align.util.bind.tmx.Tmx; +import net.sourceforge.align.util.bind.tmx.Tu; +import net.sourceforge.align.util.bind.tmx.Tuv; +import net.sourceforge.align.util.date.DateParser; + + +/** + * Represents a formatter that produces TMX file output. + * + * The output will be stored in {@link #TMX_VERSION} of TMX standard. + * Each alignment is represented by translation unit with properly set + * source and target languages. All source / target segments inside alignments + * are merged and space is inserted between them. + * + * @see TMX Standard + * + * @author Jarek Lipski (loomchild) + */ +public class TmxFormatter implements Formatter { + + public static final String TMX_VERSION = "1.4b"; + + public static final String TMX_ADMINLANG = "en"; + + public static final String TMX_CREATIONTOOL = "mALIGNa"; + + public static final String TMX_CREATIONTOOLVERSION = "2"; + + public static final String TMX_SEGTYPE = "block"; + + public static final String TMX_DATATYPE = "plaintext"; + + public static final String TMX_OTMF = "al"; + + private String sourceLanguageCode; + + private String targetLanguageCode; + + private Writer writer; + + public TmxFormatter(Writer writer, String sourceLanguageCode, + String targetLanguageCode) { + this.writer = writer; + this.sourceLanguageCode = sourceLanguageCode; + this.targetLanguageCode = targetLanguageCode; + } + + public void format(List alignmentList) { + Tmx tmx = new Tmx(); + tmx.setVersion(TMX_VERSION); + Header header = new Header(); + header.setAdminlang(TMX_ADMINLANG); + header.setSrclang(sourceLanguageCode); + header.setCreationtool(TMX_CREATIONTOOL); + header.setCreationtoolversion(TMX_CREATIONTOOLVERSION); + header.setSegtype(TMX_SEGTYPE); + header.setDatatype(TMX_DATATYPE); + header.setOTmf(TMX_OTMF); + header.setCreationdate(DateParser.getIsoDateNoMillis(new Date())); + tmx.setHeader(header); + Body body = new Body(); + for (Alignment alignment : alignmentList) { + Tu tu = new Tu(); + createTuv(tu, sourceLanguageCode, alignment.getSourceSegmentList()); + createTuv(tu, targetLanguageCode, alignment.getTargetSegmentList()); + if (tu.getTuv().size() > 0) { + body.getTu().add(tu); + } + } + tmx.setBody(body); + TmxMarshallerUnmarshaller.getInstance().marshal(tmx, writer); + } + + private void createTuv(Tu tu, String languageCode, + List segmentList) { + if (segmentList.size() > 0) { + Tuv tuv = new Tuv(); + tuv.setLang(languageCode); + Seg seg = new Seg(); + String segment = merge(segmentList); + seg.getContent().add(segment); + tuv.setSeg(seg); + tu.getTuv().add(tuv); + } + } + +} diff --git a/src/net/sourceforge/align/formatter/.svn/text-base/TmxFormatterTest.java.svn-base b/src/net/sourceforge/align/formatter/.svn/text-base/TmxFormatterTest.java.svn-base new file mode 100644 index 0000000..eec698a --- /dev/null +++ b/src/net/sourceforge/align/formatter/.svn/text-base/TmxFormatterTest.java.svn-base @@ -0,0 +1,58 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.parser.TmxParser; + +import org.junit.Test; + +/** + * Represents {@link TmxFormatter} class test. + * + * @author loomchild + */ +public class TmxFormatterTest { + + public static final String SOURCE_LANGUAGE = "pl"; + + public static final String TARGET_LANGUAGE = "de"; + + public static final String[][] EXPECTED_SOURCE_ARRAY = new String[][]{ + new String[]{"Ala ma kota kot ma\tale nie wie.\nDrugie.Burza mózgów zawsze " + + "dobrze robi."}, + new String[]{}, + }; + + public static final String[][] EXPECTED_TARGET_ARRAY = new String[][]{ + new String[]{"Wasserreservoir, Wasserreservoir..."}, + new String[]{"Immer nur Wasser"}, + }; + + /** + * Tests whether alignment formatted by {@link TmxFormatter} can be + * successfully parsed by {@link TmxParser}. + */ + @Test + public void testFormatParse() { + List alignmentList = createAlignmentList( + AlFormatterTest.SOURCE_ARRAY, AlFormatterTest.TARGET_ARRAY); + StringWriter writer = new StringWriter(); + Formatter formatter = new TmxFormatter(writer, SOURCE_LANGUAGE, + TARGET_LANGUAGE); + formatter.format(alignmentList); + Reader reader = new StringReader(writer.toString()); + TmxParser parser = new TmxParser(reader, SOURCE_LANGUAGE, + TARGET_LANGUAGE); + List resultAlignmentList = parser.parse(); + assertAlignmentListEquals(EXPECTED_SOURCE_ARRAY, EXPECTED_TARGET_ARRAY, + resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/formatter/AlFormatter.java b/src/net/sourceforge/align/formatter/AlFormatter.java new file mode 100755 index 0000000..b168a91 --- /dev/null +++ b/src/net/sourceforge/align/formatter/AlFormatter.java @@ -0,0 +1,56 @@ +package net.sourceforge.align.formatter; + +import java.io.Writer; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.bind.AlMarshallerUnmarshaller; +import net.sourceforge.align.util.bind.al.Alignmentlist; +import net.sourceforge.align.util.bind.al.Segmentlist; + +/** + * Represents formatter to native .AL format. + * + * This format preserves all information about alignments including scores. + * Alignments are stored using a writer defined in constructor. + * + * @author Jarek Lipski (loomchild) + */ +public class AlFormatter implements Formatter { + + private Writer writer; + + /** + * Creates formatter. + * @param writer writer to which the output will be dumped. + */ + public AlFormatter(Writer writer) { + this.writer = writer; + } + + /** + * Formats alignments to a writer preserving all parameters. + */ + public void format(List alignmentList) { + Alignmentlist al = new Alignmentlist(); + for (Alignment alignment : alignmentList) { + net.sourceforge.align.util.bind.al.Alignment a = new net.sourceforge.align.util.bind.al.Alignment(); + a.setScore((double)alignment.getScore()); + a.setSourcelist(createSegmentList( + alignment.getSourceSegmentList())); + a.setTargetlist(createSegmentList( + alignment.getTargetSegmentList())); + al.getAlignment().add(a); + } + AlMarshallerUnmarshaller.getInstance().marshal(al, writer); + } + + private Segmentlist createSegmentList(List segmentList) { + Segmentlist sl = new Segmentlist(); + for (String segment : segmentList) { + sl.getSegment().add(segment); + } + return sl; + } + +} diff --git a/src/net/sourceforge/align/formatter/AlFormatterTest.java b/src/net/sourceforge/align/formatter/AlFormatterTest.java new file mode 100755 index 0000000..0b0d940 --- /dev/null +++ b/src/net/sourceforge/align/formatter/AlFormatterTest.java @@ -0,0 +1,53 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.parser.AlParser; + +import org.junit.Test; + +/** + * Represents {@link AlFormatter} unit test. + * @author loomchild + */ +public class AlFormatterTest { + + public static final String[][] SOURCE_ARRAY = new String[][]{ + new String[]{"Ala ma kota kot ma\tale nie wie.\nDrugie.", + "Burza mózgów zawsze dobrze robi."}, + new String[]{}, + new String[]{}, + }; + + public static final String[][] TARGET_ARRAY = new String[][]{ + new String[]{"Wasserreservoir, Wasserreservoir..."}, + new String[]{}, + new String[]{"Immer nur Wasser"}, + }; + + /** + * Tests whether alignment formatted by {@link AlFormatter} can be + * successfully parsed by {@link AlParser}. + */ + @Test + public void testFormatParse() { + List alignmentList = createAlignmentList(SOURCE_ARRAY, + TARGET_ARRAY); + StringWriter writer = new StringWriter(); + Formatter formatter = new AlFormatter(writer); + formatter.format(alignmentList); + Reader reader = new StringReader(writer.toString()); + AlParser parser = new AlParser(reader); + List resultAlignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_ARRAY, TARGET_ARRAY, + resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/formatter/Formatter.java b/src/net/sourceforge/align/formatter/Formatter.java new file mode 100755 index 0000000..9fd9b9d --- /dev/null +++ b/src/net/sourceforge/align/formatter/Formatter.java @@ -0,0 +1,25 @@ +package net.sourceforge.align.formatter; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + + +/** + * Represents a alignment list formatter / writer. + * Responsible for writing alignment list in specific format. + * The output location (file, set of files) are defined in individual subclasses + * and should be configured in class constructor. + * + * @author Jarek Lipski (loomchild) + */ +public interface Formatter { + + /** + * Formats alignment list to previously defined location depending + * on concrete implementation. + * @param alignmentList alignment list + */ + public void format(List alignmentList); + +} diff --git a/src/net/sourceforge/align/formatter/FormatterTestSuite.java b/src/net/sourceforge/align/formatter/FormatterTestSuite.java new file mode 100755 index 0000000..57a3de6 --- /dev/null +++ b/src/net/sourceforge/align/formatter/FormatterTestSuite.java @@ -0,0 +1,17 @@ +package net.sourceforge.align.formatter; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Test suite including all formatter tests in this package and subpackages. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlFormatterTest.class, PresentationFormatterTest.class, + TmxFormatterTest.class +}) +public class FormatterTestSuite { + +} diff --git a/src/net/sourceforge/align/formatter/HtmlFormatter.java b/src/net/sourceforge/align/formatter/HtmlFormatter.java new file mode 100755 index 0000000..f5f6cfb --- /dev/null +++ b/src/net/sourceforge/align/formatter/HtmlFormatter.java @@ -0,0 +1,62 @@ +package net.sourceforge.align.formatter; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents HTML formatter that produces human-readable output. + * + * The output is stored using configured writer in two columns of HTML table. + * + * @author loomchild + */ +public class HtmlFormatter implements Formatter { + + private PrintWriter writer; + + /** + * Constructs a formatter + * @param writer writer that will be used as output + */ + public HtmlFormatter(Writer writer) { + this.writer = new PrintWriter(writer, true); + } + + /** + * Formats the alignment into full HTML page containing a table with + * two columns representing source and target texts. + * + * @param alignmentList input alignment list + */ + public void format(List alignmentList) { + writer.println(""); + + writer.println(""); + writer.println(""); + writer.println(""); + + writer.println(""); + writer.println(""); + for (Alignment alignment : alignmentList) { + writer.println(""); + formatStrings(alignment.getSourceSegmentList()); + formatStrings(alignment.getTargetSegmentList()); + writer.println(""); + } + writer.println("
"); + writer.println(""); + writer.println(""); + } + + private void formatStrings(List stringList) { + writer.println(""); + for (String string : stringList) { + writer.println("

" + string + "

"); + } + writer.println(""); + } + +} diff --git a/src/net/sourceforge/align/formatter/InfoFormatter.java b/src/net/sourceforge/align/formatter/InfoFormatter.java new file mode 100755 index 0000000..d58de8c --- /dev/null +++ b/src/net/sourceforge/align/formatter/InfoFormatter.java @@ -0,0 +1,124 @@ +package net.sourceforge.align.formatter; + +import java.io.PrintWriter; +import java.io.Serializable; +import java.io.Writer; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; + +/** + * Represents formatter displaying info and statistics of the whole alignment. + * Stores the result using {@link Writer} defined in constructor. + * + * The statistics include total number of alignments and number of alignments + * per category. + * + * @author Jarek Lipski (loomchild) + */ +public class InfoFormatter implements Formatter { + + private PrintWriter writer; + + /** + * Creates formatter. + * @param writer writer which will be used to store or display the info. + */ + public InfoFormatter(Writer writer) { + this.writer = new PrintWriter(writer); + } + + /** + * Formats the result using configured writer. + */ + public void format(List alignmentList) { + int alignmentCount = alignmentList.size(); + + Map categoryMap = + new TreeMap(new CategoryComparator()); + for (Alignment alignment : alignmentList) { + Category category = alignment.getCategory(); + Integer occurenceCount = categoryMap.get(category); + if (occurenceCount == null) { + occurenceCount = 1; + } else { + ++occurenceCount; + } + categoryMap.put(category, occurenceCount); + } + + for (Map.Entry entry : categoryMap.entrySet()) { + writer.println(entry.getKey().toString() + "\t" + entry.getValue()); + } + writer.println("Total\t" + alignmentCount); + writer.flush(); + } + + /** + * Orders categories in the following ascending order. Example: + * (0-1), (1-0), (1-1), (1-2), (2-1), (2-2), ... + * + * TODO: write test for this class cause there was a problem before + * that (0-1) and (1-0) were equal so the order was undetermined. + * + * @author loomchild + */ + private static class CategoryComparator + implements Comparator, Serializable { + + private static final long serialVersionUID = 2369430623799175503L; + + /** + * Returns negative [positive] number if minimum number of segments + * in left category is lesser [greater] than minimum number of segments + * in right category. + * + * If the numbers are equal then returns negative [positive] number + * if maximum number of segments in left category is lesser [greater] + * than maximum numbers in right category. + * + * If the numbers are still equal then returns negative [positive] + * number if number of source segments in left category is lesser + * [greater] than number of source segments in right category. + */ + public int compare(Category leftCategory, Category rightCategory) { + int result = getMinimumSegmentCount(leftCategory) - + getMinimumSegmentCount(rightCategory); + if (result == 0) { + result = getMaximumSegmentCount(leftCategory) - + getMaximumSegmentCount(rightCategory); + if (result == 0) { + result = leftCategory.getSourceSegmentCount() + - rightCategory.getSourceSegmentCount(); + } + } + return result; + } + + /** + * Returns minimum count of source and target segments in a category. + * @param category + * @return + */ + private int getMinimumSegmentCount(Category category) { + return Math.min(category.getSourceSegmentCount(), + category.getTargetSegmentCount()); + } + + /** + * Returns maximum count of source and target segments in a category. + * @param category + * @return + */ + private int getMaximumSegmentCount(Category category) { + return Math.max(category.getSourceSegmentCount(), + category.getTargetSegmentCount()); + } + + } + +} diff --git a/src/net/sourceforge/align/formatter/PlaintextFormatter.java b/src/net/sourceforge/align/formatter/PlaintextFormatter.java new file mode 100755 index 0000000..3cab6a8 --- /dev/null +++ b/src/net/sourceforge/align/formatter/PlaintextFormatter.java @@ -0,0 +1,61 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.merge; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents a formatter writing to separate source and target plaintext files. + * + * In each line of each file all all given alignment segments are written. + * Subsequent lines in source and target files correspond to each other, number + * of lines is equal in files. If alignment consists of more than one segment, + * they are merged and space is inserted between them. + * + * @author loomchild + */ +public class PlaintextFormatter implements Formatter { + + private PrintWriter sourceWriter; + + private PrintWriter targetWriter; + + /** + * Creates formatter. + * @param sourceWriter source file writer + * @param targetWriter target file writer + */ + public PlaintextFormatter(Writer sourceWriter, Writer targetWriter) { + this.sourceWriter = new PrintWriter(sourceWriter, true); + this.targetWriter = new PrintWriter(targetWriter, true); + } + + /** + * Formats alignment using defined source and target writer. + * @param alignmentList input alignment list + */ + public void format(List alignmentList) { + for (Alignment alignment : alignmentList) { + printSegmentList(sourceWriter, alignment.getSourceSegmentList()); + printSegmentList(targetWriter, alignment.getTargetSegmentList()); + } + } + + /** + * Merges segments and replaces end-of-line characters with spaces to make + * sure resulting files have the same number of lines. + * @param writer + * @param segmentList + */ + private void printSegmentList(PrintWriter writer, + List segmentList) { + String segment = merge(segmentList); + segment = segment.replace("\n", " "); + writer.println(segment); + } + +} diff --git a/src/net/sourceforge/align/formatter/PresentationFormatter.java b/src/net/sourceforge/align/formatter/PresentationFormatter.java new file mode 100755 index 0000000..ec324d9 --- /dev/null +++ b/src/net/sourceforge/align/formatter/PresentationFormatter.java @@ -0,0 +1,156 @@ +package net.sourceforge.align.formatter; + +import static java.lang.Math.min; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents a plaintext formatter that produces human-readable output. + * + * The output is stored using configured writer in two columns + * representing source and target texts. + * + * @author loomchild + */ +public class PresentationFormatter implements Formatter { + + public static final int DEFAULT_WIDTH = 79; + + public static final int MIN_WIDTH = 5; + + private PrintWriter writer; + + private int width; + + private int maxLength; + + private String emptyString; + + /** + * Constructs the formatter. + * @param writer writer that will be used as output + * @param width output text width (usually console width) + */ + public PresentationFormatter(Writer writer, int width) { + if (width < MIN_WIDTH) { + throw new IllegalArgumentException("Width is: " + width + + " and must be at least: " + MIN_WIDTH); + } + this.writer = new PrintWriter(writer, true); + this.width = width; + this.maxLength = (this.width - 3) / 2; + this.emptyString = buildString(' ', maxLength); + } + + /** + * Constructs the formatter with width equal to {@link #DEFAULT_WIDTH}}. + * @param writer writer that will be used as output + */ + public PresentationFormatter(Writer writer) { + this(writer, DEFAULT_WIDTH); + } + + /** + * Formats the alignment list using configured writer. The output + * is stored in two columns. Total width of both columns including frames + * is defined in constructor. + * @see #PresentationFormatter(Writer, int) + * + * @param alignmentList input alignment list + */ + public void format(List alignmentList) { + int index = 0; + for (Alignment alignment : alignmentList) { + List sourceList = + splitStringList(alignment.getSourceSegmentList(), maxLength); + List targetList = + splitStringList(alignment.getTargetSegmentList(), maxLength); + Iterator sourceIterator = sourceList.iterator(); + Iterator targetIterator = targetList.iterator(); + while(sourceIterator.hasNext() && targetIterator.hasNext()) { + String string = formatString(sourceIterator.next(), + targetIterator.next(), maxLength); + writer.println(string); + } + while(sourceIterator.hasNext()) { + String string = formatString(sourceIterator.next(), emptyString, + maxLength); + writer.println(string); + } + while(targetIterator.hasNext()) { + String string = formatString(emptyString, targetIterator.next(), + maxLength); + writer.println(string); + } + if (index < alignmentList.size() - 1) { + writer.print(buildString('_', maxLength + 1)); + writer.print('|'); + writer.println(buildString('_', maxLength + 1)); + } + ++index; + } + } + + private List splitStringList(List stringList, + int maxLength) { + List splitStringList = new ArrayList(); + int index = 0; + for (String string : stringList) { + splitStringList.addAll(splitString(string, maxLength)); + if (index < stringList.size() - 1) { + splitStringList.add(emptyString); + } + ++index; + } + return splitStringList; + } + + private List splitString(String string, int maxLength) { + List stringList = new ArrayList(); + StringBuilder builder = new StringBuilder(); + for (int position = 0; position < string.length(); ++position) { + char ch = string.charAt(position); + if (ch == '\n') { + int eolWidth = maxLength - builder.length(); + builder.append(buildString(' ', eolWidth)); + } else if (ch == '\t') { + int tabWidth = min(4, maxLength - builder.length()); + builder.append(buildString(' ', tabWidth)); + } else { + builder.append(ch); + } + if (builder.length() >= maxLength) { + String line = builder.substring(0, maxLength); + stringList.add(line); + builder.delete(0, maxLength); + } + } + if (builder.length() > 0) { + builder.append(buildString(' ', maxLength - builder.length())); + stringList.add(builder.toString()); + } + return stringList; + } + + private String formatString(String sourceString, String targetString, + int maxLength) { + return sourceString + " | " + targetString; + } + + private String buildString(char character, int length) { + StringBuilder builder = new StringBuilder(); + builder.setLength(length); + for (int i = 0; i < length; ++i) { + builder.setCharAt(i, character); + } + return builder.toString(); + } + + +} diff --git a/src/net/sourceforge/align/formatter/PresentationFormatterTest.java b/src/net/sourceforge/align/formatter/PresentationFormatterTest.java new file mode 100755 index 0000000..f1740ee --- /dev/null +++ b/src/net/sourceforge/align/formatter/PresentationFormatterTest.java @@ -0,0 +1,60 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.createAlignmentList; +import static org.junit.Assert.assertEquals; + +import java.io.StringWriter; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link PresentationFormatter} test. + * + * @author loomchild + */ +public class PresentationFormatterTest { + + public static final String LINE_SEPARATOR = + System.getProperty("line.separator"); + + public static final String EXPECTED = + "Ala ma kota kot ma | Wasserreservoir, Was" + LINE_SEPARATOR + + "ale nie wie. | serreservoir... " + LINE_SEPARATOR + + "Drugie. | " + LINE_SEPARATOR + + " | " + LINE_SEPARATOR + + "Burza mózgów zawsze | " + LINE_SEPARATOR + + "dobrze robi. | " + LINE_SEPARATOR + + "_____________________|_____________________" + LINE_SEPARATOR + + "_____________________|_____________________" + LINE_SEPARATOR + + " | Immer nur Wasser " + LINE_SEPARATOR; + + /** + * Tests if formatting empty text returns empty output. + */ + @Test + public void formatEmpty() { + StringWriter writer = new StringWriter(); + Formatter formatter = new PresentationFormatter(writer, 9); + List alignmentList = Collections.emptyList(); + formatter.format(alignmentList); + assertEquals("", writer.toString()); + } + + /** + * Tests if the output is the same as {@link #EXPECTED}. + */ + @Test + public void format() { + List alignmentList = createAlignmentList( + AlFormatterTest.SOURCE_ARRAY, AlFormatterTest.TARGET_ARRAY); + StringWriter writer = new StringWriter(); + Formatter formatter = new PresentationFormatter(writer, 43); + formatter.format(alignmentList); + assertEquals(EXPECTED + " ", writer.toString() + " "); + } + +} diff --git a/src/net/sourceforge/align/formatter/TmxFormatter.java b/src/net/sourceforge/align/formatter/TmxFormatter.java new file mode 100755 index 0000000..7bbf48e --- /dev/null +++ b/src/net/sourceforge/align/formatter/TmxFormatter.java @@ -0,0 +1,100 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.merge; + +import java.io.Writer; +import java.util.Date; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.bind.TmxMarshallerUnmarshaller; +import net.sourceforge.align.util.bind.tmx.Body; +import net.sourceforge.align.util.bind.tmx.Header; +import net.sourceforge.align.util.bind.tmx.Seg; +import net.sourceforge.align.util.bind.tmx.Tmx; +import net.sourceforge.align.util.bind.tmx.Tu; +import net.sourceforge.align.util.bind.tmx.Tuv; +import net.sourceforge.align.util.date.DateParser; + + +/** + * Represents a formatter that produces TMX file output. + * + * The output will be stored in {@link #TMX_VERSION} of TMX standard. + * Each alignment is represented by translation unit with properly set + * source and target languages. All source / target segments inside alignments + * are merged and space is inserted between them. + * + * @see TMX Standard + * + * @author Jarek Lipski (loomchild) + */ +public class TmxFormatter implements Formatter { + + public static final String TMX_VERSION = "1.4b"; + + public static final String TMX_ADMINLANG = "en"; + + public static final String TMX_CREATIONTOOL = "mALIGNa"; + + public static final String TMX_CREATIONTOOLVERSION = "2"; + + public static final String TMX_SEGTYPE = "block"; + + public static final String TMX_DATATYPE = "plaintext"; + + public static final String TMX_OTMF = "al"; + + private String sourceLanguageCode; + + private String targetLanguageCode; + + private Writer writer; + + public TmxFormatter(Writer writer, String sourceLanguageCode, + String targetLanguageCode) { + this.writer = writer; + this.sourceLanguageCode = sourceLanguageCode; + this.targetLanguageCode = targetLanguageCode; + } + + public void format(List alignmentList) { + Tmx tmx = new Tmx(); + tmx.setVersion(TMX_VERSION); + Header header = new Header(); + header.setAdminlang(TMX_ADMINLANG); + header.setSrclang(sourceLanguageCode); + header.setCreationtool(TMX_CREATIONTOOL); + header.setCreationtoolversion(TMX_CREATIONTOOLVERSION); + header.setSegtype(TMX_SEGTYPE); + header.setDatatype(TMX_DATATYPE); + header.setOTmf(TMX_OTMF); + header.setCreationdate(DateParser.getIsoDateNoMillis(new Date())); + tmx.setHeader(header); + Body body = new Body(); + for (Alignment alignment : alignmentList) { + Tu tu = new Tu(); + createTuv(tu, sourceLanguageCode, alignment.getSourceSegmentList()); + createTuv(tu, targetLanguageCode, alignment.getTargetSegmentList()); + if (tu.getTuv().size() > 0) { + body.getTu().add(tu); + } + } + tmx.setBody(body); + TmxMarshallerUnmarshaller.getInstance().marshal(tmx, writer); + } + + private void createTuv(Tu tu, String languageCode, + List segmentList) { + if (segmentList.size() > 0) { + Tuv tuv = new Tuv(); + tuv.setLang(languageCode); + Seg seg = new Seg(); + String segment = merge(segmentList); + seg.getContent().add(segment); + tuv.setSeg(seg); + tu.getTuv().add(tuv); + } + } + +} diff --git a/src/net/sourceforge/align/formatter/TmxFormatterTest.java b/src/net/sourceforge/align/formatter/TmxFormatterTest.java new file mode 100755 index 0000000..eec698a --- /dev/null +++ b/src/net/sourceforge/align/formatter/TmxFormatterTest.java @@ -0,0 +1,58 @@ +package net.sourceforge.align.formatter; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; + +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.parser.TmxParser; + +import org.junit.Test; + +/** + * Represents {@link TmxFormatter} class test. + * + * @author loomchild + */ +public class TmxFormatterTest { + + public static final String SOURCE_LANGUAGE = "pl"; + + public static final String TARGET_LANGUAGE = "de"; + + public static final String[][] EXPECTED_SOURCE_ARRAY = new String[][]{ + new String[]{"Ala ma kota kot ma\tale nie wie.\nDrugie.Burza mózgów zawsze " + + "dobrze robi."}, + new String[]{}, + }; + + public static final String[][] EXPECTED_TARGET_ARRAY = new String[][]{ + new String[]{"Wasserreservoir, Wasserreservoir..."}, + new String[]{"Immer nur Wasser"}, + }; + + /** + * Tests whether alignment formatted by {@link TmxFormatter} can be + * successfully parsed by {@link TmxParser}. + */ + @Test + public void testFormatParse() { + List alignmentList = createAlignmentList( + AlFormatterTest.SOURCE_ARRAY, AlFormatterTest.TARGET_ARRAY); + StringWriter writer = new StringWriter(); + Formatter formatter = new TmxFormatter(writer, SOURCE_LANGUAGE, + TARGET_LANGUAGE); + formatter.format(alignmentList); + Reader reader = new StringReader(writer.toString()); + TmxParser parser = new TmxParser(reader, SOURCE_LANGUAGE, + TARGET_LANGUAGE); + List resultAlignmentList = parser.parse(); + assertAlignmentListEquals(EXPECTED_SOURCE_ARRAY, EXPECTED_TARGET_ARRAY, + resultAlignmentList); + } + +} diff --git a/src/net/sourceforge/align/matrix/.svn/all-wcprops b/src/net/sourceforge/align/matrix/.svn/all-wcprops new file mode 100644 index 0000000..38217e5 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/all-wcprops @@ -0,0 +1,65 @@ +K 25 +svn:wc:ra_dav:version-url +V 73 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/matrix +END +FullMatrixFactory.java +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/matrix/FullMatrixFactory.java +END +FullMatrixIterator.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/matrix/FullMatrixIterator.java +END +BandMatrixFactory.java +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/matrix/BandMatrixFactory.java +END +BandMatrixIterator.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/matrix/BandMatrixIterator.java +END +Matrix.java +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/align/!svn/ver/56/trunk/maligna/src/net/sourceforge/align/matrix/Matrix.java +END +PositionOutsideBandException.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/matrix/PositionOutsideBandException.java +END +FullMatrix.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/56/trunk/maligna/src/net/sourceforge/align/matrix/FullMatrix.java +END +BandMatrix.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/56/trunk/maligna/src/net/sourceforge/align/matrix/BandMatrix.java +END +MatrixFactory.java +K 25 +svn:wc:ra_dav:version-url +V 92 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/matrix/MatrixFactory.java +END +MatrixIterator.java +K 25 +svn:wc:ra_dav:version-url +V 93 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/matrix/MatrixIterator.java +END diff --git a/src/net/sourceforge/align/matrix/.svn/entries b/src/net/sourceforge/align/matrix/.svn/entries new file mode 100644 index 0000000..c1e640a --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/entries @@ -0,0 +1,368 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/matrix +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +FullMatrixFactory.java +file + + + + +2010-10-21T07:22:41.000000Z +a96eefc24d637fc7bf5a9065abeca168 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +340 + +BandMatrixFactory.java +file + + + + +2010-10-21T07:29:52.000000Z +a71cac7f628870c522fd66cbb465e4fb +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +781 + +FullMatrixIterator.java +file + + + + +2010-10-21T07:20:26.000000Z +12384ea4e7a8707c7b561bd896ba24b4 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1119 + +BandMatrixIterator.java +file + + + + +2010-10-21T07:55:12.000000Z +edce969eb94ee42ab99584c20105e7be +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1589 + +Matrix.java +file +56 + + + +2011-09-26T11:38:32.092598Z +7edd88daf696bcef9e9e927b120b2de7 +2011-10-21T11:38:21.267762Z +56 +jarekl + + + + + + + + + + + + + + + + + + + + + +1100 + +PositionOutsideBandException.java +file + + + + +2010-10-21T07:41:44.000000Z +7fd1d7e81a4649e1bead6a0cff9534e2 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +571 + +FullMatrix.java +file +56 + + + +2011-09-26T11:39:06.113331Z +57fde0f5a07d5f8c202e1ddff16596c3 +2011-10-21T11:38:21.267762Z +56 +jarekl + + + + + + + + + + + + + + + + + + + + + +1196 + +BandMatrix.java +file +56 + + + +2011-09-26T12:03:29.077500Z +15e15fc23623962853901f84489f9291 +2011-10-21T11:38:21.267762Z +56 +jarekl + + + + + + + + + + + + + + + + + + + + + +2879 + +MatrixFactory.java +file + + + + +2010-10-20T17:17:46.000000Z +2a6a3f04d3f2a577b71b4b492ffe9f1b +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +288 + +MatrixIterator.java +file + + + + +2010-10-21T07:40:02.000000Z +06959f1157cae0f0e16ce22eb4bbe3a6 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1874 + diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrix.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrix.java.svn-base new file mode 100644 index 0000000..ab4d24f --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrix.java.svn-base @@ -0,0 +1,122 @@ +package net.sourceforge.align.matrix; + + +/** + *

Represents matrix that stores only elements within given radius around + * the diagonal.

+ * + *

This way the required memory is reduced to height * band width. + * For example: + * [X represents stored elements, 0 represents not stored elements.]

+ *
+ * XX000
+ * XXX00
+ * 0XXX0
+ * 00XXX
+ * 000XX
+ * 
+ * + *

If user tries to access element outside band then + * {@link PositionOutsideBandException} will be thrown. Matrix iterator + * ({@link BandMatrixIterator}) iterates only on the elements inside band. + * + * @author loomchild + */ +public class BandMatrix implements Matrix { + + private Object[][] dataArray; + + private int width; + + private int height; + + private int bandWidth; + + private int bandRadius; + + float widthHeightRatio; + + /** + * Creates matrix. + * @param width width of matrix (columns), >= 1 + * @param height height of matrix (rows), >= 1 + * @param bandRadius radius + */ + public BandMatrix(int width, int height, int bandRadius) { + assert bandRadius >= 1; + this.width = width; + this.height = height; + this.bandRadius = bandRadius; + this.bandWidth = bandRadius * 2 + 1; + this.dataArray = new Object[bandWidth][height]; + this.widthHeightRatio = (float)width / (float)height; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getSize() { + return bandWidth * height - + (int)(bandRadius * bandRadius * widthHeightRatio); + } + + @SuppressWarnings("unchecked") + public T get(int x, int y) { + assert x >= 0 && x < width; + assert y >= 0 && y < height; + int actualX = getActualX(x, y); + if (actualX >= 0 && actualX < bandWidth) { + return (T)dataArray[actualX][y]; + } else { + return null; + } + } + + public void set(int x, int y, T data) { + assert x >= 0 && x < width; + assert y >= 0 && y < height; + int actualX = getActualX(x, y); + if (actualX >= 0 && actualX < bandWidth) { + dataArray[actualX][y] = data; + } else { + throw new PositionOutsideBandException(x, y, width, height, + bandWidth); + } + } + + int getBandRadius() { + return bandRadius; + } + + /** + * Gets the x position on the diagonal corresponding to given y postion. + * Used by {@link BandMatrixIterator}. + * @param y y position (row number) + * @return x position (column number) of the element on the diagonal + * at given y position (row number) + */ + int getDiagonalX(int y) { + return (int)((float)y * widthHeightRatio); + } + + /** + * @param x x position (column number) + * @param y y position (row number) + * @return gets the x position of element in the storage data array + * corresponding to x, y positions in the abstract matrix + */ + private int getActualX(int x, int y) { + return x - getDiagonalX(y) + bandRadius; + } + + public MatrixIterator getIterator() { + return new BandMatrixIterator(this); + } + + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrixFactory.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrixFactory.java.svn-base new file mode 100644 index 0000000..09c2666 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrixFactory.java.svn-base @@ -0,0 +1,37 @@ +package net.sourceforge.align.matrix; + +/** + * Represents {@link BandMatrix} factory. + * Responsible for creating {@link BandMatrix} objects. + * + * @author loomchild + */ +public class BandMatrixFactory implements MatrixFactory { + + public static final int DEFAULT_BAND_RADIUS = 20; + + private int bandRadius; + + /** + * Creates band matrix factory producing matrices with given radius. + * @param bandRadius + */ + public BandMatrixFactory(int bandRadius) { + this.bandRadius = bandRadius; + } + + /** + * Creates band matrix factory producing matrices with + * {@value #DEFAULT_BAND_RADIUS}. + */ + public BandMatrixFactory() { + this(DEFAULT_BAND_RADIUS); + } + + public Matrix createMatrix(int width, int height) { + return new BandMatrix(width, height, bandRadius); + } + + + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrixIterator.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrixIterator.java.svn-base new file mode 100644 index 0000000..6407223 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/BandMatrixIterator.java.svn-base @@ -0,0 +1,86 @@ +package net.sourceforge.align.matrix; + +import java.util.NoSuchElementException; + +/** + * Represents {@link BandMatrix} iterator. + * + * @author loomchild + * @param matrix data type + */ +public class BandMatrixIterator implements MatrixIterator { + + private BandMatrix matrix; + + private int x, y, maxX, minX; + + public BandMatrixIterator(BandMatrix matrix) { + this.matrix = matrix; + beforeFirst(); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public void beforeFirst() { + x = -1; + y = 0; + calculateMinMaxX(); + } + + public boolean hasNext() { + return !((y >= matrix.getHeight() - 1) && (x >= matrix.getWidth() - 1)); + } + + public void next() { + ++x; + if (x > maxX) { + ++y; + calculateMinMaxX(); + x = minX; + if (y >= matrix.getHeight()) { + throw new NoSuchElementException(); + } + } + } + + public void afterLast() { + x = matrix.getWidth(); + y = matrix.getHeight() - 1; + calculateMinMaxX(); + } + + public boolean hasPrevious() { + return !((y <= 0) && (x <= 0)); + } + + public void previous() { + --x; + if (x < minX) { + --y; + calculateMinMaxX(); + x = maxX; + if (y < 0) { + throw new NoSuchElementException(); + } + } + } + + /** + * Calculates minimum and maximum x position (column number) at current + * y position (row number) and stores then in {@link #minX} and + * {@link #maxX}. + */ + private void calculateMinMaxX() { + int diagonalX = matrix.getDiagonalX(y); + minX = Math.max(0, diagonalX - matrix.getBandRadius()); + maxX = Math.min(matrix.getWidth() - 1, + diagonalX + matrix.getBandRadius()); + } + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrix.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrix.java.svn-base new file mode 100644 index 0000000..c19527c --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrix.java.svn-base @@ -0,0 +1,57 @@ +package net.sourceforge.align.matrix; + + +/** + * Represents a two-dimensional matrix that contains all the elements. + * This matrix use standard two-dimensional array and occupies + * row number * column number memory, + * which can be quite memory inefficient for sparse matrices. + * On the other hand element access should be fast with this matrix. + * + * @author loomchild + */ +public class FullMatrix implements Matrix { + + private Object[][] dataArray; + + private int width; + + private int height; + + /** + * Creates a matrix. + * @param width matrix width (number of columns), >= 1. + * @param height matrix height (number of rows), >= 1. + */ + public FullMatrix(int width, int height) { + this.width = width; + this.height = height; + this.dataArray = new Object[width][height]; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getSize() { + return width * height; + } + + @SuppressWarnings("unchecked") + public T get(int x, int y) { + return (T)dataArray[x][y]; + } + + public void set(int x, int y, T data) { + dataArray[x][y] = data; + } + + public MatrixIterator getIterator() { + return new FullMatrixIterator(this); + } + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrixFactory.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrixFactory.java.svn-base new file mode 100644 index 0000000..38e2e75 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrixFactory.java.svn-base @@ -0,0 +1,15 @@ +package net.sourceforge.align.matrix; + +/** + * Represents {@link FullMatrix} factory. + * Responsible for creating {@link FullMatrix} objects. + * + * @author loomchild + */ +public class FullMatrixFactory implements MatrixFactory { + + public Matrix createMatrix(int width, int height) { + return new FullMatrix(width, height); + } + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrixIterator.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrixIterator.java.svn-base new file mode 100644 index 0000000..3ecdce5 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/FullMatrixIterator.java.svn-base @@ -0,0 +1,70 @@ +package net.sourceforge.align.matrix; + +import java.util.NoSuchElementException; + +/** + * Represents {@link FullMatrix} iterator. + * + * @author loomchild + * @param matrix data type + */ +public class FullMatrixIterator implements MatrixIterator { + + private FullMatrix matrix; + + private int x, y; + + public FullMatrixIterator(FullMatrix matrix) { + this.matrix = matrix; + beforeFirst(); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public void beforeFirst() { + x = -1; + y = 0; + } + + public boolean hasNext() { + return !((y >= matrix.getHeight() - 1) && (x >= matrix.getWidth() - 1)); + } + + public void next() { + ++x; + if (x >= matrix.getWidth()) { + ++y; + x = 0; + if (y >= matrix.getHeight()) { + throw new NoSuchElementException(); + } + } + } + + public void afterLast() { + x = matrix.getWidth(); + y = matrix.getHeight() - 1; + } + + public boolean hasPrevious() { + return !((y <= 0) && (x <= 0)); + } + + public void previous() { + --x; + if (x < 0) { + --y; + x = matrix.getWidth() - 1; + if (y < 0) { + throw new NoSuchElementException(); + } + } + } + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/Matrix.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/Matrix.java.svn-base new file mode 100644 index 0000000..c2d69a5 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/Matrix.java.svn-base @@ -0,0 +1,52 @@ +package net.sourceforge.align.matrix; + + +/** + * Represents generic abstract two-dimensional matrix. + * Useful because dimensions can be big but the data is usually sparse, + * so more sophisticated implementations than normal two-dimensional array + * are desired. + * + * @author Jarek Lipski (loomchild) + */ +public interface Matrix { + + /** + * @return matrix width (number of columns) + */ + public int getWidth(); + + /** + * @return matrix height (number of rows) + */ + public int getHeight(); + + /** + * @return real matrix size (number of stored elements, <= width * height + */ + public int getSize(); + + /** + * Returns matrix element at given position. + * @param x column + * @param y row + * @return element + */ + public T get(int x, int y); + + /** + * Sets the matrix element at given position. + * @param x column + * @param y row + * @param data element + */ + public void set(int x, int y, T data); + + /** + * @see MatrixIterator + * @return matrix iterator that will iterate over whole matrix + * from top left to bottom right corner. + */ + public MatrixIterator getIterator(); + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/MatrixFactory.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/MatrixFactory.java.svn-base new file mode 100644 index 0000000..0faf436 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/MatrixFactory.java.svn-base @@ -0,0 +1,14 @@ +package net.sourceforge.align.matrix; + +/** + * Represents matrix factory. + * Enables to create a matrix of given size without knowing the actual + * matrix type. + * + * @author loomchild + */ +public interface MatrixFactory { + + public Matrix createMatrix(int width, int height); + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/MatrixIterator.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/MatrixIterator.java.svn-base new file mode 100644 index 0000000..41b8c18 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/MatrixIterator.java.svn-base @@ -0,0 +1,71 @@ +package net.sourceforge.align.matrix; + +import java.util.NoSuchElementException; + + +/** + * Represents generic matrix iterator. + * Iterates the matrix from top left to bottom right corner, increasing + * row number first, and if it reaches maximum increasing column number + * ([0,0], [1,0], ... [n,0], [0,1],...). + * Some of the elements on the matrix may be ignored if it does not + * store them, but the overall order must be preserved. + * Also enables iterating the matrix in reverse order. + * + * @author loomchild + * @param data type stored in the matrix + */ +public interface MatrixIterator { + + /** + * @return x position of the iterator (column) + */ + public int getX(); + + /** + * @return y position of the iterator (row) + */ + public int getY(); + + /** + * Resets the iterator - sets its position to before first element. + */ + public void beforeFirst(); + + /** + * @return true if iterator has next element (hasn't reached bottom + * left corner) + */ + public boolean hasNext(); + + /** + * Advances the iterator to the next element. If this is not possible + * because iterator hasn't got the next element ({@link #hasNext()} + * returns false) it throws an exception. + * + * @throws NoSuchElementException when there are no more elements + */ + public void next(); + + /** + * Sets the position to after last element - subsequent calls to + * {@link #hasNext()} will return false. + */ + public void afterLast(); + + /** + * @return true if iterator has previous element (hasn't reached top left + * corner). + */ + public boolean hasPrevious() ; + + /** + * Moves the iterator to the previous element. If this is not possible + * because iterator hasn't got the previous element ({@link #hasPrevious()} + * returns false) it throws an exception. + * + * @throws NoSuchElementException when there is not previous elements + */ + public void previous(); + +} diff --git a/src/net/sourceforge/align/matrix/.svn/text-base/PositionOutsideBandException.java.svn-base b/src/net/sourceforge/align/matrix/.svn/text-base/PositionOutsideBandException.java.svn-base new file mode 100644 index 0000000..07f2020 --- /dev/null +++ b/src/net/sourceforge/align/matrix/.svn/text-base/PositionOutsideBandException.java.svn-base @@ -0,0 +1,20 @@ +package net.sourceforge.align.matrix; + +/** + * Represents an exception when user tries to access {@link BandMatrix} + * element outside matrix band. + * @see BandMatrix + * @author loomchild + */ +public class PositionOutsideBandException extends RuntimeException { + + private static final long serialVersionUID = 4329499541774129117L; + + public PositionOutsideBandException(int x, int y, int width, int height, + int bandWidth) { + super("Position " + "(" + x + ", " + y + ") in matrix of size (" + + width + ", " + height + ") outside band of width " + bandWidth); + } + + +} diff --git a/src/net/sourceforge/align/matrix/BandMatrix.java b/src/net/sourceforge/align/matrix/BandMatrix.java new file mode 100755 index 0000000..ab4d24f --- /dev/null +++ b/src/net/sourceforge/align/matrix/BandMatrix.java @@ -0,0 +1,122 @@ +package net.sourceforge.align.matrix; + + +/** + *

Represents matrix that stores only elements within given radius around + * the diagonal.

+ * + *

This way the required memory is reduced to height * band width. + * For example: + * [X represents stored elements, 0 represents not stored elements.]

+ *
+ * XX000
+ * XXX00
+ * 0XXX0
+ * 00XXX
+ * 000XX
+ * 
+ * + *

If user tries to access element outside band then + * {@link PositionOutsideBandException} will be thrown. Matrix iterator + * ({@link BandMatrixIterator}) iterates only on the elements inside band. + * + * @author loomchild + */ +public class BandMatrix implements Matrix { + + private Object[][] dataArray; + + private int width; + + private int height; + + private int bandWidth; + + private int bandRadius; + + float widthHeightRatio; + + /** + * Creates matrix. + * @param width width of matrix (columns), >= 1 + * @param height height of matrix (rows), >= 1 + * @param bandRadius radius + */ + public BandMatrix(int width, int height, int bandRadius) { + assert bandRadius >= 1; + this.width = width; + this.height = height; + this.bandRadius = bandRadius; + this.bandWidth = bandRadius * 2 + 1; + this.dataArray = new Object[bandWidth][height]; + this.widthHeightRatio = (float)width / (float)height; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getSize() { + return bandWidth * height - + (int)(bandRadius * bandRadius * widthHeightRatio); + } + + @SuppressWarnings("unchecked") + public T get(int x, int y) { + assert x >= 0 && x < width; + assert y >= 0 && y < height; + int actualX = getActualX(x, y); + if (actualX >= 0 && actualX < bandWidth) { + return (T)dataArray[actualX][y]; + } else { + return null; + } + } + + public void set(int x, int y, T data) { + assert x >= 0 && x < width; + assert y >= 0 && y < height; + int actualX = getActualX(x, y); + if (actualX >= 0 && actualX < bandWidth) { + dataArray[actualX][y] = data; + } else { + throw new PositionOutsideBandException(x, y, width, height, + bandWidth); + } + } + + int getBandRadius() { + return bandRadius; + } + + /** + * Gets the x position on the diagonal corresponding to given y postion. + * Used by {@link BandMatrixIterator}. + * @param y y position (row number) + * @return x position (column number) of the element on the diagonal + * at given y position (row number) + */ + int getDiagonalX(int y) { + return (int)((float)y * widthHeightRatio); + } + + /** + * @param x x position (column number) + * @param y y position (row number) + * @return gets the x position of element in the storage data array + * corresponding to x, y positions in the abstract matrix + */ + private int getActualX(int x, int y) { + return x - getDiagonalX(y) + bandRadius; + } + + public MatrixIterator getIterator() { + return new BandMatrixIterator(this); + } + + +} diff --git a/src/net/sourceforge/align/matrix/BandMatrixFactory.java b/src/net/sourceforge/align/matrix/BandMatrixFactory.java new file mode 100755 index 0000000..09c2666 --- /dev/null +++ b/src/net/sourceforge/align/matrix/BandMatrixFactory.java @@ -0,0 +1,37 @@ +package net.sourceforge.align.matrix; + +/** + * Represents {@link BandMatrix} factory. + * Responsible for creating {@link BandMatrix} objects. + * + * @author loomchild + */ +public class BandMatrixFactory implements MatrixFactory { + + public static final int DEFAULT_BAND_RADIUS = 20; + + private int bandRadius; + + /** + * Creates band matrix factory producing matrices with given radius. + * @param bandRadius + */ + public BandMatrixFactory(int bandRadius) { + this.bandRadius = bandRadius; + } + + /** + * Creates band matrix factory producing matrices with + * {@value #DEFAULT_BAND_RADIUS}. + */ + public BandMatrixFactory() { + this(DEFAULT_BAND_RADIUS); + } + + public Matrix createMatrix(int width, int height) { + return new BandMatrix(width, height, bandRadius); + } + + + +} diff --git a/src/net/sourceforge/align/matrix/BandMatrixIterator.java b/src/net/sourceforge/align/matrix/BandMatrixIterator.java new file mode 100755 index 0000000..6407223 --- /dev/null +++ b/src/net/sourceforge/align/matrix/BandMatrixIterator.java @@ -0,0 +1,86 @@ +package net.sourceforge.align.matrix; + +import java.util.NoSuchElementException; + +/** + * Represents {@link BandMatrix} iterator. + * + * @author loomchild + * @param matrix data type + */ +public class BandMatrixIterator implements MatrixIterator { + + private BandMatrix matrix; + + private int x, y, maxX, minX; + + public BandMatrixIterator(BandMatrix matrix) { + this.matrix = matrix; + beforeFirst(); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public void beforeFirst() { + x = -1; + y = 0; + calculateMinMaxX(); + } + + public boolean hasNext() { + return !((y >= matrix.getHeight() - 1) && (x >= matrix.getWidth() - 1)); + } + + public void next() { + ++x; + if (x > maxX) { + ++y; + calculateMinMaxX(); + x = minX; + if (y >= matrix.getHeight()) { + throw new NoSuchElementException(); + } + } + } + + public void afterLast() { + x = matrix.getWidth(); + y = matrix.getHeight() - 1; + calculateMinMaxX(); + } + + public boolean hasPrevious() { + return !((y <= 0) && (x <= 0)); + } + + public void previous() { + --x; + if (x < minX) { + --y; + calculateMinMaxX(); + x = maxX; + if (y < 0) { + throw new NoSuchElementException(); + } + } + } + + /** + * Calculates minimum and maximum x position (column number) at current + * y position (row number) and stores then in {@link #minX} and + * {@link #maxX}. + */ + private void calculateMinMaxX() { + int diagonalX = matrix.getDiagonalX(y); + minX = Math.max(0, diagonalX - matrix.getBandRadius()); + maxX = Math.min(matrix.getWidth() - 1, + diagonalX + matrix.getBandRadius()); + } + +} diff --git a/src/net/sourceforge/align/matrix/FullMatrix.java b/src/net/sourceforge/align/matrix/FullMatrix.java new file mode 100755 index 0000000..c19527c --- /dev/null +++ b/src/net/sourceforge/align/matrix/FullMatrix.java @@ -0,0 +1,57 @@ +package net.sourceforge.align.matrix; + + +/** + * Represents a two-dimensional matrix that contains all the elements. + * This matrix use standard two-dimensional array and occupies + * row number * column number memory, + * which can be quite memory inefficient for sparse matrices. + * On the other hand element access should be fast with this matrix. + * + * @author loomchild + */ +public class FullMatrix implements Matrix { + + private Object[][] dataArray; + + private int width; + + private int height; + + /** + * Creates a matrix. + * @param width matrix width (number of columns), >= 1. + * @param height matrix height (number of rows), >= 1. + */ + public FullMatrix(int width, int height) { + this.width = width; + this.height = height; + this.dataArray = new Object[width][height]; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getSize() { + return width * height; + } + + @SuppressWarnings("unchecked") + public T get(int x, int y) { + return (T)dataArray[x][y]; + } + + public void set(int x, int y, T data) { + dataArray[x][y] = data; + } + + public MatrixIterator getIterator() { + return new FullMatrixIterator(this); + } + +} diff --git a/src/net/sourceforge/align/matrix/FullMatrixFactory.java b/src/net/sourceforge/align/matrix/FullMatrixFactory.java new file mode 100755 index 0000000..38e2e75 --- /dev/null +++ b/src/net/sourceforge/align/matrix/FullMatrixFactory.java @@ -0,0 +1,15 @@ +package net.sourceforge.align.matrix; + +/** + * Represents {@link FullMatrix} factory. + * Responsible for creating {@link FullMatrix} objects. + * + * @author loomchild + */ +public class FullMatrixFactory implements MatrixFactory { + + public Matrix createMatrix(int width, int height) { + return new FullMatrix(width, height); + } + +} diff --git a/src/net/sourceforge/align/matrix/FullMatrixIterator.java b/src/net/sourceforge/align/matrix/FullMatrixIterator.java new file mode 100755 index 0000000..3ecdce5 --- /dev/null +++ b/src/net/sourceforge/align/matrix/FullMatrixIterator.java @@ -0,0 +1,70 @@ +package net.sourceforge.align.matrix; + +import java.util.NoSuchElementException; + +/** + * Represents {@link FullMatrix} iterator. + * + * @author loomchild + * @param matrix data type + */ +public class FullMatrixIterator implements MatrixIterator { + + private FullMatrix matrix; + + private int x, y; + + public FullMatrixIterator(FullMatrix matrix) { + this.matrix = matrix; + beforeFirst(); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public void beforeFirst() { + x = -1; + y = 0; + } + + public boolean hasNext() { + return !((y >= matrix.getHeight() - 1) && (x >= matrix.getWidth() - 1)); + } + + public void next() { + ++x; + if (x >= matrix.getWidth()) { + ++y; + x = 0; + if (y >= matrix.getHeight()) { + throw new NoSuchElementException(); + } + } + } + + public void afterLast() { + x = matrix.getWidth(); + y = matrix.getHeight() - 1; + } + + public boolean hasPrevious() { + return !((y <= 0) && (x <= 0)); + } + + public void previous() { + --x; + if (x < 0) { + --y; + x = matrix.getWidth() - 1; + if (y < 0) { + throw new NoSuchElementException(); + } + } + } + +} diff --git a/src/net/sourceforge/align/matrix/Matrix.java b/src/net/sourceforge/align/matrix/Matrix.java new file mode 100755 index 0000000..c2d69a5 --- /dev/null +++ b/src/net/sourceforge/align/matrix/Matrix.java @@ -0,0 +1,52 @@ +package net.sourceforge.align.matrix; + + +/** + * Represents generic abstract two-dimensional matrix. + * Useful because dimensions can be big but the data is usually sparse, + * so more sophisticated implementations than normal two-dimensional array + * are desired. + * + * @author Jarek Lipski (loomchild) + */ +public interface Matrix { + + /** + * @return matrix width (number of columns) + */ + public int getWidth(); + + /** + * @return matrix height (number of rows) + */ + public int getHeight(); + + /** + * @return real matrix size (number of stored elements, <= width * height + */ + public int getSize(); + + /** + * Returns matrix element at given position. + * @param x column + * @param y row + * @return element + */ + public T get(int x, int y); + + /** + * Sets the matrix element at given position. + * @param x column + * @param y row + * @param data element + */ + public void set(int x, int y, T data); + + /** + * @see MatrixIterator + * @return matrix iterator that will iterate over whole matrix + * from top left to bottom right corner. + */ + public MatrixIterator getIterator(); + +} diff --git a/src/net/sourceforge/align/matrix/MatrixFactory.java b/src/net/sourceforge/align/matrix/MatrixFactory.java new file mode 100755 index 0000000..0faf436 --- /dev/null +++ b/src/net/sourceforge/align/matrix/MatrixFactory.java @@ -0,0 +1,14 @@ +package net.sourceforge.align.matrix; + +/** + * Represents matrix factory. + * Enables to create a matrix of given size without knowing the actual + * matrix type. + * + * @author loomchild + */ +public interface MatrixFactory { + + public Matrix createMatrix(int width, int height); + +} diff --git a/src/net/sourceforge/align/matrix/MatrixIterator.java b/src/net/sourceforge/align/matrix/MatrixIterator.java new file mode 100755 index 0000000..41b8c18 --- /dev/null +++ b/src/net/sourceforge/align/matrix/MatrixIterator.java @@ -0,0 +1,71 @@ +package net.sourceforge.align.matrix; + +import java.util.NoSuchElementException; + + +/** + * Represents generic matrix iterator. + * Iterates the matrix from top left to bottom right corner, increasing + * row number first, and if it reaches maximum increasing column number + * ([0,0], [1,0], ... [n,0], [0,1],...). + * Some of the elements on the matrix may be ignored if it does not + * store them, but the overall order must be preserved. + * Also enables iterating the matrix in reverse order. + * + * @author loomchild + * @param data type stored in the matrix + */ +public interface MatrixIterator { + + /** + * @return x position of the iterator (column) + */ + public int getX(); + + /** + * @return y position of the iterator (row) + */ + public int getY(); + + /** + * Resets the iterator - sets its position to before first element. + */ + public void beforeFirst(); + + /** + * @return true if iterator has next element (hasn't reached bottom + * left corner) + */ + public boolean hasNext(); + + /** + * Advances the iterator to the next element. If this is not possible + * because iterator hasn't got the next element ({@link #hasNext()} + * returns false) it throws an exception. + * + * @throws NoSuchElementException when there are no more elements + */ + public void next(); + + /** + * Sets the position to after last element - subsequent calls to + * {@link #hasNext()} will return false. + */ + public void afterLast(); + + /** + * @return true if iterator has previous element (hasn't reached top left + * corner). + */ + public boolean hasPrevious() ; + + /** + * Moves the iterator to the previous element. If this is not possible + * because iterator hasn't got the previous element ({@link #hasPrevious()} + * returns false) it throws an exception. + * + * @throws NoSuchElementException when there is not previous elements + */ + public void previous(); + +} diff --git a/src/net/sourceforge/align/matrix/PositionOutsideBandException.java b/src/net/sourceforge/align/matrix/PositionOutsideBandException.java new file mode 100755 index 0000000..07f2020 --- /dev/null +++ b/src/net/sourceforge/align/matrix/PositionOutsideBandException.java @@ -0,0 +1,20 @@ +package net.sourceforge.align.matrix; + +/** + * Represents an exception when user tries to access {@link BandMatrix} + * element outside matrix band. + * @see BandMatrix + * @author loomchild + */ +public class PositionOutsideBandException extends RuntimeException { + + private static final long serialVersionUID = 4329499541774129117L; + + public PositionOutsideBandException(int x, int y, int width, int height, + int bandWidth) { + super("Position " + "(" + x + ", " + y + ") in matrix of size (" + + width + ", " + height + ") outside band of width " + bandWidth); + } + + +} diff --git a/src/net/sourceforge/align/model/.svn/all-wcprops b/src/net/sourceforge/align/model/.svn/all-wcprops new file mode 100644 index 0000000..87571cc --- /dev/null +++ b/src/net/sourceforge/align/model/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model +END +ModelTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 92 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/ModelTestSuite.java +END +ModelParseException.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/ModelParseException.java +END +Util.java +K 25 +svn:wc:ra_dav:version-url +V 82 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/Util.java +END diff --git a/src/net/sourceforge/align/model/.svn/entries b/src/net/sourceforge/align/model/.svn/entries new file mode 100644 index 0000000..6f120a3 --- /dev/null +++ b/src/net/sourceforge/align/model/.svn/entries @@ -0,0 +1,142 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/model +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +ModelParseException.java +file + + + + +2010-11-04T18:15:41.000000Z +9055fba274c8fa011650211f8f386a80 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +428 + +ModelTestSuite.java +file + + + + +2010-11-04T18:13:27.000000Z +a2153689d458a1241cd31c78e575761e +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +616 + +Util.java +file + + + + +2010-11-04T18:18:02.000000Z +14db8d74d9397d7d858889710489a59c +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +691 + +language +dir + +length +dir + +translation +dir + +vocabulary +dir + diff --git a/src/net/sourceforge/align/model/.svn/text-base/ModelParseException.java.svn-base b/src/net/sourceforge/align/model/.svn/text-base/ModelParseException.java.svn-base new file mode 100644 index 0000000..0aa2b0e --- /dev/null +++ b/src/net/sourceforge/align/model/.svn/text-base/ModelParseException.java.svn-base @@ -0,0 +1,20 @@ +package net.sourceforge.align.model; + +/** + * Represents model or vocabulary parse exception. + * + * @author Jarek Lipski (loomchild) + */ +public class ModelParseException extends RuntimeException { + + private static final long serialVersionUID = 6105226270677843760L; + + public ModelParseException(String message) { + super(message); + } + + + public ModelParseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/net/sourceforge/align/model/.svn/text-base/ModelTestSuite.java.svn-base b/src/net/sourceforge/align/model/.svn/text-base/ModelTestSuite.java.svn-base new file mode 100644 index 0000000..e73ee43 --- /dev/null +++ b/src/net/sourceforge/align/model/.svn/text-base/ModelTestSuite.java.svn-base @@ -0,0 +1,22 @@ +package net.sourceforge.align.model; + +import net.sourceforge.align.model.language.LanguageTestSuite; +import net.sourceforge.align.model.length.LengthTestSuite; +import net.sourceforge.align.model.translation.TranslationTestSuite; +import net.sourceforge.align.model.vocabulary.VocabularyTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Unit test suite for model package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + VocabularyTestSuite.class, LengthTestSuite.class, + LanguageTestSuite.class, TranslationTestSuite.class +}) +public class ModelTestSuite { + +} diff --git a/src/net/sourceforge/align/model/.svn/text-base/Util.java.svn-base b/src/net/sourceforge/align/model/.svn/text-base/Util.java.svn-base new file mode 100644 index 0000000..57e6612 --- /dev/null +++ b/src/net/sourceforge/align/model/.svn/text-base/Util.java.svn-base @@ -0,0 +1,28 @@ +package net.sourceforge.align.model; + +import java.util.ArrayList; +import java.util.List; + +public class Util { + + /** + * Converts two dimensional integer (representing word ids) array into a + * list of lists. Used for testing purposes. + * + * @param widArray two dimensional interger array + * @return list of lists. + */ + public static List< List > createWidList(int[][] widArray) { + List< List > widList = new ArrayList< List >(); + for (int[] widArrayGroup : widArray) { + List widListGroup = new ArrayList(); + for (int wid : widArrayGroup) { + widListGroup.add(wid); + } + widList.add(widListGroup); + } + return widList; + } + + +} diff --git a/src/net/sourceforge/align/model/ModelParseException.java b/src/net/sourceforge/align/model/ModelParseException.java new file mode 100755 index 0000000..0aa2b0e --- /dev/null +++ b/src/net/sourceforge/align/model/ModelParseException.java @@ -0,0 +1,20 @@ +package net.sourceforge.align.model; + +/** + * Represents model or vocabulary parse exception. + * + * @author Jarek Lipski (loomchild) + */ +public class ModelParseException extends RuntimeException { + + private static final long serialVersionUID = 6105226270677843760L; + + public ModelParseException(String message) { + super(message); + } + + + public ModelParseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/net/sourceforge/align/model/ModelTestSuite.java b/src/net/sourceforge/align/model/ModelTestSuite.java new file mode 100755 index 0000000..e73ee43 --- /dev/null +++ b/src/net/sourceforge/align/model/ModelTestSuite.java @@ -0,0 +1,22 @@ +package net.sourceforge.align.model; + +import net.sourceforge.align.model.language.LanguageTestSuite; +import net.sourceforge.align.model.length.LengthTestSuite; +import net.sourceforge.align.model.translation.TranslationTestSuite; +import net.sourceforge.align.model.vocabulary.VocabularyTestSuite; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Unit test suite for model package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + VocabularyTestSuite.class, LengthTestSuite.class, + LanguageTestSuite.class, TranslationTestSuite.class +}) +public class ModelTestSuite { + +} diff --git a/src/net/sourceforge/align/model/Util.java b/src/net/sourceforge/align/model/Util.java new file mode 100755 index 0000000..57e6612 --- /dev/null +++ b/src/net/sourceforge/align/model/Util.java @@ -0,0 +1,28 @@ +package net.sourceforge.align.model; + +import java.util.ArrayList; +import java.util.List; + +public class Util { + + /** + * Converts two dimensional integer (representing word ids) array into a + * list of lists. Used for testing purposes. + * + * @param widArray two dimensional interger array + * @return list of lists. + */ + public static List< List > createWidList(int[][] widArray) { + List< List > widList = new ArrayList< List >(); + for (int[] widArrayGroup : widArray) { + List widListGroup = new ArrayList(); + for (int wid : widArrayGroup) { + widListGroup.add(wid); + } + widList.add(widListGroup); + } + return widList; + } + + +} diff --git a/src/net/sourceforge/align/model/language/.svn/all-wcprops b/src/net/sourceforge/align/model/language/.svn/all-wcprops new file mode 100644 index 0000000..e4e65b8 --- /dev/null +++ b/src/net/sourceforge/align/model/language/.svn/all-wcprops @@ -0,0 +1,41 @@ +K 25 +svn:wc:ra_dav:version-url +V 81 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/language +END +LanguageTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/language/LanguageTestSuite.java +END +MutableLanguageModelTest.java +K 25 +svn:wc:ra_dav:version-url +V 111 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/language/MutableLanguageModelTest.java +END +MutableLanguageModel.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/model/language/MutableLanguageModel.java +END +LanguageModelUtilTest.java +K 25 +svn:wc:ra_dav:version-url +V 108 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/language/LanguageModelUtilTest.java +END +LanguageModelUtil.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/language/LanguageModelUtil.java +END +LanguageModel.java +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/language/LanguageModel.java +END diff --git a/src/net/sourceforge/align/model/language/.svn/entries b/src/net/sourceforge/align/model/language/.svn/entries new file mode 100644 index 0000000..e3275dc --- /dev/null +++ b/src/net/sourceforge/align/model/language/.svn/entries @@ -0,0 +1,232 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/model/language +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +LanguageModel.java +file + + + + +2010-11-08T18:37:07.000000Z +1e83f75ddda6db12b43bc991b8956ab1 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1095 + +LanguageModelUtil.java +file + + + + +2010-11-08T09:51:53.000000Z +b805e29a09c96e1fdae332d844217ed9 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1972 + +LanguageModelUtilTest.java +file + + + + +2010-11-08T18:32:23.000000Z +c9d7800a52ab97696923e85a7b86596a +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1469 + +LanguageTestSuite.java +file + + + + +2010-11-06T22:30:47.000000Z +d581bf532f6d03eb1b66822304640406 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +339 + +MutableLanguageModel.java +file +53 + + + +2010-12-30T00:42:52.000000Z +2d1d357f5f6ff25c2b21b7e26f175c3e +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +2684 + +MutableLanguageModelTest.java +file + + + + +2010-11-08T09:47:18.000000Z +0320d32e42cc1ea769a740d34d79916f +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +778 + diff --git a/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModel.java.svn-base b/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModel.java.svn-base new file mode 100644 index 0000000..8bf091b --- /dev/null +++ b/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModel.java.svn-base @@ -0,0 +1,40 @@ +package net.sourceforge.align.model.language; + +import java.io.Writer; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + +/** + * Represents simple unigram language model. Responsible for storing + * word probabilities in given language. Words are represented as + * integer word IDs. + * + * @author Jarek Lipski (loomchild) + */ +public interface LanguageModel { + + /** + * Returns word occurrence probability in modeled language. + * @param wid word id + * @return word occurrence probability; <0, 1> + */ + public float getWordProbability(int wid); + + /** + * Returns probability of some word if it occurred only once in + * training corpus. Basically this number is equal to + * 1 / total word number of words in the training corpus. + * @return singleton probability + */ + public float getSingletonWordProbability(); + + /** + * Formats the language model to given writer in plaintext format. + * Used for logging purposes and for storing models. + * @param writer writer + * @param vocabulary this language vocabulary + */ + public void format(Writer writer, Vocabulary vocabulary); + +} diff --git a/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModelUtil.java.svn-base b/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModelUtil.java.svn-base new file mode 100644 index 0000000..61c8507 --- /dev/null +++ b/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModelUtil.java.svn-base @@ -0,0 +1,65 @@ +package net.sourceforge.align.model.language; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.List; + +import net.sourceforge.align.model.ModelParseException; + +/** + * Represents {@link LanguageModel} utility methods - training and parsing. + * + * @author Jarek Lipski (loomchild) + */ +public class LanguageModelUtil { + + /** + * Trains language model by adding all words from given segment list + * (training corpus) to it and after that calculating the probabilities + * by calling {@link MutableLanguageModel#normalize()}. + * @param segmentList training corpus + */ + public static LanguageModel train(List< List > segmentList) { + MutableLanguageModel model = new MutableLanguageModel(); + + for (List segment : segmentList) { + for (int wid : segment) { + model.addWordOccurence(wid); + } + } + model.normalize(); + return model; + } + + /** + * Parses language model from input stream. Uses simple plaintext format + * where each line consists of word, whitespace and probability. + * @param reader reader from which model should be read + * @return parsed language model + */ + public static LanguageModel parse(Reader reader) { + try { + BufferedReader bufferedReader = new BufferedReader(reader); + MutableLanguageModel languageModel = new MutableLanguageModel(); + String line; + while ((line = bufferedReader.readLine()) != null) { + String[] parts = line.split("\\s"); + if (parts.length == 2) { + int wid = Integer.parseInt(parts[0]); + int count = Integer.parseInt(parts[1]); + languageModel.addWordOccurence(wid, count); + } else if (parts.length != 0) { + throw new ModelParseException("Bad number of line parts."); + } + } + languageModel.normalize(); + return languageModel; + } catch (NumberFormatException e) { + throw new ModelParseException("Part format error", e); + } catch (IOException e) { + throw new ModelParseException("IO error", e); + } + } + +} diff --git a/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModelUtilTest.java.svn-base b/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModelUtilTest.java.svn-base new file mode 100644 index 0000000..16b17cd --- /dev/null +++ b/src/net/sourceforge/align/model/language/.svn/text-base/LanguageModelUtilTest.java.svn-base @@ -0,0 +1,52 @@ +package net.sourceforge.align.model.language; + +import static net.sourceforge.align.model.Util.createWidList; +import static org.junit.Assert.assertEquals; + +import java.io.StringReader; +import java.util.List; + +import org.junit.Test; + +/** + * Represents {@link LanguageModelUtil} unit test. + * @author loomchild + */ +public class LanguageModelUtilTest { + + public String LANGUAGE_MODEL = + "3 2\n" + + "1 3\n" + + "2 0\n" + + " "; + + /** + * Tests if model training produces expected probabilities. + */ + @Test + public void train() { + int[][] widArray = new int[][] { + new int[] {1, 2, 1}, new int[] {1}, new int[] {2}, new int[] {}, + }; + List< List > widList = createWidList(widArray); + LanguageModel model = LanguageModelUtil.train(widList); + assertEquals(0.6f, model.getWordProbability(1), 0.01f); + assertEquals(0.4f, model.getWordProbability(2), 0.01f); + assertEquals(0.0f, model.getWordProbability(0), 0.01f); + assertEquals(0.2f, model.getSingletonWordProbability()); + } + + /** + * Tests if parsing of simple test model {@link #LANGUAGE_MODEL} + * works as expected. + */ + @Test + public void testParse() { + StringReader reader = new StringReader(LANGUAGE_MODEL); + LanguageModel languageModel = LanguageModelUtil.parse(reader); + assertEquals(0.2f, languageModel.getSingletonWordProbability(), 0.0001f); + assertEquals(0.6f, languageModel.getWordProbability(1), 0.0001f); + assertEquals(0.0f, languageModel.getWordProbability(2), 0.0001f); + } + +} diff --git a/src/net/sourceforge/align/model/language/.svn/text-base/LanguageTestSuite.java.svn-base b/src/net/sourceforge/align/model/language/.svn/text-base/LanguageTestSuite.java.svn-base new file mode 100644 index 0000000..20e8422 --- /dev/null +++ b/src/net/sourceforge/align/model/language/.svn/text-base/LanguageTestSuite.java.svn-base @@ -0,0 +1,16 @@ +package net.sourceforge.align.model.language; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents model.language package unit test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MutableLanguageModelTest.class,LanguageModelUtilTest.class +}) +public class LanguageTestSuite { + +} diff --git a/src/net/sourceforge/align/model/language/.svn/text-base/MutableLanguageModel.java.svn-base b/src/net/sourceforge/align/model/language/.svn/text-base/MutableLanguageModel.java.svn-base new file mode 100644 index 0000000..83e5bb9 --- /dev/null +++ b/src/net/sourceforge/align/model/language/.svn/text-base/MutableLanguageModel.java.svn-base @@ -0,0 +1,106 @@ +package net.sourceforge.align.model.language; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + +/** + * Represents language model that can be modified after it was created. + * After the model has been populated {@link #normalize()} method must + * be called to calculate the probabilities. + * + * @author Jarek Lipski (loomchild) + */ +class MutableLanguageModel implements LanguageModel { + + private ArrayList wordProbabilityArray; + + int wordOccurenceCount; + + float singletonWordProbability; + + /** + * Creates empty language model. + */ + public MutableLanguageModel() { + this.wordProbabilityArray = new ArrayList(); + this.wordOccurenceCount = 0; + this.singletonWordProbability = 0; + } + + public float getWordProbability(int wid) { + assert wid >= 0; + if (wid < wordProbabilityArray.size()) { + return wordProbabilityArray.get(wid); + } else { + return singletonWordProbability; + } + } + + public float getSingletonWordProbability() { + return singletonWordProbability; + } + + /** + * Adds word occurrence to the model. Word is represented as numeric + * word id. + * @param wid word id + */ + public void addWordOccurence(int wid) { + addWordOccurence(wid, 1); + } + + /** + * Adds given word given occurrence count to the model. + * @param wid word id + * @param count number of occurrence to be added + */ + public void addWordOccurence(int wid, int count) { + assert wid >= 0; + ensureSize(wid + 1); + wordProbabilityArray.set(wid, wordProbabilityArray.get(wid) + + count); + wordOccurenceCount += count; + } + + /** + * Calculates the occurrence probabilities. This method should be called + * after model has been populated. + */ + public void normalize() { + for (int i = 0; i < wordProbabilityArray.size(); ++i) { + float probability = wordProbabilityArray.get(i) / + (float)wordOccurenceCount; + wordProbabilityArray.set(i, probability); + } + singletonWordProbability = 1.0f / (float)wordOccurenceCount; + } + + /** + * Ensures that word probability array has given size by expanding + * it with zeros if required. + * @param size + */ + private void ensureSize(int size) { + int currentSize = wordProbabilityArray.size(); + if (size > currentSize) { + wordProbabilityArray.ensureCapacity(size); + for (int i = currentSize; i < size; ++i) { + wordProbabilityArray.add(0.0f); + } + } + } + + public void format(Writer writer, Vocabulary vocabulary) { + PrintWriter printWriter = new PrintWriter(writer, true); + for (int i = 0; i < wordProbabilityArray.size(); ++i) { + printWriter.println(vocabulary.getWord(i) + "\t" + + wordProbabilityArray.get(i)); + } + } + + +} diff --git a/src/net/sourceforge/align/model/language/.svn/text-base/MutableLanguageModelTest.java.svn-base b/src/net/sourceforge/align/model/language/.svn/text-base/MutableLanguageModelTest.java.svn-base new file mode 100644 index 0000000..9e6ef4a --- /dev/null +++ b/src/net/sourceforge/align/model/language/.svn/text-base/MutableLanguageModelTest.java.svn-base @@ -0,0 +1,30 @@ +package net.sourceforge.align.model.language; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Represents {@link MutableLanguageModel} unit test. + * @author loomchild + */ +public class MutableLanguageModelTest { + + /** + * Checks if model probabilities are calculated properly. + */ + @Test + public void word() { + MutableLanguageModel model = new MutableLanguageModel(); + assertEquals(0.0f, model.getWordProbability(1)); + model.addWordOccurence(1); + model.addWordOccurence(1); + model.addWordOccurence(1); + model.addWordOccurence(2); + model.normalize(); + assertEquals(0.75f, model.getWordProbability(1), 0.01f); + assertEquals(0.25f, model.getWordProbability(2), 0.01f); + assertEquals(0.25f, model.getSingletonWordProbability(), 0.01f); + } + +} diff --git a/src/net/sourceforge/align/model/language/LanguageModel.java b/src/net/sourceforge/align/model/language/LanguageModel.java new file mode 100755 index 0000000..8bf091b --- /dev/null +++ b/src/net/sourceforge/align/model/language/LanguageModel.java @@ -0,0 +1,40 @@ +package net.sourceforge.align.model.language; + +import java.io.Writer; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + +/** + * Represents simple unigram language model. Responsible for storing + * word probabilities in given language. Words are represented as + * integer word IDs. + * + * @author Jarek Lipski (loomchild) + */ +public interface LanguageModel { + + /** + * Returns word occurrence probability in modeled language. + * @param wid word id + * @return word occurrence probability; <0, 1> + */ + public float getWordProbability(int wid); + + /** + * Returns probability of some word if it occurred only once in + * training corpus. Basically this number is equal to + * 1 / total word number of words in the training corpus. + * @return singleton probability + */ + public float getSingletonWordProbability(); + + /** + * Formats the language model to given writer in plaintext format. + * Used for logging purposes and for storing models. + * @param writer writer + * @param vocabulary this language vocabulary + */ + public void format(Writer writer, Vocabulary vocabulary); + +} diff --git a/src/net/sourceforge/align/model/language/LanguageModelUtil.java b/src/net/sourceforge/align/model/language/LanguageModelUtil.java new file mode 100755 index 0000000..61c8507 --- /dev/null +++ b/src/net/sourceforge/align/model/language/LanguageModelUtil.java @@ -0,0 +1,65 @@ +package net.sourceforge.align.model.language; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.List; + +import net.sourceforge.align.model.ModelParseException; + +/** + * Represents {@link LanguageModel} utility methods - training and parsing. + * + * @author Jarek Lipski (loomchild) + */ +public class LanguageModelUtil { + + /** + * Trains language model by adding all words from given segment list + * (training corpus) to it and after that calculating the probabilities + * by calling {@link MutableLanguageModel#normalize()}. + * @param segmentList training corpus + */ + public static LanguageModel train(List< List > segmentList) { + MutableLanguageModel model = new MutableLanguageModel(); + + for (List segment : segmentList) { + for (int wid : segment) { + model.addWordOccurence(wid); + } + } + model.normalize(); + return model; + } + + /** + * Parses language model from input stream. Uses simple plaintext format + * where each line consists of word, whitespace and probability. + * @param reader reader from which model should be read + * @return parsed language model + */ + public static LanguageModel parse(Reader reader) { + try { + BufferedReader bufferedReader = new BufferedReader(reader); + MutableLanguageModel languageModel = new MutableLanguageModel(); + String line; + while ((line = bufferedReader.readLine()) != null) { + String[] parts = line.split("\\s"); + if (parts.length == 2) { + int wid = Integer.parseInt(parts[0]); + int count = Integer.parseInt(parts[1]); + languageModel.addWordOccurence(wid, count); + } else if (parts.length != 0) { + throw new ModelParseException("Bad number of line parts."); + } + } + languageModel.normalize(); + return languageModel; + } catch (NumberFormatException e) { + throw new ModelParseException("Part format error", e); + } catch (IOException e) { + throw new ModelParseException("IO error", e); + } + } + +} diff --git a/src/net/sourceforge/align/model/language/LanguageModelUtilTest.java b/src/net/sourceforge/align/model/language/LanguageModelUtilTest.java new file mode 100755 index 0000000..16b17cd --- /dev/null +++ b/src/net/sourceforge/align/model/language/LanguageModelUtilTest.java @@ -0,0 +1,52 @@ +package net.sourceforge.align.model.language; + +import static net.sourceforge.align.model.Util.createWidList; +import static org.junit.Assert.assertEquals; + +import java.io.StringReader; +import java.util.List; + +import org.junit.Test; + +/** + * Represents {@link LanguageModelUtil} unit test. + * @author loomchild + */ +public class LanguageModelUtilTest { + + public String LANGUAGE_MODEL = + "3 2\n" + + "1 3\n" + + "2 0\n" + + " "; + + /** + * Tests if model training produces expected probabilities. + */ + @Test + public void train() { + int[][] widArray = new int[][] { + new int[] {1, 2, 1}, new int[] {1}, new int[] {2}, new int[] {}, + }; + List< List > widList = createWidList(widArray); + LanguageModel model = LanguageModelUtil.train(widList); + assertEquals(0.6f, model.getWordProbability(1), 0.01f); + assertEquals(0.4f, model.getWordProbability(2), 0.01f); + assertEquals(0.0f, model.getWordProbability(0), 0.01f); + assertEquals(0.2f, model.getSingletonWordProbability()); + } + + /** + * Tests if parsing of simple test model {@link #LANGUAGE_MODEL} + * works as expected. + */ + @Test + public void testParse() { + StringReader reader = new StringReader(LANGUAGE_MODEL); + LanguageModel languageModel = LanguageModelUtil.parse(reader); + assertEquals(0.2f, languageModel.getSingletonWordProbability(), 0.0001f); + assertEquals(0.6f, languageModel.getWordProbability(1), 0.0001f); + assertEquals(0.0f, languageModel.getWordProbability(2), 0.0001f); + } + +} diff --git a/src/net/sourceforge/align/model/language/LanguageTestSuite.java b/src/net/sourceforge/align/model/language/LanguageTestSuite.java new file mode 100755 index 0000000..20e8422 --- /dev/null +++ b/src/net/sourceforge/align/model/language/LanguageTestSuite.java @@ -0,0 +1,16 @@ +package net.sourceforge.align.model.language; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents model.language package unit test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MutableLanguageModelTest.class,LanguageModelUtilTest.class +}) +public class LanguageTestSuite { + +} diff --git a/src/net/sourceforge/align/model/language/MutableLanguageModel.java b/src/net/sourceforge/align/model/language/MutableLanguageModel.java new file mode 100755 index 0000000..83e5bb9 --- /dev/null +++ b/src/net/sourceforge/align/model/language/MutableLanguageModel.java @@ -0,0 +1,106 @@ +package net.sourceforge.align.model.language; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + +/** + * Represents language model that can be modified after it was created. + * After the model has been populated {@link #normalize()} method must + * be called to calculate the probabilities. + * + * @author Jarek Lipski (loomchild) + */ +class MutableLanguageModel implements LanguageModel { + + private ArrayList wordProbabilityArray; + + int wordOccurenceCount; + + float singletonWordProbability; + + /** + * Creates empty language model. + */ + public MutableLanguageModel() { + this.wordProbabilityArray = new ArrayList(); + this.wordOccurenceCount = 0; + this.singletonWordProbability = 0; + } + + public float getWordProbability(int wid) { + assert wid >= 0; + if (wid < wordProbabilityArray.size()) { + return wordProbabilityArray.get(wid); + } else { + return singletonWordProbability; + } + } + + public float getSingletonWordProbability() { + return singletonWordProbability; + } + + /** + * Adds word occurrence to the model. Word is represented as numeric + * word id. + * @param wid word id + */ + public void addWordOccurence(int wid) { + addWordOccurence(wid, 1); + } + + /** + * Adds given word given occurrence count to the model. + * @param wid word id + * @param count number of occurrence to be added + */ + public void addWordOccurence(int wid, int count) { + assert wid >= 0; + ensureSize(wid + 1); + wordProbabilityArray.set(wid, wordProbabilityArray.get(wid) + + count); + wordOccurenceCount += count; + } + + /** + * Calculates the occurrence probabilities. This method should be called + * after model has been populated. + */ + public void normalize() { + for (int i = 0; i < wordProbabilityArray.size(); ++i) { + float probability = wordProbabilityArray.get(i) / + (float)wordOccurenceCount; + wordProbabilityArray.set(i, probability); + } + singletonWordProbability = 1.0f / (float)wordOccurenceCount; + } + + /** + * Ensures that word probability array has given size by expanding + * it with zeros if required. + * @param size + */ + private void ensureSize(int size) { + int currentSize = wordProbabilityArray.size(); + if (size > currentSize) { + wordProbabilityArray.ensureCapacity(size); + for (int i = currentSize; i < size; ++i) { + wordProbabilityArray.add(0.0f); + } + } + } + + public void format(Writer writer, Vocabulary vocabulary) { + PrintWriter printWriter = new PrintWriter(writer, true); + for (int i = 0; i < wordProbabilityArray.size(); ++i) { + printWriter.println(vocabulary.getWord(i) + "\t" + + wordProbabilityArray.get(i)); + } + } + + +} diff --git a/src/net/sourceforge/align/model/language/MutableLanguageModelTest.java b/src/net/sourceforge/align/model/language/MutableLanguageModelTest.java new file mode 100755 index 0000000..9e6ef4a --- /dev/null +++ b/src/net/sourceforge/align/model/language/MutableLanguageModelTest.java @@ -0,0 +1,30 @@ +package net.sourceforge.align.model.language; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Represents {@link MutableLanguageModel} unit test. + * @author loomchild + */ +public class MutableLanguageModelTest { + + /** + * Checks if model probabilities are calculated properly. + */ + @Test + public void word() { + MutableLanguageModel model = new MutableLanguageModel(); + assertEquals(0.0f, model.getWordProbability(1)); + model.addWordOccurence(1); + model.addWordOccurence(1); + model.addWordOccurence(1); + model.addWordOccurence(2); + model.normalize(); + assertEquals(0.75f, model.getWordProbability(1), 0.01f); + assertEquals(0.25f, model.getWordProbability(2), 0.01f); + assertEquals(0.25f, model.getSingletonWordProbability(), 0.01f); + } + +} diff --git a/src/net/sourceforge/align/model/length/.svn/all-wcprops b/src/net/sourceforge/align/model/length/.svn/all-wcprops new file mode 100644 index 0000000..bd31d41 --- /dev/null +++ b/src/net/sourceforge/align/model/length/.svn/all-wcprops @@ -0,0 +1,41 @@ +K 25 +svn:wc:ra_dav:version-url +V 79 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/length +END +LengthTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/length/LengthTestSuite.java +END +MutableLengthModelTest.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/length/MutableLengthModelTest.java +END +MutableLengthModel.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/length/MutableLengthModel.java +END +LengthModelUtilTest.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/length/LengthModelUtilTest.java +END +LengthModelUtil.java +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/length/LengthModelUtil.java +END +LengthModel.java +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/length/LengthModel.java +END diff --git a/src/net/sourceforge/align/model/length/.svn/entries b/src/net/sourceforge/align/model/length/.svn/entries new file mode 100644 index 0000000..fbe8bce --- /dev/null +++ b/src/net/sourceforge/align/model/length/.svn/entries @@ -0,0 +1,232 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/model/length +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +LengthModel.java +file + + + + +2010-11-06T22:20:15.000000Z +04e0165c8adeec842f331b89607961d3 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +795 + +LengthModelUtil.java +file + + + + +2010-11-06T22:30:07.000000Z +bcb5794da7baef99724aea186078f9d2 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +631 + +LengthModelUtilTest.java +file + + + + +2010-11-06T22:21:56.000000Z +b01f9ea866689874a7e94b8536d3dbfe +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +814 + +LengthTestSuite.java +file + + + + +2010-11-06T22:20:39.000000Z +bdcbfcaf925ccd48609ee37fb2f6e090 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +330 + +MutableLengthModel.java +file + + + + +2010-11-06T22:28:39.000000Z +3ece0c55246204329afa8791feb63a74 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +2352 + +MutableLengthModelTest.java +file + + + + +2010-11-06T22:23:10.000000Z +3fce71a2e4a7b1cbf3fac84f0e7a36c6 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +773 + diff --git a/src/net/sourceforge/align/model/length/.svn/text-base/LengthModel.java.svn-base b/src/net/sourceforge/align/model/length/.svn/text-base/LengthModel.java.svn-base new file mode 100644 index 0000000..2bbb115 --- /dev/null +++ b/src/net/sourceforge/align/model/length/.svn/text-base/LengthModel.java.svn-base @@ -0,0 +1,33 @@ +package net.sourceforge.align.model.length; + +import java.io.Writer; + +/** + * Represents a model of segment (sentence, paragraph) lengths for a particular + * language, allowing to calculate given length probability and averages. + * + * @author loomchild + */ +public interface LengthModel { + + /** + * Calculates probability that segment of given length will occur + * in modeled language. + * @param length segment length + * @return length probability + */ + public float getLengthProbability(int length); + + /** + * @return mean segment length in modeled language + */ + public float getMeanLength(); + + /** + * Formats the length model to given writer in plaintext format. + * Used for logging purposes and for storing models. + * @param writer writer + */ + public void format(Writer writer); + +} diff --git a/src/net/sourceforge/align/model/length/.svn/text-base/LengthModelUtil.java.svn-base b/src/net/sourceforge/align/model/length/.svn/text-base/LengthModelUtil.java.svn-base new file mode 100644 index 0000000..dd5e5e1 --- /dev/null +++ b/src/net/sourceforge/align/model/length/.svn/text-base/LengthModelUtil.java.svn-base @@ -0,0 +1,28 @@ +package net.sourceforge.align.model.length; + +import java.util.List; + +/** + * Represents length model utilities. + * @author loomchild + */ +public class LengthModelUtil { + + /** + * Trains a length model using given segments corpus + * @param segmentLengthList segment list + * @return created length model reflecting segment length occurrence + * probabilities + */ + public static LengthModel train(List segmentLengthList) { + MutableLengthModel model = new MutableLengthModel(); + + for (int segmentLength : segmentLengthList) { + model.addLengthOccurence(segmentLength); + } + model.normalize(); + + return model; + } + +} diff --git a/src/net/sourceforge/align/model/length/.svn/text-base/LengthModelUtilTest.java.svn-base b/src/net/sourceforge/align/model/length/.svn/text-base/LengthModelUtilTest.java.svn-base new file mode 100644 index 0000000..1e61bef --- /dev/null +++ b/src/net/sourceforge/align/model/length/.svn/text-base/LengthModelUtilTest.java.svn-base @@ -0,0 +1,32 @@ +package net.sourceforge.align.model.length; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + + +/** + * Represents {@link LengthModelUtil} test suite. + * @author loomchild + * + */ +public class LengthModelUtilTest { + + /** + * Checks if length probabilities are calculated correctly. + */ + @Test + public void train() { + List lengthList = Arrays.asList(new Integer[]{3, 1, 1, 0}); + LengthModel model = LengthModelUtil.train(lengthList); + assertEquals(0.25f, model.getLengthProbability(0), 0.01f); + assertEquals(0.5f, model.getLengthProbability(1), 0.01f); + assertEquals(0.0f, model.getLengthProbability(2), 0.01f); + assertEquals(0.25f, model.getLengthProbability(3), 0.01f); + assertEquals(1.25f, model.getMeanLength(), 0.01f); + } + +} diff --git a/src/net/sourceforge/align/model/length/.svn/text-base/LengthTestSuite.java.svn-base b/src/net/sourceforge/align/model/length/.svn/text-base/LengthTestSuite.java.svn-base new file mode 100644 index 0000000..f5d8b06 --- /dev/null +++ b/src/net/sourceforge/align/model/length/.svn/text-base/LengthTestSuite.java.svn-base @@ -0,0 +1,16 @@ +package net.sourceforge.align.model.length; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents model.length package unit test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MutableLengthModelTest.class, LengthModelUtilTest.class +}) +public class LengthTestSuite { + +} diff --git a/src/net/sourceforge/align/model/length/.svn/text-base/MutableLengthModel.java.svn-base b/src/net/sourceforge/align/model/length/.svn/text-base/MutableLengthModel.java.svn-base new file mode 100644 index 0000000..ee9e2aa --- /dev/null +++ b/src/net/sourceforge/align/model/length/.svn/text-base/MutableLengthModel.java.svn-base @@ -0,0 +1,94 @@ +package net.sourceforge.align.model.length; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; + +/** + * Represents length model that can be changed after it was created. + * After the model has been populated {@link #normalize()} method must + * be called to calculate the probabilities. + * + * @author loomchild + */ +public class MutableLengthModel implements LengthModel { + + private ArrayList lengthProbabilityArray; + + float meanLength; + + int totalLength; + + int lengthOccurenceCount; + + /** + * Creates empty length model. + */ + public MutableLengthModel() { + this.lengthProbabilityArray = new ArrayList(); + this.meanLength = 0.0f; + this.lengthOccurenceCount = 0; + this.totalLength = 0; + } + + public float getLengthProbability(int length) { + assert length >= 0; + if (length < lengthProbabilityArray.size()) { + return lengthProbabilityArray.get(length); + } else { + return 0; + } + } + + public float getMeanLength() { + return meanLength; + } + + /** + * Adds occurrence of segment length to the model. + * @param length segment length + */ + public void addLengthOccurence(int length) { + assert length >= 0; + ensureSize(length + 1); + lengthProbabilityArray.set(length, lengthProbabilityArray.get(length) + 1); + ++lengthOccurenceCount; + totalLength += length; + } + + /** + * Calculates the occurrence probabilities. This method should be called + * after model has been populated. + */ + public void normalize() { + for (int i = 0; i < lengthProbabilityArray.size(); ++i) { + float probability = lengthProbabilityArray.get(i) / + (float)lengthOccurenceCount; + lengthProbabilityArray.set(i, probability); + } + meanLength = (float)totalLength / (float)lengthOccurenceCount; + } + + /** + * Ensures that length probability array has given size by expanding + * it with zeros if required. + * @param size + */ + private void ensureSize(int size) { + int currentSize = lengthProbabilityArray.size(); + if (size > currentSize) { + lengthProbabilityArray.ensureCapacity(size); + for (int i = currentSize; i < size; ++i) { + lengthProbabilityArray.add(0.0f); + } + } + } + + public void format(Writer writer) { + PrintWriter printWriter = new PrintWriter(writer, true); + for (int i = 0; i < lengthProbabilityArray.size(); ++i) { + printWriter.println(i + "\t" + lengthProbabilityArray.get(i)); + } + } + +} diff --git a/src/net/sourceforge/align/model/length/.svn/text-base/MutableLengthModelTest.java.svn-base b/src/net/sourceforge/align/model/length/.svn/text-base/MutableLengthModelTest.java.svn-base new file mode 100644 index 0000000..ba7b4eb --- /dev/null +++ b/src/net/sourceforge/align/model/length/.svn/text-base/MutableLengthModelTest.java.svn-base @@ -0,0 +1,31 @@ +package net.sourceforge.align.model.length; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Represents {@link MutableLengthModel} unit test. + * @author loomchild + */ +public class MutableLengthModelTest { + + /** + * Checks if length probabilities are calculated correctly. + */ + @Test + public void length() { + MutableLengthModel model = new MutableLengthModel(); + assertEquals(0.0f, model.getLengthProbability(3)); + model.addLengthOccurence(3); + model.addLengthOccurence(3); + model.addLengthOccurence(3); + model.addLengthOccurence(2); + model.normalize(); + assertEquals(0.75f, model.getLengthProbability(3), 0.01f); + assertEquals(0.25f, model.getLengthProbability(2), 0.01f); + assertEquals(2.75f, model.getMeanLength(), 0.01f); + } + + +} diff --git a/src/net/sourceforge/align/model/length/LengthModel.java b/src/net/sourceforge/align/model/length/LengthModel.java new file mode 100755 index 0000000..2bbb115 --- /dev/null +++ b/src/net/sourceforge/align/model/length/LengthModel.java @@ -0,0 +1,33 @@ +package net.sourceforge.align.model.length; + +import java.io.Writer; + +/** + * Represents a model of segment (sentence, paragraph) lengths for a particular + * language, allowing to calculate given length probability and averages. + * + * @author loomchild + */ +public interface LengthModel { + + /** + * Calculates probability that segment of given length will occur + * in modeled language. + * @param length segment length + * @return length probability + */ + public float getLengthProbability(int length); + + /** + * @return mean segment length in modeled language + */ + public float getMeanLength(); + + /** + * Formats the length model to given writer in plaintext format. + * Used for logging purposes and for storing models. + * @param writer writer + */ + public void format(Writer writer); + +} diff --git a/src/net/sourceforge/align/model/length/LengthModelUtil.java b/src/net/sourceforge/align/model/length/LengthModelUtil.java new file mode 100755 index 0000000..dd5e5e1 --- /dev/null +++ b/src/net/sourceforge/align/model/length/LengthModelUtil.java @@ -0,0 +1,28 @@ +package net.sourceforge.align.model.length; + +import java.util.List; + +/** + * Represents length model utilities. + * @author loomchild + */ +public class LengthModelUtil { + + /** + * Trains a length model using given segments corpus + * @param segmentLengthList segment list + * @return created length model reflecting segment length occurrence + * probabilities + */ + public static LengthModel train(List segmentLengthList) { + MutableLengthModel model = new MutableLengthModel(); + + for (int segmentLength : segmentLengthList) { + model.addLengthOccurence(segmentLength); + } + model.normalize(); + + return model; + } + +} diff --git a/src/net/sourceforge/align/model/length/LengthModelUtilTest.java b/src/net/sourceforge/align/model/length/LengthModelUtilTest.java new file mode 100755 index 0000000..1e61bef --- /dev/null +++ b/src/net/sourceforge/align/model/length/LengthModelUtilTest.java @@ -0,0 +1,32 @@ +package net.sourceforge.align.model.length; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + + +/** + * Represents {@link LengthModelUtil} test suite. + * @author loomchild + * + */ +public class LengthModelUtilTest { + + /** + * Checks if length probabilities are calculated correctly. + */ + @Test + public void train() { + List lengthList = Arrays.asList(new Integer[]{3, 1, 1, 0}); + LengthModel model = LengthModelUtil.train(lengthList); + assertEquals(0.25f, model.getLengthProbability(0), 0.01f); + assertEquals(0.5f, model.getLengthProbability(1), 0.01f); + assertEquals(0.0f, model.getLengthProbability(2), 0.01f); + assertEquals(0.25f, model.getLengthProbability(3), 0.01f); + assertEquals(1.25f, model.getMeanLength(), 0.01f); + } + +} diff --git a/src/net/sourceforge/align/model/length/LengthTestSuite.java b/src/net/sourceforge/align/model/length/LengthTestSuite.java new file mode 100755 index 0000000..f5d8b06 --- /dev/null +++ b/src/net/sourceforge/align/model/length/LengthTestSuite.java @@ -0,0 +1,16 @@ +package net.sourceforge.align.model.length; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents model.length package unit test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MutableLengthModelTest.class, LengthModelUtilTest.class +}) +public class LengthTestSuite { + +} diff --git a/src/net/sourceforge/align/model/length/MutableLengthModel.java b/src/net/sourceforge/align/model/length/MutableLengthModel.java new file mode 100755 index 0000000..ee9e2aa --- /dev/null +++ b/src/net/sourceforge/align/model/length/MutableLengthModel.java @@ -0,0 +1,94 @@ +package net.sourceforge.align.model.length; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; + +/** + * Represents length model that can be changed after it was created. + * After the model has been populated {@link #normalize()} method must + * be called to calculate the probabilities. + * + * @author loomchild + */ +public class MutableLengthModel implements LengthModel { + + private ArrayList lengthProbabilityArray; + + float meanLength; + + int totalLength; + + int lengthOccurenceCount; + + /** + * Creates empty length model. + */ + public MutableLengthModel() { + this.lengthProbabilityArray = new ArrayList(); + this.meanLength = 0.0f; + this.lengthOccurenceCount = 0; + this.totalLength = 0; + } + + public float getLengthProbability(int length) { + assert length >= 0; + if (length < lengthProbabilityArray.size()) { + return lengthProbabilityArray.get(length); + } else { + return 0; + } + } + + public float getMeanLength() { + return meanLength; + } + + /** + * Adds occurrence of segment length to the model. + * @param length segment length + */ + public void addLengthOccurence(int length) { + assert length >= 0; + ensureSize(length + 1); + lengthProbabilityArray.set(length, lengthProbabilityArray.get(length) + 1); + ++lengthOccurenceCount; + totalLength += length; + } + + /** + * Calculates the occurrence probabilities. This method should be called + * after model has been populated. + */ + public void normalize() { + for (int i = 0; i < lengthProbabilityArray.size(); ++i) { + float probability = lengthProbabilityArray.get(i) / + (float)lengthOccurenceCount; + lengthProbabilityArray.set(i, probability); + } + meanLength = (float)totalLength / (float)lengthOccurenceCount; + } + + /** + * Ensures that length probability array has given size by expanding + * it with zeros if required. + * @param size + */ + private void ensureSize(int size) { + int currentSize = lengthProbabilityArray.size(); + if (size > currentSize) { + lengthProbabilityArray.ensureCapacity(size); + for (int i = currentSize; i < size; ++i) { + lengthProbabilityArray.add(0.0f); + } + } + } + + public void format(Writer writer) { + PrintWriter printWriter = new PrintWriter(writer, true); + for (int i = 0; i < lengthProbabilityArray.size(); ++i) { + printWriter.println(i + "\t" + lengthProbabilityArray.get(i)); + } + } + +} diff --git a/src/net/sourceforge/align/model/length/MutableLengthModelTest.java b/src/net/sourceforge/align/model/length/MutableLengthModelTest.java new file mode 100755 index 0000000..ba7b4eb --- /dev/null +++ b/src/net/sourceforge/align/model/length/MutableLengthModelTest.java @@ -0,0 +1,31 @@ +package net.sourceforge.align.model.length; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Represents {@link MutableLengthModel} unit test. + * @author loomchild + */ +public class MutableLengthModelTest { + + /** + * Checks if length probabilities are calculated correctly. + */ + @Test + public void length() { + MutableLengthModel model = new MutableLengthModel(); + assertEquals(0.0f, model.getLengthProbability(3)); + model.addLengthOccurence(3); + model.addLengthOccurence(3); + model.addLengthOccurence(3); + model.addLengthOccurence(2); + model.normalize(); + assertEquals(0.75f, model.getLengthProbability(3), 0.01f); + assertEquals(0.25f, model.getLengthProbability(2), 0.01f); + assertEquals(2.75f, model.getMeanLength(), 0.01f); + } + + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/all-wcprops b/src/net/sourceforge/align/model/translation/.svn/all-wcprops new file mode 100644 index 0000000..7521563 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/all-wcprops @@ -0,0 +1,95 @@ +K 25 +svn:wc:ra_dav:version-url +V 84 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation +END +MutableTranslationModelTest.java +K 25 +svn:wc:ra_dav:version-url +V 117 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/MutableTranslationModelTest.java +END +TargetDataProbabilityComparator.java +K 25 +svn:wc:ra_dav:version-url +V 121 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/TargetDataProbabilityComparator.java +END +TranslationModelUtilTest.java +K 25 +svn:wc:ra_dav:version-url +V 114 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/model/translation/TranslationModelUtilTest.java +END +MutableSourceData.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/MutableSourceData.java +END +InitialSourceData.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/InitialSourceData.java +END +SourceData.java +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/SourceData.java +END +TargetDataProbabilityComparatorTest.java +K 25 +svn:wc:ra_dav:version-url +V 125 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/TargetDataProbabilityComparatorTest.java +END +MutableTranslationModel.java +K 25 +svn:wc:ra_dav:version-url +V 113 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/MutableTranslationModel.java +END +MutableSourceDataTest.java +K 25 +svn:wc:ra_dav:version-url +V 111 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/MutableSourceDataTest.java +END +InitialTranslationModel.java +K 25 +svn:wc:ra_dav:version-url +V 113 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/InitialTranslationModel.java +END +TargetData.java +K 25 +svn:wc:ra_dav:version-url +V 100 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/TargetData.java +END +TranslationModelUtil.java +K 25 +svn:wc:ra_dav:version-url +V 110 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/model/translation/TranslationModelUtil.java +END +TranslationModel.java +K 25 +svn:wc:ra_dav:version-url +V 106 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/TranslationModel.java +END +TranslationTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 110 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/TranslationTestSuite.java +END +EmptySourceData.java +K 25 +svn:wc:ra_dav:version-url +V 105 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/translation/EmptySourceData.java +END diff --git a/src/net/sourceforge/align/model/translation/.svn/entries b/src/net/sourceforge/align/model/translation/.svn/entries new file mode 100644 index 0000000..172cf5a --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/entries @@ -0,0 +1,538 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/model/translation +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +EmptySourceData.java +file + + + + +2010-11-09T13:33:41.000000Z +7d084306bef7f0cace7b3cfa726204d4 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +723 + +InitialSourceData.java +file + + + + +2010-11-09T13:41:04.000000Z +82baf19d861d7304a346d4915bd1a80f +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +772 + +InitialTranslationModel.java +file + + + + +2010-11-09T13:44:00.000000Z +60ca92de19db8482ed81cdfe70fbf61f +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1247 + +MutableSourceData.java +file + + + + +2010-11-09T13:57:34.000000Z +a18193c4f59b143660c1516e2b542f56 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +3238 + +MutableSourceDataTest.java +file + + + + +2010-11-09T13:58:55.000000Z +a1a044489ea9f4c3075e9f93bc2c8768 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1439 + +MutableTranslationModel.java +file + + + + +2010-11-09T18:19:45.000000Z +bc281588117adb8e10062de7539d53c3 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +2929 + +MutableTranslationModelTest.java +file + + + + +2010-11-09T18:05:26.000000Z +7cb5bf98481f7cd65be4c71d8927c714 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1156 + +SourceData.java +file + + + + +2010-11-09T13:11:55.000000Z +7d1cd3817d02d694984ae7ca070c37ed +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +697 + +TargetData.java +file + + + + +2010-11-09T13:19:40.000000Z +8acf01c62b909aa3ed84f31ff53ca9cc +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +703 + +TargetDataProbabilityComparator.java +file + + + + +2010-11-09T13:22:07.000000Z +ef5000753b1e6a9e3bc83d750aa511ce +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +691 + +TargetDataProbabilityComparatorTest.java +file + + + + +2010-11-09T13:24:49.000000Z +9770b41c9d18936e9bc553861dd6cea1 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +791 + +TranslationModel.java +file + + + + +2010-11-11T09:56:38.000000Z +19b8627694298fd9f3f32b3498e5fb7c +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1119 + +TranslationModelUtil.java +file +53 + + + +2010-12-29T17:29:28.000000Z +90d90b9f5d2e42d65f0f9f6a15eee9a1 +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +6175 + +TranslationModelUtilTest.java +file +53 + + + +2010-12-29T23:13:22.000000Z +9279e6716d7ad01fe0877c3c3c8a73e7 +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +5355 + +TranslationTestSuite.java +file + + + + +2010-11-08T18:33:06.000000Z +b4276ff4e52189a5309381cd9bb4b8cf +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +428 + diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/EmptySourceData.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/EmptySourceData.java.svn-base new file mode 100644 index 0000000..7bd0e98 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/EmptySourceData.java.svn-base @@ -0,0 +1,33 @@ +package net.sourceforge.align.model.translation; + +import java.util.Collections; +import java.util.List; + + +/** + * Represents empty translation data of source word - + * essentially it means that source word has no translations. + * Always returns empty translation list and probability of translating to + * any word is always zero. + * + * @author Jarek Lipski (loomchild) + */ +class EmptySourceData implements SourceData { + + /** + * @param targetWid target word id + * @return always zero + */ + public double getTranslationProbability(int targetWid) { + assert targetWid >= 0; + return 0; + } + + /** + * @return empty translation list + */ + public List getTranslationList() { + return Collections.emptyList(); + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/InitialSourceData.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/InitialSourceData.java.svn-base new file mode 100644 index 0000000..cd50a75 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/InitialSourceData.java.svn-base @@ -0,0 +1,33 @@ +package net.sourceforge.align.model.translation; + +import java.util.Collections; +import java.util.List; + + +/** + * Represents source translation data in initial model before first training + * iteration. In this state all translations of this source word are equally + * probable and probability is equal to 1. This object is immutable. + * + * @author Jarek Lipski (loomchild) + */ +class InitialSourceData implements SourceData { + + /** + * Always returns one for any word id. + * @param targetWid target word id, >= 0 + * @return always one + */ + public double getTranslationProbability(int targetWid) { + assert targetWid >= 0; + return 1; + } + + /** + * @return empty translation list + */ + public List getTranslationList() { + return Collections.emptyList(); + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/InitialTranslationModel.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/InitialTranslationModel.java.svn-base new file mode 100644 index 0000000..e7a0eeb --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/InitialTranslationModel.java.svn-base @@ -0,0 +1,48 @@ +package net.sourceforge.align.model.translation; + +import java.io.Writer; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + + +/** + * Represents initial translation model before first training iteration. + * In this state translation probabilities from any word to any word are + * equal to one. + * This object is immutable. + * + * @author Jarek Lipski (loomchild) + */ +class InitialTranslationModel implements TranslationModel { + + private InitialSourceData translationData;; + + /** + * Creates initial translation model. + */ + public InitialTranslationModel() { + this.translationData = new InitialSourceData(); + } + + /** + * Always returns {@link InitialSourceData}, which means that for any source + * word it translates to any target word with probability equal to 1. + * @param sourceWid source word id, >= 0. + * @return immutable instance of {@link InitialSourceData} + */ + public SourceData get(int sourceWid) { + assert sourceWid >= 0; + return translationData; + } + + /** + * @throws UnsupportedOperationException always because it is not possible + * to format initial model. + */ + public void format(Writer writer, Vocabulary sourceVocabulary, + Vocabulary targetVocabulary) { + throw new UnsupportedOperationException(); + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/MutableSourceData.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/MutableSourceData.java.svn-base new file mode 100644 index 0000000..d87b97e --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/MutableSourceData.java.svn-base @@ -0,0 +1,111 @@ +package net.sourceforge.align.model.translation; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Represents mutable translation data for some source word. Used in all + * translation models after initial training iteration. After making changes + * to the stored data {@link #normalize()} and {@link #sort()} methods should + * be called. + * @author loomchild + */ +class MutableSourceData implements SourceData { + + private List translationList; + + /** + * Creates empty source translation data. + */ + public MutableSourceData() { + this.translationList = new ArrayList(); + } + + public double getTranslationProbability(int targetWid) { + int index = findTargetData(targetWid); + if (index != -1) { + return translationList.get(index).getProbability(); + } else { + return 0; + } + } + + /** + * Returns immutable translation list with probability > 0. + * Note: List may not be always sorted, {@link #sort()} method should always + * be executed before calling this method. + * + * @return sorted translation list. + */ + public List getTranslationList() { + return translationList; + } + + /** + * Sets translation probability of this source word to target word with + * given id. After making any changes like this {@link #normalize()} and + * {@link #sort()} methods must be called before retrieving any data + * from the model. + * @param targetWid target word id, >= 0. + * @param probability translation probability. + */ + public void setTranslationProbability(int targetWid, double probability) { + TargetData newData = new TargetData(targetWid, probability); + int index = findTargetData(targetWid); + if (index != -1) { + translationList.set(index, newData); + } else { + translationList.add(newData); + } + } + + /** + * Normalizes translation probabilities so they sum up to one. + * This method should be called after making any changes to this object + * via {@link #setTranslationProbability(int, double)} but before retrieving + * any data from it. + */ + public void normalize() { + double totalProbability = 0.0f; + for (TargetData data : translationList) { + totalProbability += data.getProbability(); + } + int index = 0; + for (TargetData data : translationList) { + double newProbability = data.getProbability() / totalProbability; + TargetData newData = new TargetData(data.getWid(), newProbability); + translationList.set(index, newData); + ++index; + } + } + + /** + * Sorts translation list by probability descending. + * This method should be called after making any changes to this object + * via {@link #setTranslationProbability(int, double)} but before retrieving + * any data from it. + */ + public void sort() { + Collections.sort(translationList, new TargetDataProbabilityComparator()); + } + + /** + * Finds a word with given id on translation list and returns its + * index. If word could not be found returns -1. + * + * @param targetWid target word id + * @return translation data index on the list if it exists or -1. + */ + private int findTargetData(int targetWid) { + int index = 0; + for (TargetData data : translationList) { + if (data.getWid() == targetWid) { + return index; + } + ++index; + } + return -1; + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/MutableSourceDataTest.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/MutableSourceDataTest.java.svn-base new file mode 100644 index 0000000..180b748 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/MutableSourceDataTest.java.svn-base @@ -0,0 +1,45 @@ +package net.sourceforge.align.model.translation; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Test; + +/** + * Represents {@link MutableSourceData} unit test. + * @author loomchild + */ +public class MutableSourceDataTest { + + /** + * Check if {@link MutableSourceData#normalize()} and + * {@link MutableSourceData#sort()} work as expected. + */ + @Test + public void getPutSortNormalize() { + MutableSourceData data = new MutableSourceData(); + assertEquals(0, data.getTranslationList().size()); + assertEquals(0, data.getTranslationProbability(0), 0.000001); + data.setTranslationProbability(0, 0.6f); + assertEquals(0.6, data.getTranslationProbability(0), 0.000001); + data.setTranslationProbability(1, 1.0f); + assertEquals(1.0, data.getTranslationProbability(1), 0.000001); + data.setTranslationProbability(2, 0.4f); + assertEquals(0.4, data.getTranslationProbability(2), 0.000001); + data.normalize(); + data.sort(); + List targetList = data.getTranslationList(); + assertEquals(3, targetList.size()); + TargetData target = targetList.get(0); + assertEquals(0.5, target.getProbability(), 0.000001); + assertEquals(1, target.getWid()); + target = targetList.get(1); + assertEquals(0.3, target.getProbability(), 0.000001); + assertEquals(0, target.getWid()); + target = targetList.get(2); + assertEquals(0.2, target.getProbability(), 0.000001); + assertEquals(2, target.getWid()); + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/MutableTranslationModel.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/MutableTranslationModel.java.svn-base new file mode 100644 index 0000000..1116b76 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/MutableTranslationModel.java.svn-base @@ -0,0 +1,103 @@ +package net.sourceforge.align.model.translation; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + + +/** + * Represents mutable translation model (probabilistic dictionary). + * After model training iteration and before retrieving any data from + * it {@link #normalize()} and {@link #sort()} methods should be called. + * + * @author Jarek Lipski (loomchild) + */ +public class MutableTranslationModel implements TranslationModel { + + ArrayList translationArray; + + /** + * Creates empty translation model. + */ + public MutableTranslationModel() { + this.translationArray = new ArrayList(); + } + + public SourceData get(int sourceWid) { + assert sourceWid >= 0; + if (sourceWid < translationArray.size()) { + return translationArray.get(sourceWid); + } else { + return new EmptySourceData(); + } + } + + /** + * Retrieves mutable translation data including translation probabilities + * to other words for a word with given id. If the source word is not + * present in the model it is automatically created. + * @param sourceWid source word id, >= 0. + * @return translation data + */ + public MutableSourceData getMutable(int sourceWid) { + assert sourceWid >= 0; + ensureSize(sourceWid + 1); + return translationArray.get(sourceWid); + } + + /** + * Normalizes all contained source word translations by using + * {@link MutableSourceData#normalize()}. + * This method should be called after model training iteration + * but before retrieving any data from it. + */ + public void normalize() { + for (MutableSourceData data : translationArray) { + data.normalize(); + } + } + + /** + * Sorts all contained source word translations by using + * {@link MutableSourceData#sort()}. + * This method should be called after model training iteration + * but before retrieving any data from it. + */ + public void sort() { + for (MutableSourceData data : translationArray) { + data.sort(); + } + } + + /** + * Ensures that translation array has given size by expanding + * it with empty {@link MutableSourceData} objects. + * @param size + */ + private void ensureSize(int size) { + int currentSize = translationArray.size(); + if (size > currentSize) { + translationArray.ensureCapacity(size); + for (int i = currentSize; i < size; ++i) { + translationArray.add(new MutableSourceData()); + } + } + } + + public void format(Writer writer, Vocabulary sourceVocabulary, + Vocabulary targetVocabulary) { + PrintWriter printWriter = new PrintWriter(writer, true); + for (int i = 0; i < translationArray.size(); ++i) { + MutableSourceData sourceData = translationArray.get(i); + for (TargetData targetData : sourceData.getTranslationList()) { + printWriter.println(sourceVocabulary.getWord(i) + "\t" + + targetVocabulary.getWord(targetData.getWid()) + "\t" + + targetData.getProbability()); + } + } + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/MutableTranslationModelTest.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/MutableTranslationModelTest.java.svn-base new file mode 100644 index 0000000..4abcbc6 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/MutableTranslationModelTest.java.svn-base @@ -0,0 +1,37 @@ +package net.sourceforge.align.model.translation; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Represents {@link MutableTranslationModel} unit test. + * @author loomchild + */ +public class MutableTranslationModelTest { + + /** + * Checks whether {@link MutableTranslationModel#normalize()} and + * {@link MutableTranslationModel#sort()} work as expected. + */ + @Test + public void putNormalizeSort() { + MutableTranslationModel model = new MutableTranslationModel(); + + assertEquals(0, model.get(0).getTranslationList().size()); + + model.getMutable(1).setTranslationProbability(0, 0.5); + model.getMutable(1).setTranslationProbability(1, 1.5); + + assertEquals(0.5, model.get(1).getTranslationProbability(0), 0.00001); + assertEquals(1.5, model.get(1).getTranslationProbability(1), 0.00001); + model.normalize(); + assertEquals(0.25, model.get(1).getTranslationProbability(0), 0.00001); + assertEquals(0.75, model.get(1).getTranslationProbability(1), 0.00001); + + assertEquals(0, model.get(1).getTranslationList().get(0).getWid()); + model.sort(); + assertEquals(1, model.get(1).getTranslationList().get(0).getWid()); + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/SourceData.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/SourceData.java.svn-base new file mode 100644 index 0000000..ef12dec --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/SourceData.java.svn-base @@ -0,0 +1,28 @@ +package net.sourceforge.align.model.translation; + +import java.util.List; + + +/** + * Represents source word translations with probabilities. + * + * @author Jarek Lipski (loomchild) + */ +public interface SourceData { + + /** + * Returns probability of translating this source word to a target + * word with given id. + * @param targetWid target word id + * @return translation probability + */ + public double getTranslationProbability(int targetWid); + + /** + * Returns immutable list of translations with probability greater than + * zero, sorted by probability descending. + * @return list of translations (essentially word, probability pairs) + */ + public List getTranslationList(); + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/TargetData.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/TargetData.java.svn-base new file mode 100644 index 0000000..55d1a6c --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/TargetData.java.svn-base @@ -0,0 +1,39 @@ +package net.sourceforge.align.model.translation; + + +/** + * Represents single source word translation. + * Responsible for storing target word id and translation probability. + * @author loomchild + */ +public class TargetData { + + private int wid; + + private double probability; + + /** + * Creates target data. + * @param wid target word id + * @param probability translation probability + */ + public TargetData(int wid, double probability) { + this.wid = wid; + this.probability = probability; + } + + /** + * @return target word id + */ + public int getWid() { + return wid; + } + + /** + * @return source to target word translation probability + */ + public double getProbability() { + return probability; + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/TargetDataProbabilityComparator.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/TargetDataProbabilityComparator.java.svn-base new file mode 100644 index 0000000..a1817dc --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/TargetDataProbabilityComparator.java.svn-base @@ -0,0 +1,27 @@ +package net.sourceforge.align.model.translation; + +import java.io.Serializable; +import java.util.Comparator; + +/** + * Responsible for comparing {@link TargetData} objects by translation + * probability and ordering them from the most probable to the least probable. + * @author loomchild + */ +public class TargetDataProbabilityComparator + implements Comparator, Serializable { + + private static final long serialVersionUID = -9161863179489700671L; + + public int compare(TargetData o1, TargetData o2) { + double difference = o2.getProbability() - o1.getProbability(); + if (difference > 0) { + return 1; + } else if (difference < 0) { + return -1; + } else { + return 0; + } + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/TargetDataProbabilityComparatorTest.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/TargetDataProbabilityComparatorTest.java.svn-base new file mode 100644 index 0000000..a6a4239 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/TargetDataProbabilityComparatorTest.java.svn-base @@ -0,0 +1,30 @@ +package net.sourceforge.align.model.translation; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Represents {@link TargetDataProbabilityComparator} unit test. + * @author loomchild + */ +public class TargetDataProbabilityComparatorTest { + + /** + * Simple comparator test. + */ + @Test + public void testCompareTo() { + TargetData[] data = new TargetData[] { + new TargetData(0, 0.1), new TargetData(1, 0.5), + new TargetData(2, 0.5) + }; + TargetDataProbabilityComparator comparator = + new TargetDataProbabilityComparator(); + assertTrue(comparator.compare(data[0], data[1]) > 0); + assertTrue(comparator.compare(data[1], data[0]) < 0); + assertTrue(comparator.compare(data[0], data[0]) == 0); + assertTrue(comparator.compare(data[1], data[2]) == 0); + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModel.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModel.java.svn-base new file mode 100644 index 0000000..4918e01 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModel.java.svn-base @@ -0,0 +1,37 @@ +package net.sourceforge.align.model.translation; + +import java.io.Writer; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + + +/** + * Represents translation model which is basically probabilistic dictionary + * - it stores source word translations to target words along with each + * translation probability. + * + * @see Statistical Machine Translation + * @author Jarek Lipski (loomchild) + */ +public interface TranslationModel { + + /** + * Retrieves translation data including translation probabilities to other + * words for a word with given id + * @param sourceWid source word id, >= 0. + * @return translation data + */ + public SourceData get(int sourceWid); + + /** + * Formats the translation model to given writer in plaintext format. + * Used for logging purposes and for storing models. + * @param writer writer + * @param sourceVocabulary source language vocabulary + * @param targetVocabulary target language vocabulary + */ + public void format(Writer writer, Vocabulary sourceVocabulary, + Vocabulary targetVocabulary); + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModelUtil.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModelUtil.java.svn-base new file mode 100644 index 0000000..0ea5c80 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModelUtil.java.svn-base @@ -0,0 +1,180 @@ +package net.sourceforge.align.model.translation; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.model.ModelParseException; +import net.sourceforge.align.model.vocabulary.Vocabulary; + +/** + * Represents translation model utilities. + * Responsible most importantly for training a {@link TranslationModel}, + * but also for parsing it from input stream, etc. + * + * @author Jarek Lipski (loomchild) + */ +public class TranslationModelUtil { + + public static final int DEFAULT_TRAIN_ITERATION_COUNT = 4; + + /** + * Trains translation model using given source and target segments + * (training corpus). + * These source and target segment lists must have the same number of + * segments (in other words they must be aligned one-to-one). + * + * @see "The Mathematics of Statistical Machine Translation: Parameter Estimation, + * Brown, P. F., Della Pietra S. A., Della Pietra, V. J., Mercer, R. L." + * + * @param iterationCount number of training iterations + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return new trained translation model + */ + public static TranslationModel train(int iterationCount, + List< List > sourceSegmentList, + List< List > targetSegmentList) { + assert sourceSegmentList.size() == targetSegmentList.size(); + assert iterationCount >= 1; + + TranslationModel model = new InitialTranslationModel(); + MutableTranslationModel newModel = null; + + for (int iteration = 0; iteration < iterationCount; ++iteration) { + newModel = performTrainingIteration(model, sourceSegmentList, + targetSegmentList); + model = newModel; + } + + newModel.sort(); + + return newModel; + } + + /** + * Trains translation model using {@link #DEFAULT_TRAIN_ITERATION_COUNT} + * number of iterations. + * + * @see #train(int, List, List) + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return new trained translation model + */ + public static TranslationModel train(List< List > sourceSegmentList, + List< List > targetSegmentList) { + return train(DEFAULT_TRAIN_ITERATION_COUNT, sourceSegmentList, + targetSegmentList); + } + + /** + * Performs single translation model training iteration. + * + * Given source and target segment lists must have the same number of + * segments (in other words they must be aligned one-to-one). + * + * TODO: This method needs to be described in more detail. + * + * @param model input translation model + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return new trained translation model + */ + private static MutableTranslationModel performTrainingIteration( + TranslationModel model, + List< List > sourceSegmentList, + List< List > targetSegmentList) { + MutableTranslationModel newModel = new MutableTranslationModel(); + Iterator< List > sourceSegmentIterator = + sourceSegmentList.iterator(); + Iterator< List > targetSegmentIterator = + targetSegmentList.iterator(); + + while(sourceSegmentIterator.hasNext() + && targetSegmentIterator.hasNext()) { + List sourceSegment = sourceSegmentIterator.next(); + List sourceSegmentAndNull = + new ArrayList(sourceSegment.size() + 1); + sourceSegmentAndNull.addAll(sourceSegment); + sourceSegmentAndNull.add(Vocabulary.NULL_WID); + List targetSegment = targetSegmentIterator.next(); + + for (int targetWid : targetSegment) { + double probabilitySum = 0; + + for (int sourceWid : sourceSegmentAndNull) { + probabilitySum += model.get(sourceWid). + getTranslationProbability(targetWid); + } + assert probabilitySum > 0; + + // Commented out Moore optimization. + double minProbabilityChange = + 1.0 / (double)sourceSegmentAndNull.size(); + for (int sourceWid : sourceSegmentAndNull) { + double oldModelProbability = model.get( + sourceWid).getTranslationProbability(targetWid); + double probabilityChange = + oldModelProbability / probabilitySum; + MutableSourceData newModelData; + if (probabilityChange >= minProbabilityChange) { + newModelData = newModel.getMutable(sourceWid); + } else { + newModelData = newModel.getMutable(Vocabulary.NULL_WID); + } + double newModelProbability = + newModelData.getTranslationProbability(targetWid); + newModelData.setTranslationProbability(targetWid, + newModelProbability + probabilityChange); + } + } + } + + newModel.normalize(); + return newModel; + } + + /** + * Parses translation model from input reader. Uses simple plaintext + * format where each line represents a translation and consists of + * source word, target word and translation probability. + * @return parsed translation model + */ + public static TranslationModel parse(Reader reader, + Vocabulary sourceVocabulary, Vocabulary targetVocabulary) { + try { + BufferedReader bufferedReader = new BufferedReader(reader); + MutableTranslationModel translationModel = new MutableTranslationModel(); + String line; + while ((line = bufferedReader.readLine()) != null) { + String[] parts = line.split("\\s"); + if (parts.length == 3) { + String sourceWord = parts[0]; + String targetWord = parts[1]; + double probability = Double.parseDouble(parts[2]); + + int sourceWid = sourceVocabulary.putWord(sourceWord); + int targetWid = targetVocabulary.putWord(targetWord); + + MutableSourceData sourceData = + translationModel.getMutable(sourceWid); + sourceData.setTranslationProbability(targetWid, probability); + } else if (parts.length != 0) { + throw new ModelParseException("Bad number of " + + "line parts."); + } + } + translationModel.normalize(); + translationModel.sort(); + return translationModel; + } catch (NumberFormatException e) { + throw new ModelParseException("Part format error", e); + } catch (IOException e) { + throw new ModelParseException("IO error", e); + } + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModelUtilTest.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModelUtilTest.java.svn-base new file mode 100644 index 0000000..d92a24e --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationModelUtilTest.java.svn-base @@ -0,0 +1,150 @@ +package net.sourceforge.align.model.translation; + +import static net.sourceforge.align.model.Util.createWidList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.StringReader; +import java.util.List; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Represents {@link TranslationModelUtil} unit test. + * @author loomchild + */ +public class TranslationModelUtilTest { + + /** + * Test if {@link TranslationModelUtil#train(int, List, List)} trains the + * model correctly. + * + * First checks if values are distributed correctly after first iteration. + * Later checks if the results converge to optimum. + * + * Does not pass after modifications in training process suggested by Moore + * by introducing minimum probability change. + * + * TODO: Investigate problem, make it pass. + */ + @Ignore + @Test + public void train() { + int[][] sourceWidArray = { + new int[] {}, + new int[] {2}, + new int[] {1, 2, 3}, + }; + int[][] targetWidArray = { + new int[] {3}, + new int[] {2}, + new int[] {1, 2}, + }; + List< List > sourceWidList = createWidList(sourceWidArray); + List< List > targetWidList = createWidList(targetWidArray); + TranslationModel model = + TranslationModelUtil.train(1, sourceWidList, targetWidList); + SourceData sourceData; + List targetDataList; + TargetData targetData; + + sourceData = model.get(0); + targetDataList = sourceData.getTranslationList(); + assertEquals(3, targetDataList.size()); + targetData = targetDataList.get(0); + assertEquals(3, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + targetData = targetDataList.get(1); + assertEquals(2, targetData.getWid()); + assertEquals(0.375, targetData.getProbability(), 0.01); + targetData = targetDataList.get(2); + assertEquals(1, targetData.getWid()); + assertEquals(0.125, targetData.getProbability(), 0.01); + + sourceData = model.get(1); + targetDataList = sourceData.getTranslationList(); + assertEquals(2, targetDataList.size()); + targetData = targetDataList.get(0); + assertEquals(1, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + targetData = targetDataList.get(1); + assertEquals(2, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + + sourceData = model.get(2); + targetDataList = sourceData.getTranslationList(); + assertEquals(2, targetDataList.size()); + targetData = targetDataList.get(0); + assertEquals(2, targetData.getWid()); + assertEquals(0.75, targetData.getProbability(), 0.01); + targetData = targetDataList.get(1); + assertEquals(1, targetData.getWid()); + assertEquals(0.25, targetData.getProbability(), 0.01); + + sourceData = model.get(3); + targetDataList = sourceData.getTranslationList(); + assertEquals(2, targetDataList.size()); + targetData = targetDataList.get(0); + assertEquals(1, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + targetData = targetDataList.get(1); + assertEquals(2, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + + for (int i = 2; i < 4; ++i) { + TranslationModel oldModel = model; + model = + TranslationModelUtil.train(i, sourceWidList, targetWidList); + assertTrue("Iteration " + i, + model.get(0).getTranslationProbability(3) > + oldModel.get(0).getTranslationProbability(3)); + double delta0To2 = oldModel.get(0).getTranslationProbability(2) + - model.get(0).getTranslationProbability(2); + double delta0To1 = oldModel.get(0).getTranslationProbability(1) + - model.get(0).getTranslationProbability(1); + assertTrue("Iteration " + i, delta0To2 < delta0To1); + assertTrue("Iteration " + i, + model.get(2).getTranslationProbability(2) > + oldModel.get(2).getTranslationProbability(2)); + } + + } + + public String TRANSLATION_MODEL = + "b C 0.1\n" + + "b D 0.3\n" + + "c A 0.5\n" + + "a D 0.33\n" + + " "; + + /** + * Tests translation model parsing. + */ + @Test + public void testParse() { + StringReader reader = new StringReader(TRANSLATION_MODEL); + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + TranslationModel translationModel = TranslationModelUtil.parse(reader, + sourceVocabulary, targetVocabulary); + SourceData sourceData; + sourceData = translationModel.get(sourceVocabulary.getWid("a")); + assertEquals(1, sourceData.getTranslationList().size()); + assertEquals(0.0, sourceData.getTranslationProbability(targetVocabulary.getWid("A")), 0.0001); + assertEquals(1.0, sourceData.getTranslationProbability(targetVocabulary.getWid("D")), 0.0001); + sourceData = translationModel.get(sourceVocabulary.getWid("b")); + assertEquals(2, sourceData.getTranslationList().size()); + assertEquals(0.25, sourceData.getTranslationProbability(targetVocabulary.getWid("C")), 0.0001); + assertEquals(0.75, sourceData.getTranslationProbability(targetVocabulary.getWid("D")), 0.0001); + sourceData = translationModel.get(sourceVocabulary.getWid("c")); + assertEquals(1, sourceData.getTranslationList().size()); + assertEquals(1.0, sourceData.getTranslationProbability(targetVocabulary.getWid("A")), 0.0001); + sourceData = translationModel.get(100); + assertEquals(0, sourceData.getTranslationList().size()); + } + +} diff --git a/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationTestSuite.java.svn-base b/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationTestSuite.java.svn-base new file mode 100644 index 0000000..c4024ee --- /dev/null +++ b/src/net/sourceforge/align/model/translation/.svn/text-base/TranslationTestSuite.java.svn-base @@ -0,0 +1,17 @@ +package net.sourceforge.align.model.translation; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents model.translation package unit test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MutableSourceDataTest.class, MutableTranslationModelTest.class, + TargetDataProbabilityComparatorTest.class, TranslationModelUtilTest.class +}) +public class TranslationTestSuite { + +} diff --git a/src/net/sourceforge/align/model/translation/EmptySourceData.java b/src/net/sourceforge/align/model/translation/EmptySourceData.java new file mode 100755 index 0000000..7bd0e98 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/EmptySourceData.java @@ -0,0 +1,33 @@ +package net.sourceforge.align.model.translation; + +import java.util.Collections; +import java.util.List; + + +/** + * Represents empty translation data of source word - + * essentially it means that source word has no translations. + * Always returns empty translation list and probability of translating to + * any word is always zero. + * + * @author Jarek Lipski (loomchild) + */ +class EmptySourceData implements SourceData { + + /** + * @param targetWid target word id + * @return always zero + */ + public double getTranslationProbability(int targetWid) { + assert targetWid >= 0; + return 0; + } + + /** + * @return empty translation list + */ + public List getTranslationList() { + return Collections.emptyList(); + } + +} diff --git a/src/net/sourceforge/align/model/translation/InitialSourceData.java b/src/net/sourceforge/align/model/translation/InitialSourceData.java new file mode 100755 index 0000000..cd50a75 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/InitialSourceData.java @@ -0,0 +1,33 @@ +package net.sourceforge.align.model.translation; + +import java.util.Collections; +import java.util.List; + + +/** + * Represents source translation data in initial model before first training + * iteration. In this state all translations of this source word are equally + * probable and probability is equal to 1. This object is immutable. + * + * @author Jarek Lipski (loomchild) + */ +class InitialSourceData implements SourceData { + + /** + * Always returns one for any word id. + * @param targetWid target word id, >= 0 + * @return always one + */ + public double getTranslationProbability(int targetWid) { + assert targetWid >= 0; + return 1; + } + + /** + * @return empty translation list + */ + public List getTranslationList() { + return Collections.emptyList(); + } + +} diff --git a/src/net/sourceforge/align/model/translation/InitialTranslationModel.java b/src/net/sourceforge/align/model/translation/InitialTranslationModel.java new file mode 100755 index 0000000..e7a0eeb --- /dev/null +++ b/src/net/sourceforge/align/model/translation/InitialTranslationModel.java @@ -0,0 +1,48 @@ +package net.sourceforge.align.model.translation; + +import java.io.Writer; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + + +/** + * Represents initial translation model before first training iteration. + * In this state translation probabilities from any word to any word are + * equal to one. + * This object is immutable. + * + * @author Jarek Lipski (loomchild) + */ +class InitialTranslationModel implements TranslationModel { + + private InitialSourceData translationData;; + + /** + * Creates initial translation model. + */ + public InitialTranslationModel() { + this.translationData = new InitialSourceData(); + } + + /** + * Always returns {@link InitialSourceData}, which means that for any source + * word it translates to any target word with probability equal to 1. + * @param sourceWid source word id, >= 0. + * @return immutable instance of {@link InitialSourceData} + */ + public SourceData get(int sourceWid) { + assert sourceWid >= 0; + return translationData; + } + + /** + * @throws UnsupportedOperationException always because it is not possible + * to format initial model. + */ + public void format(Writer writer, Vocabulary sourceVocabulary, + Vocabulary targetVocabulary) { + throw new UnsupportedOperationException(); + } + +} diff --git a/src/net/sourceforge/align/model/translation/MutableSourceData.java b/src/net/sourceforge/align/model/translation/MutableSourceData.java new file mode 100755 index 0000000..d87b97e --- /dev/null +++ b/src/net/sourceforge/align/model/translation/MutableSourceData.java @@ -0,0 +1,111 @@ +package net.sourceforge.align.model.translation; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Represents mutable translation data for some source word. Used in all + * translation models after initial training iteration. After making changes + * to the stored data {@link #normalize()} and {@link #sort()} methods should + * be called. + * @author loomchild + */ +class MutableSourceData implements SourceData { + + private List translationList; + + /** + * Creates empty source translation data. + */ + public MutableSourceData() { + this.translationList = new ArrayList(); + } + + public double getTranslationProbability(int targetWid) { + int index = findTargetData(targetWid); + if (index != -1) { + return translationList.get(index).getProbability(); + } else { + return 0; + } + } + + /** + * Returns immutable translation list with probability > 0. + * Note: List may not be always sorted, {@link #sort()} method should always + * be executed before calling this method. + * + * @return sorted translation list. + */ + public List getTranslationList() { + return translationList; + } + + /** + * Sets translation probability of this source word to target word with + * given id. After making any changes like this {@link #normalize()} and + * {@link #sort()} methods must be called before retrieving any data + * from the model. + * @param targetWid target word id, >= 0. + * @param probability translation probability. + */ + public void setTranslationProbability(int targetWid, double probability) { + TargetData newData = new TargetData(targetWid, probability); + int index = findTargetData(targetWid); + if (index != -1) { + translationList.set(index, newData); + } else { + translationList.add(newData); + } + } + + /** + * Normalizes translation probabilities so they sum up to one. + * This method should be called after making any changes to this object + * via {@link #setTranslationProbability(int, double)} but before retrieving + * any data from it. + */ + public void normalize() { + double totalProbability = 0.0f; + for (TargetData data : translationList) { + totalProbability += data.getProbability(); + } + int index = 0; + for (TargetData data : translationList) { + double newProbability = data.getProbability() / totalProbability; + TargetData newData = new TargetData(data.getWid(), newProbability); + translationList.set(index, newData); + ++index; + } + } + + /** + * Sorts translation list by probability descending. + * This method should be called after making any changes to this object + * via {@link #setTranslationProbability(int, double)} but before retrieving + * any data from it. + */ + public void sort() { + Collections.sort(translationList, new TargetDataProbabilityComparator()); + } + + /** + * Finds a word with given id on translation list and returns its + * index. If word could not be found returns -1. + * + * @param targetWid target word id + * @return translation data index on the list if it exists or -1. + */ + private int findTargetData(int targetWid) { + int index = 0; + for (TargetData data : translationList) { + if (data.getWid() == targetWid) { + return index; + } + ++index; + } + return -1; + } + +} diff --git a/src/net/sourceforge/align/model/translation/MutableSourceDataTest.java b/src/net/sourceforge/align/model/translation/MutableSourceDataTest.java new file mode 100755 index 0000000..180b748 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/MutableSourceDataTest.java @@ -0,0 +1,45 @@ +package net.sourceforge.align.model.translation; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Test; + +/** + * Represents {@link MutableSourceData} unit test. + * @author loomchild + */ +public class MutableSourceDataTest { + + /** + * Check if {@link MutableSourceData#normalize()} and + * {@link MutableSourceData#sort()} work as expected. + */ + @Test + public void getPutSortNormalize() { + MutableSourceData data = new MutableSourceData(); + assertEquals(0, data.getTranslationList().size()); + assertEquals(0, data.getTranslationProbability(0), 0.000001); + data.setTranslationProbability(0, 0.6f); + assertEquals(0.6, data.getTranslationProbability(0), 0.000001); + data.setTranslationProbability(1, 1.0f); + assertEquals(1.0, data.getTranslationProbability(1), 0.000001); + data.setTranslationProbability(2, 0.4f); + assertEquals(0.4, data.getTranslationProbability(2), 0.000001); + data.normalize(); + data.sort(); + List targetList = data.getTranslationList(); + assertEquals(3, targetList.size()); + TargetData target = targetList.get(0); + assertEquals(0.5, target.getProbability(), 0.000001); + assertEquals(1, target.getWid()); + target = targetList.get(1); + assertEquals(0.3, target.getProbability(), 0.000001); + assertEquals(0, target.getWid()); + target = targetList.get(2); + assertEquals(0.2, target.getProbability(), 0.000001); + assertEquals(2, target.getWid()); + } + +} diff --git a/src/net/sourceforge/align/model/translation/MutableTranslationModel.java b/src/net/sourceforge/align/model/translation/MutableTranslationModel.java new file mode 100755 index 0000000..1116b76 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/MutableTranslationModel.java @@ -0,0 +1,103 @@ +package net.sourceforge.align.model.translation; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + + +/** + * Represents mutable translation model (probabilistic dictionary). + * After model training iteration and before retrieving any data from + * it {@link #normalize()} and {@link #sort()} methods should be called. + * + * @author Jarek Lipski (loomchild) + */ +public class MutableTranslationModel implements TranslationModel { + + ArrayList translationArray; + + /** + * Creates empty translation model. + */ + public MutableTranslationModel() { + this.translationArray = new ArrayList(); + } + + public SourceData get(int sourceWid) { + assert sourceWid >= 0; + if (sourceWid < translationArray.size()) { + return translationArray.get(sourceWid); + } else { + return new EmptySourceData(); + } + } + + /** + * Retrieves mutable translation data including translation probabilities + * to other words for a word with given id. If the source word is not + * present in the model it is automatically created. + * @param sourceWid source word id, >= 0. + * @return translation data + */ + public MutableSourceData getMutable(int sourceWid) { + assert sourceWid >= 0; + ensureSize(sourceWid + 1); + return translationArray.get(sourceWid); + } + + /** + * Normalizes all contained source word translations by using + * {@link MutableSourceData#normalize()}. + * This method should be called after model training iteration + * but before retrieving any data from it. + */ + public void normalize() { + for (MutableSourceData data : translationArray) { + data.normalize(); + } + } + + /** + * Sorts all contained source word translations by using + * {@link MutableSourceData#sort()}. + * This method should be called after model training iteration + * but before retrieving any data from it. + */ + public void sort() { + for (MutableSourceData data : translationArray) { + data.sort(); + } + } + + /** + * Ensures that translation array has given size by expanding + * it with empty {@link MutableSourceData} objects. + * @param size + */ + private void ensureSize(int size) { + int currentSize = translationArray.size(); + if (size > currentSize) { + translationArray.ensureCapacity(size); + for (int i = currentSize; i < size; ++i) { + translationArray.add(new MutableSourceData()); + } + } + } + + public void format(Writer writer, Vocabulary sourceVocabulary, + Vocabulary targetVocabulary) { + PrintWriter printWriter = new PrintWriter(writer, true); + for (int i = 0; i < translationArray.size(); ++i) { + MutableSourceData sourceData = translationArray.get(i); + for (TargetData targetData : sourceData.getTranslationList()) { + printWriter.println(sourceVocabulary.getWord(i) + "\t" + + targetVocabulary.getWord(targetData.getWid()) + "\t" + + targetData.getProbability()); + } + } + } + +} diff --git a/src/net/sourceforge/align/model/translation/MutableTranslationModelTest.java b/src/net/sourceforge/align/model/translation/MutableTranslationModelTest.java new file mode 100755 index 0000000..4abcbc6 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/MutableTranslationModelTest.java @@ -0,0 +1,37 @@ +package net.sourceforge.align.model.translation; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Represents {@link MutableTranslationModel} unit test. + * @author loomchild + */ +public class MutableTranslationModelTest { + + /** + * Checks whether {@link MutableTranslationModel#normalize()} and + * {@link MutableTranslationModel#sort()} work as expected. + */ + @Test + public void putNormalizeSort() { + MutableTranslationModel model = new MutableTranslationModel(); + + assertEquals(0, model.get(0).getTranslationList().size()); + + model.getMutable(1).setTranslationProbability(0, 0.5); + model.getMutable(1).setTranslationProbability(1, 1.5); + + assertEquals(0.5, model.get(1).getTranslationProbability(0), 0.00001); + assertEquals(1.5, model.get(1).getTranslationProbability(1), 0.00001); + model.normalize(); + assertEquals(0.25, model.get(1).getTranslationProbability(0), 0.00001); + assertEquals(0.75, model.get(1).getTranslationProbability(1), 0.00001); + + assertEquals(0, model.get(1).getTranslationList().get(0).getWid()); + model.sort(); + assertEquals(1, model.get(1).getTranslationList().get(0).getWid()); + } + +} diff --git a/src/net/sourceforge/align/model/translation/SourceData.java b/src/net/sourceforge/align/model/translation/SourceData.java new file mode 100755 index 0000000..ef12dec --- /dev/null +++ b/src/net/sourceforge/align/model/translation/SourceData.java @@ -0,0 +1,28 @@ +package net.sourceforge.align.model.translation; + +import java.util.List; + + +/** + * Represents source word translations with probabilities. + * + * @author Jarek Lipski (loomchild) + */ +public interface SourceData { + + /** + * Returns probability of translating this source word to a target + * word with given id. + * @param targetWid target word id + * @return translation probability + */ + public double getTranslationProbability(int targetWid); + + /** + * Returns immutable list of translations with probability greater than + * zero, sorted by probability descending. + * @return list of translations (essentially word, probability pairs) + */ + public List getTranslationList(); + +} diff --git a/src/net/sourceforge/align/model/translation/TargetData.java b/src/net/sourceforge/align/model/translation/TargetData.java new file mode 100755 index 0000000..55d1a6c --- /dev/null +++ b/src/net/sourceforge/align/model/translation/TargetData.java @@ -0,0 +1,39 @@ +package net.sourceforge.align.model.translation; + + +/** + * Represents single source word translation. + * Responsible for storing target word id and translation probability. + * @author loomchild + */ +public class TargetData { + + private int wid; + + private double probability; + + /** + * Creates target data. + * @param wid target word id + * @param probability translation probability + */ + public TargetData(int wid, double probability) { + this.wid = wid; + this.probability = probability; + } + + /** + * @return target word id + */ + public int getWid() { + return wid; + } + + /** + * @return source to target word translation probability + */ + public double getProbability() { + return probability; + } + +} diff --git a/src/net/sourceforge/align/model/translation/TargetDataProbabilityComparator.java b/src/net/sourceforge/align/model/translation/TargetDataProbabilityComparator.java new file mode 100755 index 0000000..a1817dc --- /dev/null +++ b/src/net/sourceforge/align/model/translation/TargetDataProbabilityComparator.java @@ -0,0 +1,27 @@ +package net.sourceforge.align.model.translation; + +import java.io.Serializable; +import java.util.Comparator; + +/** + * Responsible for comparing {@link TargetData} objects by translation + * probability and ordering them from the most probable to the least probable. + * @author loomchild + */ +public class TargetDataProbabilityComparator + implements Comparator, Serializable { + + private static final long serialVersionUID = -9161863179489700671L; + + public int compare(TargetData o1, TargetData o2) { + double difference = o2.getProbability() - o1.getProbability(); + if (difference > 0) { + return 1; + } else if (difference < 0) { + return -1; + } else { + return 0; + } + } + +} diff --git a/src/net/sourceforge/align/model/translation/TargetDataProbabilityComparatorTest.java b/src/net/sourceforge/align/model/translation/TargetDataProbabilityComparatorTest.java new file mode 100755 index 0000000..a6a4239 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/TargetDataProbabilityComparatorTest.java @@ -0,0 +1,30 @@ +package net.sourceforge.align.model.translation; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Represents {@link TargetDataProbabilityComparator} unit test. + * @author loomchild + */ +public class TargetDataProbabilityComparatorTest { + + /** + * Simple comparator test. + */ + @Test + public void testCompareTo() { + TargetData[] data = new TargetData[] { + new TargetData(0, 0.1), new TargetData(1, 0.5), + new TargetData(2, 0.5) + }; + TargetDataProbabilityComparator comparator = + new TargetDataProbabilityComparator(); + assertTrue(comparator.compare(data[0], data[1]) > 0); + assertTrue(comparator.compare(data[1], data[0]) < 0); + assertTrue(comparator.compare(data[0], data[0]) == 0); + assertTrue(comparator.compare(data[1], data[2]) == 0); + } + +} diff --git a/src/net/sourceforge/align/model/translation/TranslationModel.java b/src/net/sourceforge/align/model/translation/TranslationModel.java new file mode 100755 index 0000000..4918e01 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/TranslationModel.java @@ -0,0 +1,37 @@ +package net.sourceforge.align.model.translation; + +import java.io.Writer; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + + + +/** + * Represents translation model which is basically probabilistic dictionary + * - it stores source word translations to target words along with each + * translation probability. + * + * @see Statistical Machine Translation + * @author Jarek Lipski (loomchild) + */ +public interface TranslationModel { + + /** + * Retrieves translation data including translation probabilities to other + * words for a word with given id + * @param sourceWid source word id, >= 0. + * @return translation data + */ + public SourceData get(int sourceWid); + + /** + * Formats the translation model to given writer in plaintext format. + * Used for logging purposes and for storing models. + * @param writer writer + * @param sourceVocabulary source language vocabulary + * @param targetVocabulary target language vocabulary + */ + public void format(Writer writer, Vocabulary sourceVocabulary, + Vocabulary targetVocabulary); + +} diff --git a/src/net/sourceforge/align/model/translation/TranslationModelUtil.java b/src/net/sourceforge/align/model/translation/TranslationModelUtil.java new file mode 100755 index 0000000..0ea5c80 --- /dev/null +++ b/src/net/sourceforge/align/model/translation/TranslationModelUtil.java @@ -0,0 +1,180 @@ +package net.sourceforge.align.model.translation; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.model.ModelParseException; +import net.sourceforge.align.model.vocabulary.Vocabulary; + +/** + * Represents translation model utilities. + * Responsible most importantly for training a {@link TranslationModel}, + * but also for parsing it from input stream, etc. + * + * @author Jarek Lipski (loomchild) + */ +public class TranslationModelUtil { + + public static final int DEFAULT_TRAIN_ITERATION_COUNT = 4; + + /** + * Trains translation model using given source and target segments + * (training corpus). + * These source and target segment lists must have the same number of + * segments (in other words they must be aligned one-to-one). + * + * @see "The Mathematics of Statistical Machine Translation: Parameter Estimation, + * Brown, P. F., Della Pietra S. A., Della Pietra, V. J., Mercer, R. L." + * + * @param iterationCount number of training iterations + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return new trained translation model + */ + public static TranslationModel train(int iterationCount, + List< List > sourceSegmentList, + List< List > targetSegmentList) { + assert sourceSegmentList.size() == targetSegmentList.size(); + assert iterationCount >= 1; + + TranslationModel model = new InitialTranslationModel(); + MutableTranslationModel newModel = null; + + for (int iteration = 0; iteration < iterationCount; ++iteration) { + newModel = performTrainingIteration(model, sourceSegmentList, + targetSegmentList); + model = newModel; + } + + newModel.sort(); + + return newModel; + } + + /** + * Trains translation model using {@link #DEFAULT_TRAIN_ITERATION_COUNT} + * number of iterations. + * + * @see #train(int, List, List) + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return new trained translation model + */ + public static TranslationModel train(List< List > sourceSegmentList, + List< List > targetSegmentList) { + return train(DEFAULT_TRAIN_ITERATION_COUNT, sourceSegmentList, + targetSegmentList); + } + + /** + * Performs single translation model training iteration. + * + * Given source and target segment lists must have the same number of + * segments (in other words they must be aligned one-to-one). + * + * TODO: This method needs to be described in more detail. + * + * @param model input translation model + * @param sourceSegmentList source segment list + * @param targetSegmentList target segment list + * @return new trained translation model + */ + private static MutableTranslationModel performTrainingIteration( + TranslationModel model, + List< List > sourceSegmentList, + List< List > targetSegmentList) { + MutableTranslationModel newModel = new MutableTranslationModel(); + Iterator< List > sourceSegmentIterator = + sourceSegmentList.iterator(); + Iterator< List > targetSegmentIterator = + targetSegmentList.iterator(); + + while(sourceSegmentIterator.hasNext() + && targetSegmentIterator.hasNext()) { + List sourceSegment = sourceSegmentIterator.next(); + List sourceSegmentAndNull = + new ArrayList(sourceSegment.size() + 1); + sourceSegmentAndNull.addAll(sourceSegment); + sourceSegmentAndNull.add(Vocabulary.NULL_WID); + List targetSegment = targetSegmentIterator.next(); + + for (int targetWid : targetSegment) { + double probabilitySum = 0; + + for (int sourceWid : sourceSegmentAndNull) { + probabilitySum += model.get(sourceWid). + getTranslationProbability(targetWid); + } + assert probabilitySum > 0; + + // Commented out Moore optimization. + double minProbabilityChange = + 1.0 / (double)sourceSegmentAndNull.size(); + for (int sourceWid : sourceSegmentAndNull) { + double oldModelProbability = model.get( + sourceWid).getTranslationProbability(targetWid); + double probabilityChange = + oldModelProbability / probabilitySum; + MutableSourceData newModelData; + if (probabilityChange >= minProbabilityChange) { + newModelData = newModel.getMutable(sourceWid); + } else { + newModelData = newModel.getMutable(Vocabulary.NULL_WID); + } + double newModelProbability = + newModelData.getTranslationProbability(targetWid); + newModelData.setTranslationProbability(targetWid, + newModelProbability + probabilityChange); + } + } + } + + newModel.normalize(); + return newModel; + } + + /** + * Parses translation model from input reader. Uses simple plaintext + * format where each line represents a translation and consists of + * source word, target word and translation probability. + * @return parsed translation model + */ + public static TranslationModel parse(Reader reader, + Vocabulary sourceVocabulary, Vocabulary targetVocabulary) { + try { + BufferedReader bufferedReader = new BufferedReader(reader); + MutableTranslationModel translationModel = new MutableTranslationModel(); + String line; + while ((line = bufferedReader.readLine()) != null) { + String[] parts = line.split("\\s"); + if (parts.length == 3) { + String sourceWord = parts[0]; + String targetWord = parts[1]; + double probability = Double.parseDouble(parts[2]); + + int sourceWid = sourceVocabulary.putWord(sourceWord); + int targetWid = targetVocabulary.putWord(targetWord); + + MutableSourceData sourceData = + translationModel.getMutable(sourceWid); + sourceData.setTranslationProbability(targetWid, probability); + } else if (parts.length != 0) { + throw new ModelParseException("Bad number of " + + "line parts."); + } + } + translationModel.normalize(); + translationModel.sort(); + return translationModel; + } catch (NumberFormatException e) { + throw new ModelParseException("Part format error", e); + } catch (IOException e) { + throw new ModelParseException("IO error", e); + } + } + +} diff --git a/src/net/sourceforge/align/model/translation/TranslationModelUtilTest.java b/src/net/sourceforge/align/model/translation/TranslationModelUtilTest.java new file mode 100755 index 0000000..d92a24e --- /dev/null +++ b/src/net/sourceforge/align/model/translation/TranslationModelUtilTest.java @@ -0,0 +1,150 @@ +package net.sourceforge.align.model.translation; + +import static net.sourceforge.align.model.Util.createWidList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.StringReader; +import java.util.List; + +import net.sourceforge.align.model.vocabulary.Vocabulary; + +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Represents {@link TranslationModelUtil} unit test. + * @author loomchild + */ +public class TranslationModelUtilTest { + + /** + * Test if {@link TranslationModelUtil#train(int, List, List)} trains the + * model correctly. + * + * First checks if values are distributed correctly after first iteration. + * Later checks if the results converge to optimum. + * + * Does not pass after modifications in training process suggested by Moore + * by introducing minimum probability change. + * + * TODO: Investigate problem, make it pass. + */ + @Ignore + @Test + public void train() { + int[][] sourceWidArray = { + new int[] {}, + new int[] {2}, + new int[] {1, 2, 3}, + }; + int[][] targetWidArray = { + new int[] {3}, + new int[] {2}, + new int[] {1, 2}, + }; + List< List > sourceWidList = createWidList(sourceWidArray); + List< List > targetWidList = createWidList(targetWidArray); + TranslationModel model = + TranslationModelUtil.train(1, sourceWidList, targetWidList); + SourceData sourceData; + List targetDataList; + TargetData targetData; + + sourceData = model.get(0); + targetDataList = sourceData.getTranslationList(); + assertEquals(3, targetDataList.size()); + targetData = targetDataList.get(0); + assertEquals(3, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + targetData = targetDataList.get(1); + assertEquals(2, targetData.getWid()); + assertEquals(0.375, targetData.getProbability(), 0.01); + targetData = targetDataList.get(2); + assertEquals(1, targetData.getWid()); + assertEquals(0.125, targetData.getProbability(), 0.01); + + sourceData = model.get(1); + targetDataList = sourceData.getTranslationList(); + assertEquals(2, targetDataList.size()); + targetData = targetDataList.get(0); + assertEquals(1, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + targetData = targetDataList.get(1); + assertEquals(2, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + + sourceData = model.get(2); + targetDataList = sourceData.getTranslationList(); + assertEquals(2, targetDataList.size()); + targetData = targetDataList.get(0); + assertEquals(2, targetData.getWid()); + assertEquals(0.75, targetData.getProbability(), 0.01); + targetData = targetDataList.get(1); + assertEquals(1, targetData.getWid()); + assertEquals(0.25, targetData.getProbability(), 0.01); + + sourceData = model.get(3); + targetDataList = sourceData.getTranslationList(); + assertEquals(2, targetDataList.size()); + targetData = targetDataList.get(0); + assertEquals(1, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + targetData = targetDataList.get(1); + assertEquals(2, targetData.getWid()); + assertEquals(0.5, targetData.getProbability(), 0.01); + + for (int i = 2; i < 4; ++i) { + TranslationModel oldModel = model; + model = + TranslationModelUtil.train(i, sourceWidList, targetWidList); + assertTrue("Iteration " + i, + model.get(0).getTranslationProbability(3) > + oldModel.get(0).getTranslationProbability(3)); + double delta0To2 = oldModel.get(0).getTranslationProbability(2) + - model.get(0).getTranslationProbability(2); + double delta0To1 = oldModel.get(0).getTranslationProbability(1) + - model.get(0).getTranslationProbability(1); + assertTrue("Iteration " + i, delta0To2 < delta0To1); + assertTrue("Iteration " + i, + model.get(2).getTranslationProbability(2) > + oldModel.get(2).getTranslationProbability(2)); + } + + } + + public String TRANSLATION_MODEL = + "b C 0.1\n" + + "b D 0.3\n" + + "c A 0.5\n" + + "a D 0.33\n" + + " "; + + /** + * Tests translation model parsing. + */ + @Test + public void testParse() { + StringReader reader = new StringReader(TRANSLATION_MODEL); + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + TranslationModel translationModel = TranslationModelUtil.parse(reader, + sourceVocabulary, targetVocabulary); + SourceData sourceData; + sourceData = translationModel.get(sourceVocabulary.getWid("a")); + assertEquals(1, sourceData.getTranslationList().size()); + assertEquals(0.0, sourceData.getTranslationProbability(targetVocabulary.getWid("A")), 0.0001); + assertEquals(1.0, sourceData.getTranslationProbability(targetVocabulary.getWid("D")), 0.0001); + sourceData = translationModel.get(sourceVocabulary.getWid("b")); + assertEquals(2, sourceData.getTranslationList().size()); + assertEquals(0.25, sourceData.getTranslationProbability(targetVocabulary.getWid("C")), 0.0001); + assertEquals(0.75, sourceData.getTranslationProbability(targetVocabulary.getWid("D")), 0.0001); + sourceData = translationModel.get(sourceVocabulary.getWid("c")); + assertEquals(1, sourceData.getTranslationList().size()); + assertEquals(1.0, sourceData.getTranslationProbability(targetVocabulary.getWid("A")), 0.0001); + sourceData = translationModel.get(100); + assertEquals(0, sourceData.getTranslationList().size()); + } + +} diff --git a/src/net/sourceforge/align/model/translation/TranslationTestSuite.java b/src/net/sourceforge/align/model/translation/TranslationTestSuite.java new file mode 100755 index 0000000..c4024ee --- /dev/null +++ b/src/net/sourceforge/align/model/translation/TranslationTestSuite.java @@ -0,0 +1,17 @@ +package net.sourceforge.align.model.translation; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents model.translation package unit test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + MutableSourceDataTest.class, MutableTranslationModelTest.class, + TargetDataProbabilityComparatorTest.class, TranslationModelUtilTest.class +}) +public class TranslationTestSuite { + +} diff --git a/src/net/sourceforge/align/model/vocabulary/.svn/all-wcprops b/src/net/sourceforge/align/model/vocabulary/.svn/all-wcprops new file mode 100644 index 0000000..df03a92 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/.svn/all-wcprops @@ -0,0 +1,35 @@ +K 25 +svn:wc:ra_dav:version-url +V 83 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/vocabulary +END +VocabularyTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 108 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/vocabulary/VocabularyTestSuite.java +END +VocabularyUtilTest.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/vocabulary/VocabularyUtilTest.java +END +VocabularyUtil.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/model/vocabulary/VocabularyUtil.java +END +VocabularyTest.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/model/vocabulary/VocabularyTest.java +END +Vocabulary.java +K 25 +svn:wc:ra_dav:version-url +V 99 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/model/vocabulary/Vocabulary.java +END diff --git a/src/net/sourceforge/align/model/vocabulary/.svn/entries b/src/net/sourceforge/align/model/vocabulary/.svn/entries new file mode 100644 index 0000000..cc40cd0 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/.svn/entries @@ -0,0 +1,198 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/model/vocabulary +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Vocabulary.java +file +53 + + + +2010-12-29T17:28:47.000000Z +3ea47c23180e4eb3fe6e1678cb74305d +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +3749 + +VocabularyTest.java +file + + + + +2010-11-04T18:33:57.000000Z +49421660ef2b1df6c4031d3c786e09ff +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +1058 + +VocabularyTestSuite.java +file + + + + +2010-11-04T18:30:40.000000Z +b77870af7fb1efb3ea08e1099bb0ebca +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +322 + +VocabularyUtil.java +file +53 + + + +2010-12-29T17:07:16.000000Z +a014c7f314eb3fdda9264650c70a33af +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +7708 + +VocabularyUtilTest.java +file + + + + +2010-11-10T18:30:55.000000Z +e445321359fd6ede02cecc501465d4c1 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +3697 + diff --git a/src/net/sourceforge/align/model/vocabulary/.svn/text-base/Vocabulary.java.svn-base b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/Vocabulary.java.svn-base new file mode 100644 index 0000000..d1908b3 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/Vocabulary.java.svn-base @@ -0,0 +1,160 @@ +package net.sourceforge.align.model.vocabulary; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + + +/** + * Represents a vocabulary mapping words to identifiers. + * + * @author Jarek Lipski (loomchild) + */ +public class Vocabulary { + + public static final int NULL_WID = 0; + + public static final String NULL_WORD = "{NULL}"; + + private List wordArray; + + private Map wordMap; + + /** + * Creates vocabulary containing just special null word {@link #NULL_WORD} + * with {@link #NULL_WID} identifier. + */ + public Vocabulary() { + this.wordArray = new ArrayList(); + this.wordMap = new HashMap(); + putWord(NULL_WORD); + } + + /** + * Creates a vocabulary containing special null word and inserts all + * words from the collections to it, generating word ids. + * @param wordCollection + */ + public Vocabulary(Collection wordCollection) { + this(); + for (String word : wordCollection) { + putWord(word); + } + } + + /** + * Finds an identifier for a given word. If the word does not exist + * in the vocabulary returns null. + * + * @param word word + * @return word id or null + */ + public Integer getWid(String word) { + Integer wid = wordMap.get(word); + return wid; + } + + /** + * Convenience method that retrieves all the words from the list using + * {@link #getWid(String)} and returns a list of identifiers. If some + * words cannot be found in the vocabulary then corresponding identifiers + * on the resulting list will be null. + * + * @param wordList list of words + * @return list of word ids + */ + public List getWidList(List wordList) { + List widList = new ArrayList(); + for (String word : wordList) { + widList.add(getWid(word)); + } + return widList; + } + + /** + * Checks if given word id is present in the vocabulary. + * @param wid word id + * @return true if given word id is present in the vocabulary + */ + public boolean containsWid(int wid) { + return wid >= 0 && wid < wordArray.size(); + } + + /** + * Returns a word by given identifier. If the word is not present in the + * vocabulary returns null. + * + * @param wid word id + * @return word or null + */ + public String getWord(int wid) { + if (wid < wordArray.size()) { + return wordArray.get(wid); + } else { + return null; + } + } + + /** + * Checks if given word is present in the vocabulary. + * @param word word + * @return true if given word is present in the vocabulary + */ + public boolean containsWord(String word) { + return wordMap.containsKey(word); + } + + /** + * Adds a new word to the vocabulary if it is not present, otherwise + * does nothing. + * + * @param word word + * @return returns word id + */ + public int putWord(String word) { + Integer wid = wordMap.get(word); + if (wid == null) { + wid = wordArray.size(); + wordArray.add(word); + wordMap.put(word, wid); + } + return wid; + } + + /** + * Convenience method to add words from given list to the vocabulary using + * {@link #putWord(String)}. + * @param wordList word list + */ + public void putWordList(List wordList) { + for (String word : wordList) { + putWord(word); + } + } + + /** + * @return number of words in the vocabulary + */ + public int getWordCount() { + return wordArray.size() - 1; + } + + /** + * Formats the vocabulary to given writer in plaintext format. + * Used for logging purposes and for storing models. + * @param writer writer + */ + public void format(Writer writer) { + PrintWriter printWriter = new PrintWriter(writer, true); + for (int i = 0; i < wordArray.size(); ++i) { + printWriter.println(i + "\t" + wordArray.get(i)); + } + } + + +} diff --git a/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyTest.java.svn-base b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyTest.java.svn-base new file mode 100644 index 0000000..b0531f9 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyTest.java.svn-base @@ -0,0 +1,37 @@ +package net.sourceforge.align.model.vocabulary; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Represents {@link Vocabulary} unit test. + * @author loomchild + */ +public class VocabularyTest { + + /** + * Performs various tests on vocabulary including adding words, getting + * the word ids, etc. + */ + @Test + public void testVocabulary() { + Vocabulary vocabulary = new Vocabulary(); + assertFalse(vocabulary.containsWord("a b")); + assertNull(vocabulary.getWid("a b")); + assertTrue(vocabulary.containsWid(Vocabulary.NULL_WID)); + assertFalse(vocabulary.containsWid(10)); + assertEquals(0, vocabulary.getWordCount()); + vocabulary.putWord("a b"); + assertEquals(1, vocabulary.getWordCount()); + assertTrue(vocabulary.containsWord("a b")); + int wid = 1; + assertEquals(wid, vocabulary.getWid("a b")); + assertTrue(vocabulary.containsWid(wid)); + assertEquals("a b", vocabulary.getWord(wid)); + } + +} diff --git a/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyTestSuite.java.svn-base b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyTestSuite.java.svn-base new file mode 100644 index 0000000..c54ae23 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyTestSuite.java.svn-base @@ -0,0 +1,16 @@ +package net.sourceforge.align.model.vocabulary; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents vocabulary package test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + VocabularyTest.class, VocabularyUtilTest.class +}) +public class VocabularyTestSuite { + +} diff --git a/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyUtil.java.svn-base b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyUtil.java.svn-base new file mode 100644 index 0000000..1402720 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyUtil.java.svn-base @@ -0,0 +1,228 @@ +package net.sourceforge.align.model.vocabulary; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.modifier.modify.split.FilterNonWordsSplitAlgorithmDecorator; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.WordSplitAlgorithm; +import net.sourceforge.align.model.ModelParseException; + +public class VocabularyUtil { + + /** + * Parser vocabulary from given reader using simple text format. The + * vocabulary can be formatted using + * {@link Vocabulary#format(java.io.Writer)} method. + * + * @param reader input stream + * @return parsed vocabulary + */ + public static Vocabulary parse(Reader reader) { + try { + BufferedReader bufferedReader = new BufferedReader(reader); + Vocabulary vocabulary = new Vocabulary(); + String line; + int expectedWid = vocabulary.getWordCount() + 1; + while ((line = bufferedReader.readLine()) != null) { + String[] parts = line.split("\\s"); + if (parts.length == 2) { + int wid = Integer.parseInt(parts[0]); + String word = parts[1]; + if (wid != expectedWid) { + throw new ModelParseException("Word ordering error"); + } + vocabulary.putWord(word); + ++expectedWid; + } else if (parts.length != 0) { + throw new ModelParseException("Bad number of " + + "line parts."); + } + } + return vocabulary; + } catch (NumberFormatException e) { + throw new ModelParseException("Part format error", e); + } catch (IOException e) { + throw new ModelParseException("IO error", e); + } + } + + /** + * Default word tokenization algorithm. + */ + public static final SplitAlgorithm DEFAULT_TOKENIZE_ALGORITHM = + new FilterNonWordsSplitAlgorithmDecorator(new WordSplitAlgorithm()); + + /** + * For each alignment on input alignment list tokenizes all the segments + * into words, inserts the words into appropriate vocabulary + * (source or target) and returns a list of lists of source and target + * word ids grouped by alignment. + * + * @param splitAlgorithm + * @param alignmentList + * @param sourceVocabulary + * @param targetVocabulary + * @param sourceWidList + * @param targetWidList + */ + public static void tokenize(SplitAlgorithm splitAlgorithm, + List alignmentList, + Vocabulary sourceVocabulary, + Vocabulary targetVocabulary, + List> sourceWidList, + List> targetWidList) { + + for (Alignment alignment : alignmentList) { + sourceWidList.add(tokenizePutGet(splitAlgorithm, + alignment.getSourceSegmentList(), sourceVocabulary)); + targetWidList.add(tokenizePutGet(splitAlgorithm, + alignment.getTargetSegmentList(), targetVocabulary)); + } + + } + + /** + * Tokenizes given segment list into words, puts them into given + * vocabulary and returns their identifiers. + * + * @param splitAlgorithm algorithm used to split segments into words + * @param segmentList list of input segments + * @param vocabulary vocabulary which will be expanded + * @return list of word ids + */ + private static List tokenizePutGet(SplitAlgorithm splitAlgorithm, + List segmentList, Vocabulary vocabulary) { + List wordList = splitAlgorithm.modify(segmentList); + vocabulary.putWordList(wordList); + List widList = vocabulary.getWidList(wordList); + return widList; + } + + /** + * Tokenizes given segment list into words and retrieves their identifiers + * from given vocabulary. + * + * @param splitAlgorithm algorithm used to split segments into words + * @param segmentList list of input segments + * @param vocabulary vocabulary from which word ids will be retrieved + * @return list of word ids + */ + public static List tokenize(SplitAlgorithm splitAlgorithm, + List segmentList, Vocabulary vocabulary) { + List wordList = splitAlgorithm.modify(segmentList); + List widList = vocabulary.getWidList(wordList); + return widList; + } + + + public static final int DEFAULT_MAX_WORD_COUNT = 5000; + + public static final int DEFAULT_MIN_OCCURRENCE_COUNT = 2; + + /** + * Creates new vocabulary from given one with the most popular words + * from given word id list. Only the words that occur at least + * given minOccurrenceCount times will be preserved. Also resulting + * vocabulary can not contain more words than given maxWordCount, + * so the less popular ones will be omitted. + * + * @param widList word id list + * @param vocabulary initial vocabulary; it will not be modified + * @param maxWordCount maximum word count for the new vocabulary + * @param minOccurrenceCount minimum number of times the word must occur + * in reference word id list to be included in truncated vocabulary + * @return truncated vocabulary + */ + public static Vocabulary createTruncatedVocabulary( + List> widList, Vocabulary vocabulary, + int maxWordCount, int minOccurrenceCount) { + + // Occurrence threshold over which words are considered not rare. + int occurrenceThreshold = minOccurrenceCount; + + // Number of words to leave with occurrence count equal to threshold. + int occurrenceCountThreshold = Integer.MAX_VALUE; + + int[] occurrenceCountArray = new int[vocabulary.getWordCount() + 1]; + Arrays.fill(occurrenceCountArray, 0); + // Ignore null word + occurrenceCountArray[0] = -1; + + for (List widSegment : widList) { + for (int wid : widSegment) { + ++occurrenceCountArray[wid]; + } + } + + // If there's too much words. + if (vocabulary.getWordCount() > maxWordCount) { + if (maxWordCount == 0) { + occurrenceThreshold = Integer.MAX_VALUE; + } else { + int[] occurrenceCountArrayCopy = Arrays.copyOf( + occurrenceCountArray, occurrenceCountArray.length); + Arrays.sort(occurrenceCountArrayCopy); + + // If the minOccurenceCount is too small to remove enough words. + int index = occurrenceCountArrayCopy.length - maxWordCount; + if (occurrenceCountArrayCopy[index] >= minOccurrenceCount) { + occurrenceThreshold = occurrenceCountArrayCopy[index]; + ++index; + while ((index < occurrenceCountArrayCopy.length) && + (occurrenceCountArrayCopy[index] == + occurrenceThreshold)) { + ++index; + } + occurrenceCountThreshold = index - + (occurrenceCountArrayCopy.length - maxWordCount); + } + } + } + + Vocabulary resultVocabulary = new Vocabulary(); + + // Start from 1, null word will be in truncated vocabulary anyway. + for (int wid = 1; wid < occurrenceCountArray.length; ++wid) { + int occurenceCount = occurrenceCountArray[wid]; + String word = vocabulary.getWord(wid); + if (occurenceCount > occurrenceThreshold) { + resultVocabulary.putWord(word); + } else if (occurenceCount == occurrenceThreshold + && occurrenceCountThreshold > 0) { + resultVocabulary.putWord(word); + --occurrenceCountThreshold; + } + } + + return resultVocabulary; + } + + /** + * + * @param widList + * @param vocabulary + * @return + */ + /** + * Creates new vocabulary from given one with the most popular words + * from given word id list. Uses + * {@link #createTruncatedVocabulary(List, Vocabulary, int, int)} + * with {@link #DEFAULT_MAX_WORD_COUNT} and + * {@link #DEFAULT_MIN_OCCURRENCE_COUNT}. + * + * @param widList word id list + * @param vocabulary initial vocabulary; it will not be modified + * @return truncated vocabulary + */ + public static Vocabulary createTruncatedVocabulary( + List> widList, Vocabulary vocabulary) { + return createTruncatedVocabulary(widList, vocabulary, + DEFAULT_MAX_WORD_COUNT, DEFAULT_MIN_OCCURRENCE_COUNT); + } + +} diff --git a/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyUtilTest.java.svn-base b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyUtilTest.java.svn-base new file mode 100644 index 0000000..d81e50b --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/.svn/text-base/VocabularyUtilTest.java.svn-base @@ -0,0 +1,140 @@ +package net.sourceforge.align.model.vocabulary; + +import static org.junit.Assert.assertEquals; + +import java.io.StringReader; +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.model.ModelParseException; +import net.sourceforge.align.model.Util; + +import org.junit.Test; + +/** + * Represents vocabulary utilities test suite. + * @author loomchild + */ +public class VocabularyUtilTest { + + public String VOCABULARY_STRING = + "1 ala\n" + + "2 ma\n" + + "3 kota\n" + + " "; + + /** + * Test vocabulary parsing. + */ + @Test + public void testParse() { + StringReader reader = new StringReader(VOCABULARY_STRING); + Vocabulary vocabulary = VocabularyUtil.parse(reader); + assertEquals(3, vocabulary.getWordCount()); + assertEquals(1, vocabulary.getWid("ala")); + assertEquals("kota", vocabulary.getWord(3)); + } + + public String VOCABULARY_UNORDERED_STRING = + "1 ala\n" + + "3 ma\n" + + "2 kota\n" + + ""; + + /** + * Tests that vocabulary will throw an exception if vocabulary is unordered. + */ + @Test(expected=ModelParseException.class) + public void testParseUnordered() { + StringReader reader = new StringReader(VOCABULARY_UNORDERED_STRING); + VocabularyUtil.parse(reader); + } + + + public static final List> WID_LIST = + Util.createWidList(new int[][] { + new int[] {1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3}, + new int[] {4, 4, 4, 5, 5, 6} + }); + + public static final Vocabulary VOCABULARY = + new Vocabulary(Arrays.asList( + new String[] {"aaa", "bbb", "ccc", "ddd", "eee", "fff"} + )); + + + public static final int MAX_WORD_COUNT_1 = 10; + + public static final int MIN_OCCURENCE_COUNT_1 = 3; + + public static final String[] EXPECTED_TRUNCATED_VOCABULARY_1 = + new String[] { + "aaa", "bbb", "ccc", "ddd" + }; + + /** + * Tests whether + * {@link VocabularyUtil#createTruncatedVocabulary(List, Vocabulary, int, int) + * works as expected in regard to enforcing minimum occurrence count. + */ + @Test + public void testCreateTruncatedVocabularyMinOccurenceCount() { + Vocabulary truncatedVocabulary = + VocabularyUtil.createTruncatedVocabulary( + WID_LIST, VOCABULARY, MAX_WORD_COUNT_1, MIN_OCCURENCE_COUNT_1); + assertVocabularyEquals(EXPECTED_TRUNCATED_VOCABULARY_1, + truncatedVocabulary); + } + + + public static final int MAX_WORD_COUNT_2 = 3; + + public static final int MIN_OCCURENCE_COUNT_2 = 1; + + public static final String[] EXPECTED_TRUNCATED_VOCABULARY_2 = + new String[] { + "aaa", "bbb", "ccc" + }; + + /** + * Tests whether + * {@link VocabularyUtil#createTruncatedVocabulary(List, Vocabulary, int, int) + * works as expected in regard to enforcing maximum word count. + */ + @Test + public void testCreateTruncatedVocabularyMaxWordCount() { + Vocabulary truncatedVocabulary = + VocabularyUtil.createTruncatedVocabulary( + WID_LIST, VOCABULARY, MAX_WORD_COUNT_2, MIN_OCCURENCE_COUNT_2); + assertVocabularyEquals(EXPECTED_TRUNCATED_VOCABULARY_2, + truncatedVocabulary); + } + + + public static final int MAX_WORD_COUNT_3 = 0; + + public static final int MIN_OCCURENCE_COUNT_3 = 3; + + public static final String[] EXPECTED_TRUNCATED_VOCABULARY_3 = + new String[] {}; + + /** + * Checks if when the maximum word count is zero truncated vocabulary will + * be empty. + */ + @Test + public void testCreateTruncatedVocabularyMaxWordsZero() { + Vocabulary truncatedVocabulary = + VocabularyUtil.createTruncatedVocabulary( + WID_LIST, VOCABULARY, MAX_WORD_COUNT_3, MIN_OCCURENCE_COUNT_3); + assertVocabularyEquals(EXPECTED_TRUNCATED_VOCABULARY_3, + truncatedVocabulary); + } + + private void assertVocabularyEquals(String[] wordArray, + Vocabulary vocabulary) { + assertEquals(wordArray.length, vocabulary.getWordCount()); + + } + +} diff --git a/src/net/sourceforge/align/model/vocabulary/Vocabulary.java b/src/net/sourceforge/align/model/vocabulary/Vocabulary.java new file mode 100755 index 0000000..d1908b3 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/Vocabulary.java @@ -0,0 +1,160 @@ +package net.sourceforge.align.model.vocabulary; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + + +/** + * Represents a vocabulary mapping words to identifiers. + * + * @author Jarek Lipski (loomchild) + */ +public class Vocabulary { + + public static final int NULL_WID = 0; + + public static final String NULL_WORD = "{NULL}"; + + private List wordArray; + + private Map wordMap; + + /** + * Creates vocabulary containing just special null word {@link #NULL_WORD} + * with {@link #NULL_WID} identifier. + */ + public Vocabulary() { + this.wordArray = new ArrayList(); + this.wordMap = new HashMap(); + putWord(NULL_WORD); + } + + /** + * Creates a vocabulary containing special null word and inserts all + * words from the collections to it, generating word ids. + * @param wordCollection + */ + public Vocabulary(Collection wordCollection) { + this(); + for (String word : wordCollection) { + putWord(word); + } + } + + /** + * Finds an identifier for a given word. If the word does not exist + * in the vocabulary returns null. + * + * @param word word + * @return word id or null + */ + public Integer getWid(String word) { + Integer wid = wordMap.get(word); + return wid; + } + + /** + * Convenience method that retrieves all the words from the list using + * {@link #getWid(String)} and returns a list of identifiers. If some + * words cannot be found in the vocabulary then corresponding identifiers + * on the resulting list will be null. + * + * @param wordList list of words + * @return list of word ids + */ + public List getWidList(List wordList) { + List widList = new ArrayList(); + for (String word : wordList) { + widList.add(getWid(word)); + } + return widList; + } + + /** + * Checks if given word id is present in the vocabulary. + * @param wid word id + * @return true if given word id is present in the vocabulary + */ + public boolean containsWid(int wid) { + return wid >= 0 && wid < wordArray.size(); + } + + /** + * Returns a word by given identifier. If the word is not present in the + * vocabulary returns null. + * + * @param wid word id + * @return word or null + */ + public String getWord(int wid) { + if (wid < wordArray.size()) { + return wordArray.get(wid); + } else { + return null; + } + } + + /** + * Checks if given word is present in the vocabulary. + * @param word word + * @return true if given word is present in the vocabulary + */ + public boolean containsWord(String word) { + return wordMap.containsKey(word); + } + + /** + * Adds a new word to the vocabulary if it is not present, otherwise + * does nothing. + * + * @param word word + * @return returns word id + */ + public int putWord(String word) { + Integer wid = wordMap.get(word); + if (wid == null) { + wid = wordArray.size(); + wordArray.add(word); + wordMap.put(word, wid); + } + return wid; + } + + /** + * Convenience method to add words from given list to the vocabulary using + * {@link #putWord(String)}. + * @param wordList word list + */ + public void putWordList(List wordList) { + for (String word : wordList) { + putWord(word); + } + } + + /** + * @return number of words in the vocabulary + */ + public int getWordCount() { + return wordArray.size() - 1; + } + + /** + * Formats the vocabulary to given writer in plaintext format. + * Used for logging purposes and for storing models. + * @param writer writer + */ + public void format(Writer writer) { + PrintWriter printWriter = new PrintWriter(writer, true); + for (int i = 0; i < wordArray.size(); ++i) { + printWriter.println(i + "\t" + wordArray.get(i)); + } + } + + +} diff --git a/src/net/sourceforge/align/model/vocabulary/VocabularyTest.java b/src/net/sourceforge/align/model/vocabulary/VocabularyTest.java new file mode 100755 index 0000000..b0531f9 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/VocabularyTest.java @@ -0,0 +1,37 @@ +package net.sourceforge.align.model.vocabulary; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Represents {@link Vocabulary} unit test. + * @author loomchild + */ +public class VocabularyTest { + + /** + * Performs various tests on vocabulary including adding words, getting + * the word ids, etc. + */ + @Test + public void testVocabulary() { + Vocabulary vocabulary = new Vocabulary(); + assertFalse(vocabulary.containsWord("a b")); + assertNull(vocabulary.getWid("a b")); + assertTrue(vocabulary.containsWid(Vocabulary.NULL_WID)); + assertFalse(vocabulary.containsWid(10)); + assertEquals(0, vocabulary.getWordCount()); + vocabulary.putWord("a b"); + assertEquals(1, vocabulary.getWordCount()); + assertTrue(vocabulary.containsWord("a b")); + int wid = 1; + assertEquals(wid, vocabulary.getWid("a b")); + assertTrue(vocabulary.containsWid(wid)); + assertEquals("a b", vocabulary.getWord(wid)); + } + +} diff --git a/src/net/sourceforge/align/model/vocabulary/VocabularyTestSuite.java b/src/net/sourceforge/align/model/vocabulary/VocabularyTestSuite.java new file mode 100755 index 0000000..c54ae23 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/VocabularyTestSuite.java @@ -0,0 +1,16 @@ +package net.sourceforge.align.model.vocabulary; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Represents vocabulary package test suite. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + VocabularyTest.class, VocabularyUtilTest.class +}) +public class VocabularyTestSuite { + +} diff --git a/src/net/sourceforge/align/model/vocabulary/VocabularyUtil.java b/src/net/sourceforge/align/model/vocabulary/VocabularyUtil.java new file mode 100755 index 0000000..1402720 --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/VocabularyUtil.java @@ -0,0 +1,228 @@ +package net.sourceforge.align.model.vocabulary; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.modifier.modify.split.FilterNonWordsSplitAlgorithmDecorator; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.WordSplitAlgorithm; +import net.sourceforge.align.model.ModelParseException; + +public class VocabularyUtil { + + /** + * Parser vocabulary from given reader using simple text format. The + * vocabulary can be formatted using + * {@link Vocabulary#format(java.io.Writer)} method. + * + * @param reader input stream + * @return parsed vocabulary + */ + public static Vocabulary parse(Reader reader) { + try { + BufferedReader bufferedReader = new BufferedReader(reader); + Vocabulary vocabulary = new Vocabulary(); + String line; + int expectedWid = vocabulary.getWordCount() + 1; + while ((line = bufferedReader.readLine()) != null) { + String[] parts = line.split("\\s"); + if (parts.length == 2) { + int wid = Integer.parseInt(parts[0]); + String word = parts[1]; + if (wid != expectedWid) { + throw new ModelParseException("Word ordering error"); + } + vocabulary.putWord(word); + ++expectedWid; + } else if (parts.length != 0) { + throw new ModelParseException("Bad number of " + + "line parts."); + } + } + return vocabulary; + } catch (NumberFormatException e) { + throw new ModelParseException("Part format error", e); + } catch (IOException e) { + throw new ModelParseException("IO error", e); + } + } + + /** + * Default word tokenization algorithm. + */ + public static final SplitAlgorithm DEFAULT_TOKENIZE_ALGORITHM = + new FilterNonWordsSplitAlgorithmDecorator(new WordSplitAlgorithm()); + + /** + * For each alignment on input alignment list tokenizes all the segments + * into words, inserts the words into appropriate vocabulary + * (source or target) and returns a list of lists of source and target + * word ids grouped by alignment. + * + * @param splitAlgorithm + * @param alignmentList + * @param sourceVocabulary + * @param targetVocabulary + * @param sourceWidList + * @param targetWidList + */ + public static void tokenize(SplitAlgorithm splitAlgorithm, + List alignmentList, + Vocabulary sourceVocabulary, + Vocabulary targetVocabulary, + List> sourceWidList, + List> targetWidList) { + + for (Alignment alignment : alignmentList) { + sourceWidList.add(tokenizePutGet(splitAlgorithm, + alignment.getSourceSegmentList(), sourceVocabulary)); + targetWidList.add(tokenizePutGet(splitAlgorithm, + alignment.getTargetSegmentList(), targetVocabulary)); + } + + } + + /** + * Tokenizes given segment list into words, puts them into given + * vocabulary and returns their identifiers. + * + * @param splitAlgorithm algorithm used to split segments into words + * @param segmentList list of input segments + * @param vocabulary vocabulary which will be expanded + * @return list of word ids + */ + private static List tokenizePutGet(SplitAlgorithm splitAlgorithm, + List segmentList, Vocabulary vocabulary) { + List wordList = splitAlgorithm.modify(segmentList); + vocabulary.putWordList(wordList); + List widList = vocabulary.getWidList(wordList); + return widList; + } + + /** + * Tokenizes given segment list into words and retrieves their identifiers + * from given vocabulary. + * + * @param splitAlgorithm algorithm used to split segments into words + * @param segmentList list of input segments + * @param vocabulary vocabulary from which word ids will be retrieved + * @return list of word ids + */ + public static List tokenize(SplitAlgorithm splitAlgorithm, + List segmentList, Vocabulary vocabulary) { + List wordList = splitAlgorithm.modify(segmentList); + List widList = vocabulary.getWidList(wordList); + return widList; + } + + + public static final int DEFAULT_MAX_WORD_COUNT = 5000; + + public static final int DEFAULT_MIN_OCCURRENCE_COUNT = 2; + + /** + * Creates new vocabulary from given one with the most popular words + * from given word id list. Only the words that occur at least + * given minOccurrenceCount times will be preserved. Also resulting + * vocabulary can not contain more words than given maxWordCount, + * so the less popular ones will be omitted. + * + * @param widList word id list + * @param vocabulary initial vocabulary; it will not be modified + * @param maxWordCount maximum word count for the new vocabulary + * @param minOccurrenceCount minimum number of times the word must occur + * in reference word id list to be included in truncated vocabulary + * @return truncated vocabulary + */ + public static Vocabulary createTruncatedVocabulary( + List> widList, Vocabulary vocabulary, + int maxWordCount, int minOccurrenceCount) { + + // Occurrence threshold over which words are considered not rare. + int occurrenceThreshold = minOccurrenceCount; + + // Number of words to leave with occurrence count equal to threshold. + int occurrenceCountThreshold = Integer.MAX_VALUE; + + int[] occurrenceCountArray = new int[vocabulary.getWordCount() + 1]; + Arrays.fill(occurrenceCountArray, 0); + // Ignore null word + occurrenceCountArray[0] = -1; + + for (List widSegment : widList) { + for (int wid : widSegment) { + ++occurrenceCountArray[wid]; + } + } + + // If there's too much words. + if (vocabulary.getWordCount() > maxWordCount) { + if (maxWordCount == 0) { + occurrenceThreshold = Integer.MAX_VALUE; + } else { + int[] occurrenceCountArrayCopy = Arrays.copyOf( + occurrenceCountArray, occurrenceCountArray.length); + Arrays.sort(occurrenceCountArrayCopy); + + // If the minOccurenceCount is too small to remove enough words. + int index = occurrenceCountArrayCopy.length - maxWordCount; + if (occurrenceCountArrayCopy[index] >= minOccurrenceCount) { + occurrenceThreshold = occurrenceCountArrayCopy[index]; + ++index; + while ((index < occurrenceCountArrayCopy.length) && + (occurrenceCountArrayCopy[index] == + occurrenceThreshold)) { + ++index; + } + occurrenceCountThreshold = index - + (occurrenceCountArrayCopy.length - maxWordCount); + } + } + } + + Vocabulary resultVocabulary = new Vocabulary(); + + // Start from 1, null word will be in truncated vocabulary anyway. + for (int wid = 1; wid < occurrenceCountArray.length; ++wid) { + int occurenceCount = occurrenceCountArray[wid]; + String word = vocabulary.getWord(wid); + if (occurenceCount > occurrenceThreshold) { + resultVocabulary.putWord(word); + } else if (occurenceCount == occurrenceThreshold + && occurrenceCountThreshold > 0) { + resultVocabulary.putWord(word); + --occurrenceCountThreshold; + } + } + + return resultVocabulary; + } + + /** + * + * @param widList + * @param vocabulary + * @return + */ + /** + * Creates new vocabulary from given one with the most popular words + * from given word id list. Uses + * {@link #createTruncatedVocabulary(List, Vocabulary, int, int)} + * with {@link #DEFAULT_MAX_WORD_COUNT} and + * {@link #DEFAULT_MIN_OCCURRENCE_COUNT}. + * + * @param widList word id list + * @param vocabulary initial vocabulary; it will not be modified + * @return truncated vocabulary + */ + public static Vocabulary createTruncatedVocabulary( + List> widList, Vocabulary vocabulary) { + return createTruncatedVocabulary(widList, vocabulary, + DEFAULT_MAX_WORD_COUNT, DEFAULT_MIN_OCCURRENCE_COUNT); + } + +} diff --git a/src/net/sourceforge/align/model/vocabulary/VocabularyUtilTest.java b/src/net/sourceforge/align/model/vocabulary/VocabularyUtilTest.java new file mode 100755 index 0000000..d81e50b --- /dev/null +++ b/src/net/sourceforge/align/model/vocabulary/VocabularyUtilTest.java @@ -0,0 +1,140 @@ +package net.sourceforge.align.model.vocabulary; + +import static org.junit.Assert.assertEquals; + +import java.io.StringReader; +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.align.model.ModelParseException; +import net.sourceforge.align.model.Util; + +import org.junit.Test; + +/** + * Represents vocabulary utilities test suite. + * @author loomchild + */ +public class VocabularyUtilTest { + + public String VOCABULARY_STRING = + "1 ala\n" + + "2 ma\n" + + "3 kota\n" + + " "; + + /** + * Test vocabulary parsing. + */ + @Test + public void testParse() { + StringReader reader = new StringReader(VOCABULARY_STRING); + Vocabulary vocabulary = VocabularyUtil.parse(reader); + assertEquals(3, vocabulary.getWordCount()); + assertEquals(1, vocabulary.getWid("ala")); + assertEquals("kota", vocabulary.getWord(3)); + } + + public String VOCABULARY_UNORDERED_STRING = + "1 ala\n" + + "3 ma\n" + + "2 kota\n" + + ""; + + /** + * Tests that vocabulary will throw an exception if vocabulary is unordered. + */ + @Test(expected=ModelParseException.class) + public void testParseUnordered() { + StringReader reader = new StringReader(VOCABULARY_UNORDERED_STRING); + VocabularyUtil.parse(reader); + } + + + public static final List> WID_LIST = + Util.createWidList(new int[][] { + new int[] {1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3}, + new int[] {4, 4, 4, 5, 5, 6} + }); + + public static final Vocabulary VOCABULARY = + new Vocabulary(Arrays.asList( + new String[] {"aaa", "bbb", "ccc", "ddd", "eee", "fff"} + )); + + + public static final int MAX_WORD_COUNT_1 = 10; + + public static final int MIN_OCCURENCE_COUNT_1 = 3; + + public static final String[] EXPECTED_TRUNCATED_VOCABULARY_1 = + new String[] { + "aaa", "bbb", "ccc", "ddd" + }; + + /** + * Tests whether + * {@link VocabularyUtil#createTruncatedVocabulary(List, Vocabulary, int, int) + * works as expected in regard to enforcing minimum occurrence count. + */ + @Test + public void testCreateTruncatedVocabularyMinOccurenceCount() { + Vocabulary truncatedVocabulary = + VocabularyUtil.createTruncatedVocabulary( + WID_LIST, VOCABULARY, MAX_WORD_COUNT_1, MIN_OCCURENCE_COUNT_1); + assertVocabularyEquals(EXPECTED_TRUNCATED_VOCABULARY_1, + truncatedVocabulary); + } + + + public static final int MAX_WORD_COUNT_2 = 3; + + public static final int MIN_OCCURENCE_COUNT_2 = 1; + + public static final String[] EXPECTED_TRUNCATED_VOCABULARY_2 = + new String[] { + "aaa", "bbb", "ccc" + }; + + /** + * Tests whether + * {@link VocabularyUtil#createTruncatedVocabulary(List, Vocabulary, int, int) + * works as expected in regard to enforcing maximum word count. + */ + @Test + public void testCreateTruncatedVocabularyMaxWordCount() { + Vocabulary truncatedVocabulary = + VocabularyUtil.createTruncatedVocabulary( + WID_LIST, VOCABULARY, MAX_WORD_COUNT_2, MIN_OCCURENCE_COUNT_2); + assertVocabularyEquals(EXPECTED_TRUNCATED_VOCABULARY_2, + truncatedVocabulary); + } + + + public static final int MAX_WORD_COUNT_3 = 0; + + public static final int MIN_OCCURENCE_COUNT_3 = 3; + + public static final String[] EXPECTED_TRUNCATED_VOCABULARY_3 = + new String[] {}; + + /** + * Checks if when the maximum word count is zero truncated vocabulary will + * be empty. + */ + @Test + public void testCreateTruncatedVocabularyMaxWordsZero() { + Vocabulary truncatedVocabulary = + VocabularyUtil.createTruncatedVocabulary( + WID_LIST, VOCABULARY, MAX_WORD_COUNT_3, MIN_OCCURENCE_COUNT_3); + assertVocabularyEquals(EXPECTED_TRUNCATED_VOCABULARY_3, + truncatedVocabulary); + } + + private void assertVocabularyEquals(String[] wordArray, + Vocabulary vocabulary) { + assertEquals(wordArray.length, vocabulary.getWordCount()); + + } + +} diff --git a/src/net/sourceforge/align/parser/.svn/all-wcprops b/src/net/sourceforge/align/parser/.svn/all-wcprops new file mode 100644 index 0000000..3f8ae57 --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/all-wcprops @@ -0,0 +1,59 @@ +K 25 +svn:wc:ra_dav:version-url +V 73 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/parser +END +TmxParserTest.java +K 25 +svn:wc:ra_dav:version-url +V 92 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/parser/TmxParserTest.java +END +Parser.java +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/align/!svn/ver/44/trunk/maligna/src/net/sourceforge/align/parser/Parser.java +END +TmxParser.java +K 25 +svn:wc:ra_dav:version-url +V 88 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/parser/TmxParser.java +END +AlParserTest.java +K 25 +svn:wc:ra_dav:version-url +V 91 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/parser/AlParserTest.java +END +TmxParseException.java +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/parser/TmxParseException.java +END +AlParser.java +K 25 +svn:wc:ra_dav:version-url +V 87 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/parser/AlParser.java +END +PlaintextParserTest.java +K 25 +svn:wc:ra_dav:version-url +V 98 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/parser/PlaintextParserTest.java +END +ParserTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 94 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/parser/ParserTestSuite.java +END +PlaintextParser.java +K 25 +svn:wc:ra_dav:version-url +V 94 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/parser/PlaintextParser.java +END diff --git a/src/net/sourceforge/align/parser/.svn/entries b/src/net/sourceforge/align/parser/.svn/entries new file mode 100644 index 0000000..bacc971 --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/entries @@ -0,0 +1,334 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/parser +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +AlParser.java +file + + + + +2010-10-28T16:40:13.000000Z +92bd9a234782729dec6e59817b574b49 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1630 + +AlParserTest.java +file + + + + +2010-10-28T16:40:13.000000Z +1b235033f68616b6e97216f32bc2a8a8 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1411 + +Parser.java +file + + + + +2010-11-11T10:11:39.000000Z +aca595d3eb8ae04d424447f9ea66f7d0 +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +464 + +ParserTestSuite.java +file + + + + +2010-10-20T08:12:57.000000Z +d61eced0e962ddbb1fe5874ee850494b +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +355 + +PlaintextParser.java +file + + + + +2010-10-28T16:40:14.000000Z +3804768ecc0df22a9be23897e8ded40c +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1965 + +PlaintextParserTest.java +file + + + + +2010-10-28T16:40:14.000000Z +8a6c4ae229f519b64942590cbb248eae +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1295 + +TmxParseException.java +file + + + + +2010-10-20T07:29:53.000000Z +f02ad56cb33cce9bd4038bf047257041 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +417 + +TmxParser.java +file + + + + +2010-10-28T16:40:14.000000Z +ff96cf6d7c1bca51247b69fe4ed9e958 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +4407 + +TmxParserTest.java +file + + + + +2010-10-28T16:40:14.000000Z +1d74ca76bee7a002754bbfdd92405e8c +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2019 + diff --git a/src/net/sourceforge/align/parser/.svn/text-base/AlParser.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/AlParser.java.svn-base new file mode 100644 index 0000000..8cf5000 --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/AlParser.java.svn-base @@ -0,0 +1,59 @@ +package net.sourceforge.align.parser; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.bind.AlMarshallerUnmarshaller; +import net.sourceforge.align.util.bind.al.Alignmentlist; +import net.sourceforge.align.util.bind.al.Segmentlist; + +/** + * Represents parser of a native .al format. + * Parses a document configured in constructor. + * + * @author loomchild + */ +public class AlParser implements Parser { + + private Reader reader; + + /** + * Constructs parser. + * @param reader input document to be parsed + */ + public AlParser(Reader reader) { + this.reader = reader; + } + + /** + * Parses a document into a list of alignments. + * Retrieves all information stored in this format including score. + */ + public List parse() { + List alignmentList = new ArrayList(); + Alignmentlist al = + AlMarshallerUnmarshaller.getInstance().unmarshal(reader); + for (net.sourceforge.align.util.bind.al.Alignment a : al.getAlignment()) { + List sourceSegmentList = + createSegmentList(a.getSourcelist()); + List targetSegmentList = + createSegmentList(a.getTargetlist()); + float score = a.getScore().floatValue(); + Alignment alignment = new Alignment(sourceSegmentList, + targetSegmentList, score); + alignmentList.add(alignment); + } + return alignmentList; + } + + private List createSegmentList(Segmentlist sl) { + List segmentList = new ArrayList(); + for (String s : sl.getSegment()) { + segmentList.add(s); + } + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/parser/.svn/text-base/AlParserTest.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/AlParserTest.java.svn-base new file mode 100644 index 0000000..3ea673c --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/AlParserTest.java.svn-base @@ -0,0 +1,51 @@ +package net.sourceforge.align.parser; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.getReader; +import static net.sourceforge.align.util.Util.getResourceStream; + +import java.io.InputStream; +import java.io.Reader; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link AlParser} unit test. + * @author loomchild + */ +public class AlParserTest { + + public static final String FILE = "net/sourceforge/align/res/test/simpletext.al"; + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"First sentence. ", "Second sentence."}, + new String[] {}, + new String[] {}, + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"Pierwsze zdanie."}, + new String[] {"Drugie zdanie."}, + new String[] {}, + }; + + /** + * Test whether {@link AlParser} is able to parse a test file + * stored in {@value #FILE} into {@link #SOURCE_SEGMENT_ARRAY} and + * {@link #TARGET_SEGMENT_ARRAY}. + * @throws Exception + */ + @Test + public void parse() throws Exception { + InputStream inputStream = getResourceStream(FILE); + Reader reader = getReader(inputStream); + AlParser parser = new AlParser(reader); + List alignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY, + alignmentList); + } + +} diff --git a/src/net/sourceforge/align/parser/.svn/text-base/Parser.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/Parser.java.svn-base new file mode 100644 index 0000000..fc3f167 --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/Parser.java.svn-base @@ -0,0 +1,23 @@ +package net.sourceforge.align.parser; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + + +/** + * Represents input text(s) parser that creates alignment list. + * Input file or files are configured in constructor of a concrete parser + * implementation. + * + * @author loomchild + */ +public interface Parser { + + /** + * Parses input document into an alignment list. + * @return parsed alignment list + */ + public List parse(); + +} diff --git a/src/net/sourceforge/align/parser/.svn/text-base/ParserTestSuite.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/ParserTestSuite.java.svn-base new file mode 100644 index 0000000..d6c42ce --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/ParserTestSuite.java.svn-base @@ -0,0 +1,17 @@ +package net.sourceforge.align.parser; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Test suite containing unit tests for parser package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlParserTest.class, PlaintextParserTest.class, TmxParserTest.class + }) +public class ParserTestSuite { + +} diff --git a/src/net/sourceforge/align/parser/.svn/text-base/PlaintextParser.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/PlaintextParser.java.svn-base new file mode 100644 index 0000000..4415dce --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/PlaintextParser.java.svn-base @@ -0,0 +1,72 @@ +package net.sourceforge.align.parser; + +import static net.sourceforge.align.util.Util.readAll; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents plaintext document parser into an alignment. + * + * Can be constructed from strings as well as files. + * The whole content of each input file (STRING) is treated as a single segment. + * Always returns alignment list containing just one alignment. + * + * @author loomchild + */ +public class PlaintextParser implements Parser { + + private Reader sourceReader; + + private Reader targetReader; + + private String sourceString; + + private String targetString; + + + /** + * Constructs a parser from source and target string. + * @param sourceString source segment + * @param targetString target segment + */ + public PlaintextParser(String sourceString, String targetString) { + this.sourceString = sourceString; + this.targetString = targetString; + } + + /** + * Constructs parser from source and target reader. + * @param sourceReader source text document + * @param targetReader target text document + */ + public PlaintextParser(Reader sourceReader, Reader targetReader) { + this.sourceReader = sourceReader; + this.targetReader = targetReader; + } + + /** + * Parses input documents into an alignment list + * @return alignment list containing just one alignment with one source + * and one target segment + */ + public List parse() { + if (sourceString == null) { + sourceString = readAll(sourceReader); + } + if (targetString == null) { + targetString = readAll(targetReader); + } + + List sourceSegmentList = Collections.singletonList(sourceString); + List targetSegmentList = Collections.singletonList(targetString); + Alignment alignment = new Alignment(sourceSegmentList, targetSegmentList); + List alignmentList = Collections.singletonList(alignment); + + return alignmentList; + } + +} diff --git a/src/net/sourceforge/align/parser/.svn/text-base/PlaintextParserTest.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/PlaintextParserTest.java.svn-base new file mode 100644 index 0000000..96c7812 --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/PlaintextParserTest.java.svn-base @@ -0,0 +1,49 @@ +package net.sourceforge.align.parser; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; + +import java.io.Reader; +import java.io.StringReader; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link PlaintextParser} unit test. + * @author loomchild + */ +public class PlaintextParserTest { + + public static final String SOURCE_STRING = "aaabbb"; + + public static final String TARGET_STRING = "1122"; + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {SOURCE_STRING}, + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {TARGET_STRING}, + }; + + @Test + public void parseString() { + Parser parser = new PlaintextParser(SOURCE_STRING, TARGET_STRING); + List alignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY, + alignmentList); + } + + @Test + public void parseReader() { + Reader sourceReader = new StringReader(SOURCE_STRING); + Reader targetReader = new StringReader(TARGET_STRING); + Parser parser = new PlaintextParser(sourceReader, targetReader); + List alignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY, + alignmentList); + } + +} diff --git a/src/net/sourceforge/align/parser/.svn/text-base/TmxParseException.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/TmxParseException.java.svn-base new file mode 100644 index 0000000..2ecf4bd --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/TmxParseException.java.svn-base @@ -0,0 +1,20 @@ +package net.sourceforge.align.parser; + +/** + * Represrnts TMX document parsing exception + * + * @author Jarek Lipski (loomchild) + */ +public class TmxParseException extends RuntimeException { + + private static final long serialVersionUID = 5752610837896744124L; + + public TmxParseException(String message) { + super(message); + } + + + public TmxParseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/net/sourceforge/align/parser/.svn/text-base/TmxParser.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/TmxParser.java.svn-base new file mode 100644 index 0000000..c026503 --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/TmxParser.java.svn-base @@ -0,0 +1,139 @@ +package net.sourceforge.align.parser; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.bind.TmxMarshallerUnmarshaller; +import net.sourceforge.align.util.bind.tmx.Body; +import net.sourceforge.align.util.bind.tmx.Seg; +import net.sourceforge.align.util.bind.tmx.Tmx; +import net.sourceforge.align.util.bind.tmx.Tu; +import net.sourceforge.align.util.bind.tmx.Tuv; + +/** + * Represents TMX document parser. + * + * Each translation unit in TMX is treated as a separate alignment. + * From each translation unit only variants in two configured languages are + * retrieved. If there are no variants in given language the alignment is + * treated as n to zero, if there is one variant in given language it is + * treated as n to one, if there are more than one variant in a given + * language an exception is thrown. Ignores translation units that do not + * contain variants in any of given languages (it would create zero to zero + * alignment). + * + * @author loomchild + */ +public class TmxParser implements Parser { + + private Reader reader; + + private String sourceLanguageCode; + + private String targetLanguageCode; + + /** + * Creates TMX document parser. + * @param reader Input stream containing TMX document + * @param sourceLanguageCode source language code (en, de, pl, etc.) + * @param targetLanguageCode target language code + */ + public TmxParser(Reader reader, + String sourceLanguageCode, String targetLanguageCode) { + this.reader = reader; + this.sourceLanguageCode = sourceLanguageCode; + this.targetLanguageCode = targetLanguageCode; + } + + /** + * Creates TMX parser. Source and target languages are set automatically + * if they are the only languages present in input document, + * otherwise exception is thrown. + * Source language code will be lexicographically before target language + * code. + * + * @param reader reader containing TMX document + * @throws TmxParseException when document does not contain segments + * exactly in two languages + */ + public TmxParser(Reader reader) { + this.reader = reader; + } + + /** + * Parses TMX document into alignment list. + * @return alignment list + */ + public List parse() { + List alignmentList = new ArrayList(); + Tmx tmx = TmxMarshallerUnmarshaller.getInstance().unmarshal(reader); + Body body = tmx.getBody(); + if (sourceLanguageCode == null && targetLanguageCode == null) { + initLanguageCodes(body.getTu()); + } + for (Tu tu : body.getTu()) { + List sourceSegmentList = + createSegmentList(tu, sourceLanguageCode); + List targetSegmentList = + createSegmentList(tu, targetLanguageCode); + //Ignore empty alignments + if (sourceSegmentList.size() > 0 || targetSegmentList.size() > 0) { + Alignment alignment = new Alignment(sourceSegmentList, + targetSegmentList); + alignmentList.add(alignment); + } + } + return alignmentList; + } + + private List createSegmentList(Tu tu, String languageCode) { + List segmentList = new ArrayList(); + for (Tuv tuv : tu.getTuv()) { + if (languageCode.equals(tuv.getLang())) { + String segment = getSegment(tuv.getSeg()); + segmentList.add(segment); + } + } + if (segmentList.size() > 1) { + throw new TmxParseException(languageCode + " variant count greater " + + "than 1"); + } + return segmentList; + } + + private String getSegment(Seg seg) { + StringBuilder builder = new StringBuilder(); + for (Object object : seg.getContent()) { + builder.append(object.toString()); + } + return builder.toString(); + } + + private void initLanguageCodes(List tuList) { + Set languageCodeSet = getLanguageCodeSet(tuList); + if (languageCodeSet.size() != 2) { + throw new TmxParseException("Document does not contain units " + + "exactly in 2 languages"); + } + String[] languageCodeArray = languageCodeSet.toArray(new String[]{}); + Arrays.sort(languageCodeArray); + sourceLanguageCode = languageCodeArray[0]; + targetLanguageCode = languageCodeArray[1]; + } + + private Set getLanguageCodeSet(List tuList) { + Set languageCodeSet = new HashSet(); + for (Tu tu : tuList) { + for (Tuv tuv : tu.getTuv()) { + languageCodeSet.add(tuv.getLang()); + } + } + return languageCodeSet; + } + +} diff --git a/src/net/sourceforge/align/parser/.svn/text-base/TmxParserTest.java.svn-base b/src/net/sourceforge/align/parser/.svn/text-base/TmxParserTest.java.svn-base new file mode 100644 index 0000000..5bbd3dc --- /dev/null +++ b/src/net/sourceforge/align/parser/.svn/text-base/TmxParserTest.java.svn-base @@ -0,0 +1,72 @@ +package net.sourceforge.align.parser; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.getReader; +import static net.sourceforge.align.util.Util.getResourceStream; + +import java.io.InputStream; +import java.io.Reader; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + + +/** + * Represents {@link TmxParser} unit test. + * @author loomchild + */ +public class TmxParserTest { + + public static final String FILE = "net/sourceforge/align/res/test/simpletext.tmx"; + + public static final String SOURCE_LANGUAGE = "en"; + + public static final String TARGET_LANGUAGE = "pl"; + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"First sentence. "}, + new String[] {"Second sentence."}, + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"Pierwsze zdanie."}, + new String[] {}, + }; + + /** + * Test if parsing {@value #FILE} works as expected. + * @throws Exception + */ + @Test + public void parseCorrect() throws Exception { + InputStream inputStream = getResourceStream(FILE); + Reader reader = getReader(inputStream); + TmxParser parser = new TmxParser(reader, SOURCE_LANGUAGE, + TARGET_LANGUAGE); + List alignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY, + alignmentList); + } + + public static final String BAD_SOURCE_LANGUAGE = "de"; + + /** + * Test if parsing {@value #FILE} but with a source language + * {@value #BAD_SOURCE_LANGUAGE} throws an exception because it contains + * more than one variant in this language in one translation unit. + * + * @see TmxParser + * @throws Exception + */ + @Test(expected=TmxParseException.class) + public void parseBadVariantCount() throws Exception { + InputStream inputStream = getResourceStream(FILE); + Reader reader = getReader(inputStream); + TmxParser parser = new TmxParser(reader, BAD_SOURCE_LANGUAGE, + TARGET_LANGUAGE); + parser.parse(); + } + +} diff --git a/src/net/sourceforge/align/parser/AlParser.java b/src/net/sourceforge/align/parser/AlParser.java new file mode 100755 index 0000000..8cf5000 --- /dev/null +++ b/src/net/sourceforge/align/parser/AlParser.java @@ -0,0 +1,59 @@ +package net.sourceforge.align.parser; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.bind.AlMarshallerUnmarshaller; +import net.sourceforge.align.util.bind.al.Alignmentlist; +import net.sourceforge.align.util.bind.al.Segmentlist; + +/** + * Represents parser of a native .al format. + * Parses a document configured in constructor. + * + * @author loomchild + */ +public class AlParser implements Parser { + + private Reader reader; + + /** + * Constructs parser. + * @param reader input document to be parsed + */ + public AlParser(Reader reader) { + this.reader = reader; + } + + /** + * Parses a document into a list of alignments. + * Retrieves all information stored in this format including score. + */ + public List parse() { + List alignmentList = new ArrayList(); + Alignmentlist al = + AlMarshallerUnmarshaller.getInstance().unmarshal(reader); + for (net.sourceforge.align.util.bind.al.Alignment a : al.getAlignment()) { + List sourceSegmentList = + createSegmentList(a.getSourcelist()); + List targetSegmentList = + createSegmentList(a.getTargetlist()); + float score = a.getScore().floatValue(); + Alignment alignment = new Alignment(sourceSegmentList, + targetSegmentList, score); + alignmentList.add(alignment); + } + return alignmentList; + } + + private List createSegmentList(Segmentlist sl) { + List segmentList = new ArrayList(); + for (String s : sl.getSegment()) { + segmentList.add(s); + } + return segmentList; + } + +} diff --git a/src/net/sourceforge/align/parser/AlParserTest.java b/src/net/sourceforge/align/parser/AlParserTest.java new file mode 100755 index 0000000..3ea673c --- /dev/null +++ b/src/net/sourceforge/align/parser/AlParserTest.java @@ -0,0 +1,51 @@ +package net.sourceforge.align.parser; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.getReader; +import static net.sourceforge.align.util.Util.getResourceStream; + +import java.io.InputStream; +import java.io.Reader; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link AlParser} unit test. + * @author loomchild + */ +public class AlParserTest { + + public static final String FILE = "net/sourceforge/align/res/test/simpletext.al"; + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"First sentence. ", "Second sentence."}, + new String[] {}, + new String[] {}, + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"Pierwsze zdanie."}, + new String[] {"Drugie zdanie."}, + new String[] {}, + }; + + /** + * Test whether {@link AlParser} is able to parse a test file + * stored in {@value #FILE} into {@link #SOURCE_SEGMENT_ARRAY} and + * {@link #TARGET_SEGMENT_ARRAY}. + * @throws Exception + */ + @Test + public void parse() throws Exception { + InputStream inputStream = getResourceStream(FILE); + Reader reader = getReader(inputStream); + AlParser parser = new AlParser(reader); + List alignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY, + alignmentList); + } + +} diff --git a/src/net/sourceforge/align/parser/Parser.java b/src/net/sourceforge/align/parser/Parser.java new file mode 100755 index 0000000..fc3f167 --- /dev/null +++ b/src/net/sourceforge/align/parser/Parser.java @@ -0,0 +1,23 @@ +package net.sourceforge.align.parser; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + + +/** + * Represents input text(s) parser that creates alignment list. + * Input file or files are configured in constructor of a concrete parser + * implementation. + * + * @author loomchild + */ +public interface Parser { + + /** + * Parses input document into an alignment list. + * @return parsed alignment list + */ + public List parse(); + +} diff --git a/src/net/sourceforge/align/parser/ParserTestSuite.java b/src/net/sourceforge/align/parser/ParserTestSuite.java new file mode 100755 index 0000000..d6c42ce --- /dev/null +++ b/src/net/sourceforge/align/parser/ParserTestSuite.java @@ -0,0 +1,17 @@ +package net.sourceforge.align.parser; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + +/** + * Test suite containing unit tests for parser package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlParserTest.class, PlaintextParserTest.class, TmxParserTest.class + }) +public class ParserTestSuite { + +} diff --git a/src/net/sourceforge/align/parser/PlaintextParser.java b/src/net/sourceforge/align/parser/PlaintextParser.java new file mode 100755 index 0000000..4415dce --- /dev/null +++ b/src/net/sourceforge/align/parser/PlaintextParser.java @@ -0,0 +1,72 @@ +package net.sourceforge.align.parser; + +import static net.sourceforge.align.util.Util.readAll; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * Represents plaintext document parser into an alignment. + * + * Can be constructed from strings as well as files. + * The whole content of each input file (STRING) is treated as a single segment. + * Always returns alignment list containing just one alignment. + * + * @author loomchild + */ +public class PlaintextParser implements Parser { + + private Reader sourceReader; + + private Reader targetReader; + + private String sourceString; + + private String targetString; + + + /** + * Constructs a parser from source and target string. + * @param sourceString source segment + * @param targetString target segment + */ + public PlaintextParser(String sourceString, String targetString) { + this.sourceString = sourceString; + this.targetString = targetString; + } + + /** + * Constructs parser from source and target reader. + * @param sourceReader source text document + * @param targetReader target text document + */ + public PlaintextParser(Reader sourceReader, Reader targetReader) { + this.sourceReader = sourceReader; + this.targetReader = targetReader; + } + + /** + * Parses input documents into an alignment list + * @return alignment list containing just one alignment with one source + * and one target segment + */ + public List parse() { + if (sourceString == null) { + sourceString = readAll(sourceReader); + } + if (targetString == null) { + targetString = readAll(targetReader); + } + + List sourceSegmentList = Collections.singletonList(sourceString); + List targetSegmentList = Collections.singletonList(targetString); + Alignment alignment = new Alignment(sourceSegmentList, targetSegmentList); + List alignmentList = Collections.singletonList(alignment); + + return alignmentList; + } + +} diff --git a/src/net/sourceforge/align/parser/PlaintextParserTest.java b/src/net/sourceforge/align/parser/PlaintextParserTest.java new file mode 100755 index 0000000..96c7812 --- /dev/null +++ b/src/net/sourceforge/align/parser/PlaintextParserTest.java @@ -0,0 +1,49 @@ +package net.sourceforge.align.parser; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; + +import java.io.Reader; +import java.io.StringReader; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents {@link PlaintextParser} unit test. + * @author loomchild + */ +public class PlaintextParserTest { + + public static final String SOURCE_STRING = "aaabbb"; + + public static final String TARGET_STRING = "1122"; + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {SOURCE_STRING}, + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {TARGET_STRING}, + }; + + @Test + public void parseString() { + Parser parser = new PlaintextParser(SOURCE_STRING, TARGET_STRING); + List alignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY, + alignmentList); + } + + @Test + public void parseReader() { + Reader sourceReader = new StringReader(SOURCE_STRING); + Reader targetReader = new StringReader(TARGET_STRING); + Parser parser = new PlaintextParser(sourceReader, targetReader); + List alignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY, + alignmentList); + } + +} diff --git a/src/net/sourceforge/align/parser/TmxParseException.java b/src/net/sourceforge/align/parser/TmxParseException.java new file mode 100755 index 0000000..2ecf4bd --- /dev/null +++ b/src/net/sourceforge/align/parser/TmxParseException.java @@ -0,0 +1,20 @@ +package net.sourceforge.align.parser; + +/** + * Represrnts TMX document parsing exception + * + * @author Jarek Lipski (loomchild) + */ +public class TmxParseException extends RuntimeException { + + private static final long serialVersionUID = 5752610837896744124L; + + public TmxParseException(String message) { + super(message); + } + + + public TmxParseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/net/sourceforge/align/parser/TmxParser.java b/src/net/sourceforge/align/parser/TmxParser.java new file mode 100755 index 0000000..c026503 --- /dev/null +++ b/src/net/sourceforge/align/parser/TmxParser.java @@ -0,0 +1,139 @@ +package net.sourceforge.align.parser; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.util.bind.TmxMarshallerUnmarshaller; +import net.sourceforge.align.util.bind.tmx.Body; +import net.sourceforge.align.util.bind.tmx.Seg; +import net.sourceforge.align.util.bind.tmx.Tmx; +import net.sourceforge.align.util.bind.tmx.Tu; +import net.sourceforge.align.util.bind.tmx.Tuv; + +/** + * Represents TMX document parser. + * + * Each translation unit in TMX is treated as a separate alignment. + * From each translation unit only variants in two configured languages are + * retrieved. If there are no variants in given language the alignment is + * treated as n to zero, if there is one variant in given language it is + * treated as n to one, if there are more than one variant in a given + * language an exception is thrown. Ignores translation units that do not + * contain variants in any of given languages (it would create zero to zero + * alignment). + * + * @author loomchild + */ +public class TmxParser implements Parser { + + private Reader reader; + + private String sourceLanguageCode; + + private String targetLanguageCode; + + /** + * Creates TMX document parser. + * @param reader Input stream containing TMX document + * @param sourceLanguageCode source language code (en, de, pl, etc.) + * @param targetLanguageCode target language code + */ + public TmxParser(Reader reader, + String sourceLanguageCode, String targetLanguageCode) { + this.reader = reader; + this.sourceLanguageCode = sourceLanguageCode; + this.targetLanguageCode = targetLanguageCode; + } + + /** + * Creates TMX parser. Source and target languages are set automatically + * if they are the only languages present in input document, + * otherwise exception is thrown. + * Source language code will be lexicographically before target language + * code. + * + * @param reader reader containing TMX document + * @throws TmxParseException when document does not contain segments + * exactly in two languages + */ + public TmxParser(Reader reader) { + this.reader = reader; + } + + /** + * Parses TMX document into alignment list. + * @return alignment list + */ + public List parse() { + List alignmentList = new ArrayList(); + Tmx tmx = TmxMarshallerUnmarshaller.getInstance().unmarshal(reader); + Body body = tmx.getBody(); + if (sourceLanguageCode == null && targetLanguageCode == null) { + initLanguageCodes(body.getTu()); + } + for (Tu tu : body.getTu()) { + List sourceSegmentList = + createSegmentList(tu, sourceLanguageCode); + List targetSegmentList = + createSegmentList(tu, targetLanguageCode); + //Ignore empty alignments + if (sourceSegmentList.size() > 0 || targetSegmentList.size() > 0) { + Alignment alignment = new Alignment(sourceSegmentList, + targetSegmentList); + alignmentList.add(alignment); + } + } + return alignmentList; + } + + private List createSegmentList(Tu tu, String languageCode) { + List segmentList = new ArrayList(); + for (Tuv tuv : tu.getTuv()) { + if (languageCode.equals(tuv.getLang())) { + String segment = getSegment(tuv.getSeg()); + segmentList.add(segment); + } + } + if (segmentList.size() > 1) { + throw new TmxParseException(languageCode + " variant count greater " + + "than 1"); + } + return segmentList; + } + + private String getSegment(Seg seg) { + StringBuilder builder = new StringBuilder(); + for (Object object : seg.getContent()) { + builder.append(object.toString()); + } + return builder.toString(); + } + + private void initLanguageCodes(List tuList) { + Set languageCodeSet = getLanguageCodeSet(tuList); + if (languageCodeSet.size() != 2) { + throw new TmxParseException("Document does not contain units " + + "exactly in 2 languages"); + } + String[] languageCodeArray = languageCodeSet.toArray(new String[]{}); + Arrays.sort(languageCodeArray); + sourceLanguageCode = languageCodeArray[0]; + targetLanguageCode = languageCodeArray[1]; + } + + private Set getLanguageCodeSet(List tuList) { + Set languageCodeSet = new HashSet(); + for (Tu tu : tuList) { + for (Tuv tuv : tu.getTuv()) { + languageCodeSet.add(tuv.getLang()); + } + } + return languageCodeSet; + } + +} diff --git a/src/net/sourceforge/align/parser/TmxParserTest.java b/src/net/sourceforge/align/parser/TmxParserTest.java new file mode 100755 index 0000000..5bbd3dc --- /dev/null +++ b/src/net/sourceforge/align/parser/TmxParserTest.java @@ -0,0 +1,72 @@ +package net.sourceforge.align.parser; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.getReader; +import static net.sourceforge.align.util.Util.getResourceStream; + +import java.io.InputStream; +import java.io.Reader; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + + +/** + * Represents {@link TmxParser} unit test. + * @author loomchild + */ +public class TmxParserTest { + + public static final String FILE = "net/sourceforge/align/res/test/simpletext.tmx"; + + public static final String SOURCE_LANGUAGE = "en"; + + public static final String TARGET_LANGUAGE = "pl"; + + public static final String[][] SOURCE_SEGMENT_ARRAY = { + new String[] {"First sentence. "}, + new String[] {"Second sentence."}, + }; + + public static final String[][] TARGET_SEGMENT_ARRAY = { + new String[] {"Pierwsze zdanie."}, + new String[] {}, + }; + + /** + * Test if parsing {@value #FILE} works as expected. + * @throws Exception + */ + @Test + public void parseCorrect() throws Exception { + InputStream inputStream = getResourceStream(FILE); + Reader reader = getReader(inputStream); + TmxParser parser = new TmxParser(reader, SOURCE_LANGUAGE, + TARGET_LANGUAGE); + List alignmentList = parser.parse(); + assertAlignmentListEquals(SOURCE_SEGMENT_ARRAY, TARGET_SEGMENT_ARRAY, + alignmentList); + } + + public static final String BAD_SOURCE_LANGUAGE = "de"; + + /** + * Test if parsing {@value #FILE} but with a source language + * {@value #BAD_SOURCE_LANGUAGE} throws an exception because it contains + * more than one variant in this language in one translation unit. + * + * @see TmxParser + * @throws Exception + */ + @Test(expected=TmxParseException.class) + public void parseBadVariantCount() throws Exception { + InputStream inputStream = getResourceStream(FILE); + Reader reader = getReader(inputStream); + TmxParser parser = new TmxParser(reader, BAD_SOURCE_LANGUAGE, + TARGET_LANGUAGE); + parser.parse(); + } + +} diff --git a/src/net/sourceforge/align/progress/.svn/all-wcprops b/src/net/sourceforge/align/progress/.svn/all-wcprops new file mode 100644 index 0000000..01bac87 --- /dev/null +++ b/src/net/sourceforge/align/progress/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 75 +/svnroot/align/!svn/ver/56/trunk/maligna/src/net/sourceforge/align/progress +END +ProgressManager.java +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/57/trunk/maligna/src/net/sourceforge/align/progress/ProgressManager.java +END +ProgressMeter.java +K 25 +svn:wc:ra_dav:version-url +V 94 +/svnroot/align/!svn/ver/57/trunk/maligna/src/net/sourceforge/align/progress/ProgressMeter.java +END +WriterProgressObserver.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/57/trunk/maligna/src/net/sourceforge/align/progress/WriterProgressObserver.java +END +ProgressObserver.java +K 25 +svn:wc:ra_dav:version-url +V 97 +/svnroot/align/!svn/ver/58/trunk/maligna/src/net/sourceforge/align/progress/ProgressObserver.java +END diff --git a/src/net/sourceforge/align/progress/.svn/entries b/src/net/sourceforge/align/progress/.svn/entries new file mode 100644 index 0000000..2ec44d9 --- /dev/null +++ b/src/net/sourceforge/align/progress/.svn/entries @@ -0,0 +1,188 @@ +10 + +dir +56 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/progress +https://align.svn.sourceforge.net/svnroot/align + + + +2011-10-21T11:38:21.267762Z +56 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +ProgressManager.java +file +57 + + + +2011-10-23T08:52:08.329767Z +fafcd8f0a99b73e46d6ae0127077d5c7 +2011-10-23T09:19:34.947191Z +57 +jarekl + + + + + + + + + + + + + + + + + + + + + +3189 + +ProgressMeter.java +file +57 + + + +2011-10-23T08:44:30.876081Z +4ede124969e6ce4f4e23d159ab1355a2 +2011-10-23T09:19:34.947191Z +57 +jarekl + + + + + + + + + + + + + + + + + + + + + +3074 + +NullProgressObserver.java +file +57 + + + + + + + + + + + + + + + + + + + +deleted + +WriterProgressObserver.java +file +57 + + + +2011-10-23T08:46:26.030519Z +c7023eca507d0e33b28a35151e2ac0b3 +2011-10-23T09:19:34.947191Z +57 +jarekl + + + + + + + + + + + + + + + + + + + + + +2045 + +ProgressObserver.java +file +58 + + + +2011-10-24T11:58:41.357235Z +8cadc27d778c10a4166be37a2bf0da83 +2011-10-24T12:02:57.921746Z +58 +jarekl + + + + + + + + + + + + + + + + + + + + + +983 + diff --git a/src/net/sourceforge/align/progress/.svn/text-base/ProgressManager.java.svn-base b/src/net/sourceforge/align/progress/.svn/text-base/ProgressManager.java.svn-base new file mode 100644 index 0000000..e6a225b --- /dev/null +++ b/src/net/sourceforge/align/progress/.svn/text-base/ProgressManager.java.svn-base @@ -0,0 +1,115 @@ +package net.sourceforge.align.progress; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Represents manager for all tasks in progress and their observers. Singleton. + * + * @author loomchild + */ +public class ProgressManager { + + private static ProgressManager instance = new ProgressManager(); + + private Map progressMeterMap; + + private List progressObserverList; + + /** + * @return singleton manager instance + */ + public static ProgressManager getInstance() { + return instance; + } + + private ProgressManager() { + this.progressMeterMap = new HashMap(); + this.progressObserverList = new ArrayList(); + } + + /** + * @param name progress meter name + * @return progress meter instance with given name + */ + public ProgressMeter getProgressMeter(String name) { + ProgressMeter progressMeter = progressMeterMap.get(name); + + if (progressMeter == null) { + throw new IllegalArgumentException("Progress meter: " + name + " does not exist."); + } + + return progressMeter; + } + + /** + * Registers progress meter in the manager, fires register event to the + * observers. + * @param progressMeter + */ + public void registerProgressMeter(ProgressMeter progressMeter) { + if (progressMeterMap.get(progressMeter.getName()) != null) { + throw new IllegalArgumentException("Progress meter: " + progressMeter.getName() + " already exists."); + } + + progressMeterMap.put(progressMeter.getName(), progressMeter); + + for(ProgressObserver progressObserver : progressObserverList) { + progressObserver.registerProgressMeter(progressMeter); + } + } + + /** + * Unregisters progress meter from the manager, fires unregister event + * to the observers. + * @param progressMeter + */ + public void unregisterProgressMeter(ProgressMeter progressMeter) { + if (progressMeterMap.remove(progressMeter.getName()) == null) { + throw new IllegalArgumentException("Progress meter: " + progressMeter.getName() + " does not exist."); + } + + for(ProgressObserver progressObserver : progressObserverList) { + progressObserver.unregisterProgressMeter(progressMeter); + } + } + + /** + * Fires complete task event to the observers. + * @param progressMeter + */ + void completeTask(ProgressMeter progressMeter) { + for(ProgressObserver progressObserver : progressObserverList) { + progressObserver.completeTask(progressMeter); + } + } + + /** + * Registers progress observer, it will be notified of the future events. + * @param progressObserver + */ + public void registerProgressObserver(ProgressObserver progressObserver) { + this.progressObserverList.add(progressObserver); + } + + /** + * Unregisters progress observer. It will not be notified of the future + * events. + * @param progressObserver + */ + public void unregisterProgressObserver(ProgressObserver progressObserver) { + if (!progressObserverList.remove(progressObserver)) { + throw new IllegalArgumentException("Unknown observer " + progressObserver.toString()); + } + } + + /** + * @return list of progress observers. + */ + public List getProgressObserverList() { + return progressObserverList; + } + +} diff --git a/src/net/sourceforge/align/progress/.svn/text-base/ProgressMeter.java.svn-base b/src/net/sourceforge/align/progress/.svn/text-base/ProgressMeter.java.svn-base new file mode 100644 index 0000000..b1e739e --- /dev/null +++ b/src/net/sourceforge/align/progress/.svn/text-base/ProgressMeter.java.svn-base @@ -0,0 +1,133 @@ +package net.sourceforge.align.progress; + +/** + *

+ * Represents progress meter. Processes inform it about task progress, and + * it notifies its observers via {@link ProgressManager}. + *

+ * + *

+ * After creating ProgressMeter it needs to be registered via + * {@link ProgressManager#registerProgressMeter(ProgressMeter)} method. + * After task completes it must be unregistered via + * {@link ProgressManager#unregisterProgressMeter(ProgressMeter)} method. + *

+ * + *

+ * To improve performance observer are not notified of every completed task, + * maximum number of notifications is controlled by steps parameter. + *

+ * + *

+ * TODO: maybe add parent progress meter to have a hierarchy. + *

+ * + * @author loomchild + */ +public class ProgressMeter { + + /** + * Default maximum number of notifications sent to the observer. + */ + private static final int DEFAULT_STEPS = 1000; + + private String name; + + private int totalTasks; + + private int completedTasks; + + /** + * Number of steps communicated to the observers. + */ + private int reportedSteps; + + /** + * Number of tasks per single step. + */ + private float tasksPerStep; + + + /** + * Creates Progress meter. + * + * @see #ProgressMeter(String, int, int) + * + * @param name progress meter name + * @param totalTasks total number of tasks in this process + */ + public ProgressMeter(String name, int totalTasks) { + this(name, totalTasks, DEFAULT_STEPS); + } + + /** + * Creates Progress meter. To make it fully functional it must be + * registered via + * {@link ProgressManager#registerProgressMeter(ProgressMeter)} method. + * + * @param name progress meter name + * @param totalTasks total number of tasks in this process + * @param steps maximum number of notifications to the observers this + * progress meter will generate, regardless of total tasks + */ + public ProgressMeter(String name, int totalTasks, int steps) { + this.name = name; + this.totalTasks = totalTasks; + if (steps <= totalTasks) { + this.tasksPerStep = totalTasks / steps; + } else { + this.tasksPerStep = 1; + } + } + + /** + * Complete a single task. + */ + public void completeTask() { + completeTasks(1); + } + + /** + * Complete given number of tasks. + * + * @param tasks number of tasks to complete + */ + public void completeTasks(int tasks) { + completedTasks += tasks; + int currentSteps = (int)(completedTasks / tasksPerStep); + if (currentSteps > reportedSteps || completedTasks >= totalTasks) { + reportedSteps = currentSteps; + ProgressManager.getInstance().completeTask(this); + } + } + + /** + * @return number of total tasks for this progress meter + */ + public int getTotalTasks() { + return totalTasks; + } + + /** + * @return number of completed tasks for this meter + */ + public int getCompletedTasks() { + return completedTasks; + } + + /** + * @return ratio of completed tasks / total tasks + */ + public float getProgress() { + float result = 0; + if (totalTasks > 0) { + result = (float)completedTasks / totalTasks; + } + return result; + } + + public String getName() { + return name; + } + +} diff --git a/src/net/sourceforge/align/progress/.svn/text-base/ProgressObserver.java.svn-base b/src/net/sourceforge/align/progress/.svn/text-base/ProgressObserver.java.svn-base new file mode 100644 index 0000000..810d50a --- /dev/null +++ b/src/net/sourceforge/align/progress/.svn/text-base/ProgressObserver.java.svn-base @@ -0,0 +1,33 @@ +package net.sourceforge.align.progress; + +/** + * Represents progress observer that listens to progress events. + * + * @author loomchild + */ +public interface ProgressObserver { + + /** + * Occurs when {@link ProgressManager#registerProgressMeter(ProgressMeter)} + * method is called, at the beginning of a process. + * @param progressMeter + */ + public void registerProgressMeter(ProgressMeter progressMeter); + + /** + * Occurs when {@link ProgressMeter#completeTask()} or + * {@link ProgressMeter#completeTasks(int)} methods are called. + * Not every completed task may trigger this event, + * number of notifications can be lower than the number of actual tasks. + * @param progressMeter + */ + public void completeTask(ProgressMeter progressMeter); + + /** + * Occurs when {@link ProgressManager#unregisterProgressMeter(ProgressMeter)} + * method is called, at the end of a process. + * @param progressMeter + */ + public void unregisterProgressMeter(ProgressMeter progressMeter); + +} diff --git a/src/net/sourceforge/align/progress/.svn/text-base/WriterProgressObserver.java.svn-base b/src/net/sourceforge/align/progress/.svn/text-base/WriterProgressObserver.java.svn-base new file mode 100644 index 0000000..ebc074e --- /dev/null +++ b/src/net/sourceforge/align/progress/.svn/text-base/WriterProgressObserver.java.svn-base @@ -0,0 +1,102 @@ +package net.sourceforge.align.progress; + +import java.io.IOException; +import java.io.Writer; + +/** + *

+ * Represents progress observer that uses {@link Writer} to record the events. + *

+ * + *

+ * It needs to be registered via + * {@link ProgressManager#registerProgressObserver(ProgressObserver)} method + * before use. + *

+ * + * @author loomchild + */ +public class WriterProgressObserver implements ProgressObserver { + + /** + * Character that will be used to indicate the progress. + */ + public static final char PROGRESS_CHAR = '.'; + + private Writer writer; + + private int size; + + private int index; + + /** + * Creates progress observer. + * + * @param writer writer to use to communicate events. + * @param size size of progress bar in characters + */ + public WriterProgressObserver(Writer writer, int size) { + this.writer = writer; + this.size = size; + reset(); + } + + /** + * Writes new character if necessary. + */ + @Override + public void completeTask(ProgressMeter progressMeter) { + int newIndex = (int)(size * progressMeter.getProgress()); + if (newIndex > index) { + updateIndex(newIndex); + } + } + + private void updateIndex(int newIndex) { + assert newIndex > index && newIndex <= size; + + for (; index < newIndex; ++index) { + write(PROGRESS_CHAR); + } + } + + /** + * Writes task name. + */ + @Override + public void registerProgressMeter(ProgressMeter progressMeter) { + write(progressMeter.getName() + " [" + progressMeter.getTotalTasks() + " ops] "); + } + + /** + * Resets its index for the next task and writes EOL character. + */ + @Override + public void unregisterProgressMeter(ProgressMeter progressMeter) { + reset(); + write('\n'); + } + + private void reset() { + this.index = 0; + } + + private void write(char character) { + try { + writer.write(character); + writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void write(String string) { + try { + writer.write(string); + writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/net/sourceforge/align/progress/ProgressManager.java b/src/net/sourceforge/align/progress/ProgressManager.java new file mode 100644 index 0000000..e6a225b --- /dev/null +++ b/src/net/sourceforge/align/progress/ProgressManager.java @@ -0,0 +1,115 @@ +package net.sourceforge.align.progress; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Represents manager for all tasks in progress and their observers. Singleton. + * + * @author loomchild + */ +public class ProgressManager { + + private static ProgressManager instance = new ProgressManager(); + + private Map progressMeterMap; + + private List progressObserverList; + + /** + * @return singleton manager instance + */ + public static ProgressManager getInstance() { + return instance; + } + + private ProgressManager() { + this.progressMeterMap = new HashMap(); + this.progressObserverList = new ArrayList(); + } + + /** + * @param name progress meter name + * @return progress meter instance with given name + */ + public ProgressMeter getProgressMeter(String name) { + ProgressMeter progressMeter = progressMeterMap.get(name); + + if (progressMeter == null) { + throw new IllegalArgumentException("Progress meter: " + name + " does not exist."); + } + + return progressMeter; + } + + /** + * Registers progress meter in the manager, fires register event to the + * observers. + * @param progressMeter + */ + public void registerProgressMeter(ProgressMeter progressMeter) { + if (progressMeterMap.get(progressMeter.getName()) != null) { + throw new IllegalArgumentException("Progress meter: " + progressMeter.getName() + " already exists."); + } + + progressMeterMap.put(progressMeter.getName(), progressMeter); + + for(ProgressObserver progressObserver : progressObserverList) { + progressObserver.registerProgressMeter(progressMeter); + } + } + + /** + * Unregisters progress meter from the manager, fires unregister event + * to the observers. + * @param progressMeter + */ + public void unregisterProgressMeter(ProgressMeter progressMeter) { + if (progressMeterMap.remove(progressMeter.getName()) == null) { + throw new IllegalArgumentException("Progress meter: " + progressMeter.getName() + " does not exist."); + } + + for(ProgressObserver progressObserver : progressObserverList) { + progressObserver.unregisterProgressMeter(progressMeter); + } + } + + /** + * Fires complete task event to the observers. + * @param progressMeter + */ + void completeTask(ProgressMeter progressMeter) { + for(ProgressObserver progressObserver : progressObserverList) { + progressObserver.completeTask(progressMeter); + } + } + + /** + * Registers progress observer, it will be notified of the future events. + * @param progressObserver + */ + public void registerProgressObserver(ProgressObserver progressObserver) { + this.progressObserverList.add(progressObserver); + } + + /** + * Unregisters progress observer. It will not be notified of the future + * events. + * @param progressObserver + */ + public void unregisterProgressObserver(ProgressObserver progressObserver) { + if (!progressObserverList.remove(progressObserver)) { + throw new IllegalArgumentException("Unknown observer " + progressObserver.toString()); + } + } + + /** + * @return list of progress observers. + */ + public List getProgressObserverList() { + return progressObserverList; + } + +} diff --git a/src/net/sourceforge/align/progress/ProgressMeter.java b/src/net/sourceforge/align/progress/ProgressMeter.java new file mode 100644 index 0000000..b1e739e --- /dev/null +++ b/src/net/sourceforge/align/progress/ProgressMeter.java @@ -0,0 +1,133 @@ +package net.sourceforge.align.progress; + +/** + *

+ * Represents progress meter. Processes inform it about task progress, and + * it notifies its observers via {@link ProgressManager}. + *

+ * + *

+ * After creating ProgressMeter it needs to be registered via + * {@link ProgressManager#registerProgressMeter(ProgressMeter)} method. + * After task completes it must be unregistered via + * {@link ProgressManager#unregisterProgressMeter(ProgressMeter)} method. + *

+ * + *

+ * To improve performance observer are not notified of every completed task, + * maximum number of notifications is controlled by steps parameter. + *

+ * + *

+ * TODO: maybe add parent progress meter to have a hierarchy. + *

+ * + * @author loomchild + */ +public class ProgressMeter { + + /** + * Default maximum number of notifications sent to the observer. + */ + private static final int DEFAULT_STEPS = 1000; + + private String name; + + private int totalTasks; + + private int completedTasks; + + /** + * Number of steps communicated to the observers. + */ + private int reportedSteps; + + /** + * Number of tasks per single step. + */ + private float tasksPerStep; + + + /** + * Creates Progress meter. + * + * @see #ProgressMeter(String, int, int) + * + * @param name progress meter name + * @param totalTasks total number of tasks in this process + */ + public ProgressMeter(String name, int totalTasks) { + this(name, totalTasks, DEFAULT_STEPS); + } + + /** + * Creates Progress meter. To make it fully functional it must be + * registered via + * {@link ProgressManager#registerProgressMeter(ProgressMeter)} method. + * + * @param name progress meter name + * @param totalTasks total number of tasks in this process + * @param steps maximum number of notifications to the observers this + * progress meter will generate, regardless of total tasks + */ + public ProgressMeter(String name, int totalTasks, int steps) { + this.name = name; + this.totalTasks = totalTasks; + if (steps <= totalTasks) { + this.tasksPerStep = totalTasks / steps; + } else { + this.tasksPerStep = 1; + } + } + + /** + * Complete a single task. + */ + public void completeTask() { + completeTasks(1); + } + + /** + * Complete given number of tasks. + * + * @param tasks number of tasks to complete + */ + public void completeTasks(int tasks) { + completedTasks += tasks; + int currentSteps = (int)(completedTasks / tasksPerStep); + if (currentSteps > reportedSteps || completedTasks >= totalTasks) { + reportedSteps = currentSteps; + ProgressManager.getInstance().completeTask(this); + } + } + + /** + * @return number of total tasks for this progress meter + */ + public int getTotalTasks() { + return totalTasks; + } + + /** + * @return number of completed tasks for this meter + */ + public int getCompletedTasks() { + return completedTasks; + } + + /** + * @return ratio of completed tasks / total tasks + */ + public float getProgress() { + float result = 0; + if (totalTasks > 0) { + result = (float)completedTasks / totalTasks; + } + return result; + } + + public String getName() { + return name; + } + +} diff --git a/src/net/sourceforge/align/progress/ProgressObserver.java b/src/net/sourceforge/align/progress/ProgressObserver.java new file mode 100644 index 0000000..810d50a --- /dev/null +++ b/src/net/sourceforge/align/progress/ProgressObserver.java @@ -0,0 +1,33 @@ +package net.sourceforge.align.progress; + +/** + * Represents progress observer that listens to progress events. + * + * @author loomchild + */ +public interface ProgressObserver { + + /** + * Occurs when {@link ProgressManager#registerProgressMeter(ProgressMeter)} + * method is called, at the beginning of a process. + * @param progressMeter + */ + public void registerProgressMeter(ProgressMeter progressMeter); + + /** + * Occurs when {@link ProgressMeter#completeTask()} or + * {@link ProgressMeter#completeTasks(int)} methods are called. + * Not every completed task may trigger this event, + * number of notifications can be lower than the number of actual tasks. + * @param progressMeter + */ + public void completeTask(ProgressMeter progressMeter); + + /** + * Occurs when {@link ProgressManager#unregisterProgressMeter(ProgressMeter)} + * method is called, at the end of a process. + * @param progressMeter + */ + public void unregisterProgressMeter(ProgressMeter progressMeter); + +} diff --git a/src/net/sourceforge/align/progress/WriterProgressObserver.java b/src/net/sourceforge/align/progress/WriterProgressObserver.java new file mode 100644 index 0000000..ebc074e --- /dev/null +++ b/src/net/sourceforge/align/progress/WriterProgressObserver.java @@ -0,0 +1,102 @@ +package net.sourceforge.align.progress; + +import java.io.IOException; +import java.io.Writer; + +/** + *

+ * Represents progress observer that uses {@link Writer} to record the events. + *

+ * + *

+ * It needs to be registered via + * {@link ProgressManager#registerProgressObserver(ProgressObserver)} method + * before use. + *

+ * + * @author loomchild + */ +public class WriterProgressObserver implements ProgressObserver { + + /** + * Character that will be used to indicate the progress. + */ + public static final char PROGRESS_CHAR = '.'; + + private Writer writer; + + private int size; + + private int index; + + /** + * Creates progress observer. + * + * @param writer writer to use to communicate events. + * @param size size of progress bar in characters + */ + public WriterProgressObserver(Writer writer, int size) { + this.writer = writer; + this.size = size; + reset(); + } + + /** + * Writes new character if necessary. + */ + @Override + public void completeTask(ProgressMeter progressMeter) { + int newIndex = (int)(size * progressMeter.getProgress()); + if (newIndex > index) { + updateIndex(newIndex); + } + } + + private void updateIndex(int newIndex) { + assert newIndex > index && newIndex <= size; + + for (; index < newIndex; ++index) { + write(PROGRESS_CHAR); + } + } + + /** + * Writes task name. + */ + @Override + public void registerProgressMeter(ProgressMeter progressMeter) { + write(progressMeter.getName() + " [" + progressMeter.getTotalTasks() + " ops] "); + } + + /** + * Resets its index for the next task and writes EOL character. + */ + @Override + public void unregisterProgressMeter(ProgressMeter progressMeter) { + reset(); + write('\n'); + } + + private void reset() { + this.index = 0; + } + + private void write(char character) { + try { + writer.write(character); + writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void write(String string) { + try { + writer.write(string); + writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/net/sourceforge/align/ui/.svn/all-wcprops b/src/net/sourceforge/align/ui/.svn/all-wcprops new file mode 100644 index 0000000..80d7502 --- /dev/null +++ b/src/net/sourceforge/align/ui/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/align/!svn/ver/49/trunk/maligna/src/net/sourceforge/align/ui +END diff --git a/src/net/sourceforge/align/ui/.svn/entries b/src/net/sourceforge/align/ui/.svn/entries new file mode 100644 index 0000000..f0b5706 --- /dev/null +++ b/src/net/sourceforge/align/ui/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/ui +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:06:44.618350Z +49 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +console +dir + diff --git a/src/net/sourceforge/align/ui/console/.svn/all-wcprops b/src/net/sourceforge/align/ui/console/.svn/all-wcprops new file mode 100644 index 0000000..b038cc2 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 77 +/svnroot/align/!svn/ver/49/trunk/maligna/src/net/sourceforge/align/ui/console +END +Maligna.java +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/ui/console/Maligna.java +END diff --git a/src/net/sourceforge/align/ui/console/.svn/entries b/src/net/sourceforge/align/ui/console/.svn/entries new file mode 100644 index 0000000..a598a0b --- /dev/null +++ b/src/net/sourceforge/align/ui/console/.svn/entries @@ -0,0 +1,65 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/ui/console +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:06:44.618350Z +49 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Maligna.java +file + + + + +2010-10-29T08:53:10.000000Z +809843c933f442221d14f6bcf12843a2 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2213 + +command +dir + diff --git a/src/net/sourceforge/align/ui/console/.svn/text-base/Maligna.java.svn-base b/src/net/sourceforge/align/ui/console/.svn/text-base/Maligna.java.svn-base new file mode 100644 index 0000000..747a5c0 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/.svn/text-base/Maligna.java.svn-base @@ -0,0 +1,80 @@ +package net.sourceforge.align.ui.console; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.ui.console.command.Command; +import net.sourceforge.align.ui.console.command.CommandFactory; +import net.sourceforge.align.util.Version; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class Maligna { + + private static final Log log = LogFactory.getLog(Maligna.class); + + public static final String MAIN_COMMAND_NAME = "maligna"; + + + public static void main(String[] args) { + Maligna maligna = new Maligna(); + maligna.run(args); + } + + public static void printSignature() { + String signature = "mALIGNa"; + if (Version.getInstance().getVersion() != null) { + signature += " " + Version.getInstance().getVersion(); + } + if (Version.getInstance().getDate() != null) { + signature += ", " + Version.getInstance().getDate(); + } + signature += "."; + System.out.println(signature); + } + + private void run(String[] args) { + try { + if (args.length == 0) { + printUsage(); + } else { + String commandName = args[0]; + if (commandName.equals("-h") || commandName.equals("--help")) { + printHelp(); + } else { + Command command = + CommandFactory.getInstance().getCommand(commandName); + if (command == null) { + printUsage(); + } else { + String[] commandArgs = + Arrays.copyOfRange(args, 1, args.length); + command.run(commandArgs); + } + } + } + } catch (Exception e) { + log.fatal("Unknown exception.", e); + } + } + + private void printUsage() { + System.out.println("Unknown command. Use maligna -h for help."); + } + + private void printHelp() { + printSignature(); + System.out.println("Syntax: "); + System.out.println(" maligna [command options...]"); + System.out.println("Available commands are: "); + List commandNameList = + new ArrayList(CommandFactory.getInstance().getCommandNameSet()); + Collections.sort(commandNameList); + System.out.println(" " + Arrays.toString(commandNameList.toArray())); + System.out.println("To get help on specific command options use maligna -h."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/Maligna.java b/src/net/sourceforge/align/ui/console/Maligna.java new file mode 100755 index 0000000..747a5c0 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/Maligna.java @@ -0,0 +1,80 @@ +package net.sourceforge.align.ui.console; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.ui.console.command.Command; +import net.sourceforge.align.ui.console.command.CommandFactory; +import net.sourceforge.align.util.Version; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class Maligna { + + private static final Log log = LogFactory.getLog(Maligna.class); + + public static final String MAIN_COMMAND_NAME = "maligna"; + + + public static void main(String[] args) { + Maligna maligna = new Maligna(); + maligna.run(args); + } + + public static void printSignature() { + String signature = "mALIGNa"; + if (Version.getInstance().getVersion() != null) { + signature += " " + Version.getInstance().getVersion(); + } + if (Version.getInstance().getDate() != null) { + signature += ", " + Version.getInstance().getDate(); + } + signature += "."; + System.out.println(signature); + } + + private void run(String[] args) { + try { + if (args.length == 0) { + printUsage(); + } else { + String commandName = args[0]; + if (commandName.equals("-h") || commandName.equals("--help")) { + printHelp(); + } else { + Command command = + CommandFactory.getInstance().getCommand(commandName); + if (command == null) { + printUsage(); + } else { + String[] commandArgs = + Arrays.copyOfRange(args, 1, args.length); + command.run(commandArgs); + } + } + } + } catch (Exception e) { + log.fatal("Unknown exception.", e); + } + } + + private void printUsage() { + System.out.println("Unknown command. Use maligna -h for help."); + } + + private void printHelp() { + printSignature(); + System.out.println("Syntax: "); + System.out.println(" maligna [command options...]"); + System.out.println("Available commands are: "); + List commandNameList = + new ArrayList(CommandFactory.getInstance().getCommandNameSet()); + Collections.sort(commandNameList); + System.out.println(" " + Arrays.toString(commandNameList.toArray())); + System.out.println("To get help on specific command options use maligna -h."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/all-wcprops b/src/net/sourceforge/align/ui/console/command/.svn/all-wcprops new file mode 100644 index 0000000..5cd6189 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/all-wcprops @@ -0,0 +1,77 @@ +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/align/!svn/ver/49/trunk/maligna/src/net/sourceforge/align/ui/console/command +END +ModelCommand.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/ui/console/command/ModelCommand.java +END +MacroCommand.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/49/trunk/maligna/src/net/sourceforge/align/ui/console/command/MacroCommand.java +END +AbstractCommand.java +K 25 +svn:wc:ra_dav:version-url +V 106 +/svnroot/align/!svn/ver/57/trunk/maligna/src/net/sourceforge/align/ui/console/command/AbstractCommand.java +END +CompareCommand.java +K 25 +svn:wc:ra_dav:version-url +V 105 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/ui/console/command/CompareCommand.java +END +CommandFactory.java +K 25 +svn:wc:ra_dav:version-url +V 105 +/svnroot/align/!svn/ver/18/trunk/maligna/src/net/sourceforge/align/ui/console/command/CommandFactory.java +END +ModifyCommand.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/49/trunk/maligna/src/net/sourceforge/align/ui/console/command/ModifyCommand.java +END +FormatCommand.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/ui/console/command/FormatCommand.java +END +ParseCommand.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/ui/console/command/ParseCommand.java +END +AlignCommand.java +K 25 +svn:wc:ra_dav:version-url +V 103 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/ui/console/command/AlignCommand.java +END +SelectCommand.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/49/trunk/maligna/src/net/sourceforge/align/ui/console/command/SelectCommand.java +END +Command.java +K 25 +svn:wc:ra_dav:version-url +V 98 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/ui/console/command/Command.java +END +TestCommand.java +K 25 +svn:wc:ra_dav:version-url +V 102 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/ui/console/command/TestCommand.java +END diff --git a/src/net/sourceforge/align/ui/console/command/.svn/entries b/src/net/sourceforge/align/ui/console/command/.svn/entries new file mode 100644 index 0000000..3af7d1d --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/entries @@ -0,0 +1,395 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/ui/console/command +https://align.svn.sourceforge.net/svnroot/align + + + +2010-12-02T11:06:44.618350Z +49 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +ModelCommand.java +file + + + + +2010-10-28T16:40:14.000000Z +7c65422e9d290a7aea5cb11031ffbf0f +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +3105 + +MacroCommand.java +file + + + + +2010-12-02T07:43:34.000000Z +98600b9a01be223262760e0658114a4d +2010-12-02T11:06:44.618350Z +49 +jarekl + + + + + + + + + + + + + + + + + + + + + +2122 + +AbstractCommand.java +file +57 + + + +2011-10-23T08:37:49.003573Z +41d5eedb76635365f142da1542414d76 +2011-10-23T09:19:34.947191Z +57 +jarekl + + + + + + + + + + + + + + + + + + + + + +5914 + +CompareCommand.java +file + + + + +2010-10-28T16:40:13.000000Z +5385a08f45022932bd54853b00799b15 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +3237 + +CommandFactory.java +file + + + + +2008-08-21T00:30:31.000000Z +c412c4e40f74222df57e47d73f19aef1 +2008-08-21T01:50:59.569127Z +18 +jarekl + +ModifyCommand.java +file + + + + +2010-12-02T07:43:35.000000Z +3c6b07fcc602de159fd5f1c90bfc47db +2010-12-02T11:06:44.618350Z +49 +jarekl + + + + + + + + + + + + + + + + + + + + + +8015 + +FormatCommand.java +file + + + + +2010-10-28T16:40:14.000000Z +f005f7d1a505bbb6d01ca27cc7ac144c +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +3992 + +AlignCommand.java +file +53 + + + +2011-02-16T08:48:05.000000Z +0b62e6dec4d148775cc9db0b23c17456 +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +15195 + +ParseCommand.java +file + + + + +2010-10-28T16:40:14.000000Z +5ef3ac232821a96d4946d651263fbb65 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +4034 + +Command.java +file + + + + +2008-08-20T21:15:13.000000Z +379f6bd28948d082fd7c8e0bd7df57bc +2008-04-24T08:23:10.479977Z +11 +jarekl + +SelectCommand.java +file + + + + +2010-12-02T07:43:35.000000Z +b0c659ab1815ce03a43ababe8158f0ca +2010-12-02T11:06:44.618350Z +49 +jarekl + + + + + + + + + + + + + + + + + + + + + +3478 + +TestCommand.java +file + + + + +2010-10-29T08:53:59.000000Z +951f6b27485b63784a6ea1a3b4d307b1 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +666 + +exception +dir + diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/AbstractCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/AbstractCommand.java.svn-base new file mode 100644 index 0000000..9e7e445 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/AbstractCommand.java.svn-base @@ -0,0 +1,202 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getReader; +import static net.sourceforge.align.util.Util.getWriter; + +import java.io.BufferedReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + +import net.sourceforge.align.progress.ProgressManager; +import net.sourceforge.align.progress.WriterProgressObserver; +import net.sourceforge.align.ui.console.Maligna; +import net.sourceforge.align.ui.console.command.exception.CommandException; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.ParametersParseException; + +import org.apache.commons.cli.BasicParser; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.Parser; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + + +public abstract class AbstractCommand implements Command { + + Log log = LogFactory.getLog(AbstractCommand.class); + + private BufferedReader in; + private PrintWriter out; + private PrintWriter err; + private HelpFormatter helpFormatter; + private Options options; + + public AbstractCommand() { + this.in = getReader(System.in); + this.err = new PrintWriter(System.err, true); + this.out = getWriter(System.out); + this.helpFormatter = new HelpFormatter(); + this.options = new Options(); + initBasicOptions(options); + initOptions(options); + } + + public String getName() { + String className = this.getClass().getSimpleName(); + int nameLength = className.length() - Command.class.getSimpleName().length(); + String name = className.substring(0, nameLength).toLowerCase(); + return name; + } + + public void run(String[] args) { + try { + Parser optionParser = new BasicParser(); + CommandLine commandLine; + try { + commandLine = optionParser.parse(options, args); + } catch (ParseException e) { + throw new ParametersParseException(e); + } + if (commandLine.hasOption('h')) { + printHelp(); + } else { + String verbosity = commandLine.getOptionValue('v'); + setVerbosity(verbosity); + setProgress(verbosity); + run(commandLine); + } + } catch (CommandException e) { + log.debug("Command exception.", e); + err.println(e.getMessage()); + printUsage(); + } catch (Exception e) { + log.error("Unknown exception", e); + } + } + + protected Options getOptions() { + return options; + } + + protected BufferedReader getIn() { + return in; + } + + protected PrintWriter getOut() { + return out; + } + + protected PrintWriter getErr() { + return err; + } + + protected void printUsage() { + helpFormatter.printUsage(out, 80, Maligna.MAIN_COMMAND_NAME + " " + getName() + " -h"); + } + + protected void printHelp() { + Maligna.printSignature(); + helpFormatter.printHelp(Maligna.MAIN_COMMAND_NAME + " " + getName(), options, true); + } + + private void initBasicOptions(Options options) { + options.addOption("h", "help", false, "Display help message."); + options.addOption("v", "verbosity", true, "Set verbosity level. Correct values are: trace, debug, info[default], warn, error, fatal, quiet[no progress meter]"); + } + + private void setVerbosity(String verbosity) { + Level level = Level.INFO; + if ("trace".equals(verbosity)) { + level = Level.FINEST; + } else if ("debug".equals(verbosity)) { + level = Level.FINE; + } else if ("info".equals(verbosity)) { + level = Level.INFO; + } else if ("warn".equals(verbosity)) { + level = Level.WARNING; + } else if ("error".equals(verbosity)) { + level = Level.SEVERE; + } else if ("fatal".equals(verbosity)) { + level = Level.SEVERE; + } else if ("quiet".equals(verbosity)) { + level = Level.OFF; + } else if (verbosity != null) { + throw new ParameterFormatException("verbosity"); + } + Logger logger = Logger.getLogger(""); + logger.setLevel(level); + for (Handler handler : logger.getHandlers()) { + handler.setLevel(Level.ALL); + } + log.debug("Setting verbosity level to " + verbosity + "."); + } + + private void setProgress(String verbosity) { + if (!"quiet".equals(verbosity)) { + log.debug("Enabling progress meter."); + WriterProgressObserver progressObserver = new WriterProgressObserver(new OutputStreamWriter(System.err), 40); + ProgressManager.getInstance().registerProgressObserver(progressObserver); + } + } + + protected abstract void initOptions(Options options); + + protected abstract void run(CommandLine commandLine); + + protected int createInt(CommandLine commandLine, String command) { + return createInt(commandLine, command, null); + } + + protected int createInt(CommandLine commandLine, String command, + Integer defaultValue) { + String string = commandLine.getOptionValue(command); + int value; + if (string == null) { + if (defaultValue != null) { + value = defaultValue; + } else { + throw new MissingParameterException(command); + } + } else { + try { + value = Integer.parseInt(string); + } catch (NumberFormatException e) { + throw new ParameterFormatException(command); + } + } + return value; + } + + protected float createFloat(CommandLine commandLine, String command) { + return createFloat(commandLine, command, null); + } + + protected float createFloat(CommandLine commandLine, String command, + Float defaultValue) { + String string = commandLine.getOptionValue(command); + float value; + if (string == null) { + if (defaultValue != null) { + value = defaultValue; + } else { + throw new MissingParameterException(command); + } + } else { + try { + value = Float.parseFloat(string); + } catch (NumberFormatException e) { + throw new ParameterFormatException(command); + } + } + return value; + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/AlignCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/AlignCommand.java.svn-base new file mode 100644 index 0000000..22ade1d --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/AlignCommand.java.svn-base @@ -0,0 +1,352 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.content.OracleCalculator; +import net.sourceforge.align.calculator.content.TranslationCalculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.PoissonDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.calculator.length.counter.SplitCounter; +import net.sourceforge.align.calculator.meta.CompositeCalculator; +import net.sourceforge.align.calculator.meta.MinimumCalculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.coretypes.CategoryDefaults; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.UnifyAligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.onetoone.OneToOneAlgorithm; +import net.sourceforge.align.filter.meta.FilterDecorators; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.matrix.BandMatrixFactory; +import net.sourceforge.align.matrix.FullMatrixFactory; +import net.sourceforge.align.matrix.MatrixFactory; +import net.sourceforge.align.model.language.LanguageModel; +import net.sourceforge.align.model.language.LanguageModelUtil; +import net.sourceforge.align.model.translation.TranslationModel; +import net.sourceforge.align.model.translation.TranslationModelUtil; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + + +public class AlignCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Algorithm class. Valid values are: viterbi, fb, one-to-one, unify."); + options.addOption("o", "one", false, "Strict one to one alignment."); + options.addOption("s", "search", true, "Search method. Valid values are: exhaustive, band, iterative-band. Required by viterbi and fb algorithms."); + options.addOption("r", "radius", true, "Band radius in segments. Optional for band, iterband search method, default " + BandMatrixFactory.DEFAULT_BAND_RADIUS + "."); + options.addOption("e", "increment", true, "Band increment ratio in each pass. Optional for iterband search method, default " + AdaptiveBandAlgorithm.DEFAULT_BAND_INCREMENT_RATIO + "."); + options.addOption("m", "margin", true, "Band minimum acceptable margin. Optional for iterband search method, default " + AdaptiveBandAlgorithm.DEFAULT_MIN_BAND_MARGIN + "."); + options.addOption("a", "calculator", true, "Calculator classes separated by commas. Valid values are: normal, poisson, translation, oracle. Required by viterbi and fb algorithms."); + options.addOption("n", "counter", true, "Length counter, Valid values are: char, word. Required by normal and poisson calculators."); + options.addOption("l", "length-corpus", true, "Length model training corpus. Optional for poisson calculator."); + options.addOption("t", "translation-corpus", true, "Translation model training corpus. Optional for translation calculator."); + options.addOption("d", "oracle-corpus", true, "Oracle calculator corpus. Required by oracle calculator."); + options.addOption("x", "language-models", true, "Source and target language model separated by comma. Optional for translation calculator."); + options.addOption("y", "translation-model", true, "Translation model. Optional for translation calculator."); + options.addOption("i", "iterations", true, "Translation model train iteration count. Optional for translation calculator, default " + TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT + "."); + options.addOption("u", "unification-corpus", true, "Unification reference corpus. Required by unify algorithm."); + } + + protected void run(CommandLine commandLine) { + if (commandLine.getOptions().length == 0) { + throw new MissingParameterException("class"); + } + Filter filter; + Parser parser = new AlParser(getIn()); + List alignmentList = null; + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + if (cls.equals("unify")) { + String unificationCorpus = commandLine.getOptionValue('u'); + if (unificationCorpus == null) { + throw new MissingParameterException("unification-corpus"); + } + List unificationAlignmentList = + loadAlignmentList(unificationCorpus); + filter = new UnifyAligner(unificationAlignmentList); + } else { + alignmentList = parser.parse(); + AlignAlgorithm algorithm = createAlgorithm(commandLine, alignmentList); + filter = new Aligner(algorithm); + } + filter = FilterDecorators.decorate(filter); + Formatter formatter = new AlFormatter(getOut()); + if (alignmentList == null) { + alignmentList = parser.parse(); + } + alignmentList = filter.apply(alignmentList); + formatter.format(alignmentList); + } + + private AlignAlgorithm createAlgorithm(CommandLine commandLine, + List alignmentList) { + String cls = commandLine.getOptionValue('c'); + AlignAlgorithm algorithm; + if (cls.equals("fb") || cls.equals("viterbi")) { + Calculator calculator = createCalculator(commandLine, + alignmentList); + Map categoryMap = + CategoryDefaults.BEST_CATEGORY_MAP; + String search = commandLine.getOptionValue('s'); + if (search == null) { + throw new MissingParameterException("search"); + } + if (search.equals("exhaustive") || search.equals("band")) { + MatrixFactory matrixFactory; + if (search.equals("exhaustive")) { + matrixFactory = new FullMatrixFactory(); + } else if (search.equals("band")) { + int radius = createInt(commandLine, "radius", + BandMatrixFactory.DEFAULT_BAND_RADIUS); + matrixFactory = new BandMatrixFactory(radius); + } else { + throw new UnknownParameterException("search"); + } + if (cls.equals("viterbi")) { + algorithm = new ViterbiAlgorithm(calculator, + categoryMap, matrixFactory); + } else if (cls.equals("fb")) { + algorithm = new ForwardBackwardAlgorithm(calculator, + categoryMap, matrixFactory); + } else { + throw new UnknownParameterException("class"); + } + } else if (search.equals("iterative-band")) { + int radius = createInt(commandLine, "radius", + BandMatrixFactory.DEFAULT_BAND_RADIUS); + int margin = createInt(commandLine, "margin", + AdaptiveBandAlgorithm.DEFAULT_MIN_BAND_MARGIN); + float increment = createFloat(commandLine, "increment", + AdaptiveBandAlgorithm.DEFAULT_BAND_INCREMENT_RATIO); + HmmAlignAlgorithmFactory algorithmFactory; + if (cls.equals("viterbi")) { + algorithmFactory = new ViterbiAlgorithmFactory(); + } else if (cls.equals("fb")) { + algorithmFactory = new ForwardBackwardAlgorithmFactory(); + } else { + throw new UnknownParameterException("class"); + } + algorithm = new AdaptiveBandAlgorithm(algorithmFactory, + calculator, radius, increment, margin, + categoryMap); + } else { + throw new UnknownParameterException("search"); + } + } else if (cls.equals("one-to-one")) { + boolean one = commandLine.hasOption('o'); + algorithm = new OneToOneAlgorithm(one); + } else { + throw new UnknownParameterException("class"); + } + return algorithm; + } + + private Counter createCounter(CommandLine commandLine) { + String ctr = commandLine.getOptionValue('n'); + Counter counter; + if (ctr == null) { + counter = null; + } else if (ctr.equals("word")) { + counter = new SplitCounter(); + } else if (ctr.equals("char")) { + counter = new CharCounter(); + } else { + throw new UnknownParameterException("counter"); + } + return counter; + } + + private Calculator createCalculator(CommandLine commandLine, + List alignmentList) { + String calculatorString = commandLine.getOptionValue('a'); + if (calculatorString == null) { + throw new MissingParameterException("calculator"); + } + List calculatorStringList = + Arrays.asList(calculatorString.split(",")); + return createCalculator(commandLine, alignmentList, calculatorStringList); + } + + private Calculator createCalculator(CommandLine commandLine, + List alignmentList, List calculatorStringList) { + + List calculatorList = new ArrayList(); + Iterator calculatorStringIterator = calculatorStringList.iterator(); + while (calculatorStringIterator.hasNext()) { + String calculatorString = calculatorStringIterator.next(); + Calculator calculator; + if (calculatorString.equals("normal")) { + calculator = createNormalCalculator(commandLine); + } else if(calculatorString.equals("poisson")) { + calculator = createPoissonCalculator(commandLine, alignmentList); + } else if(calculatorString.equals("translation")) { + calculator = createTranslationCalculator(commandLine); + } else if(calculatorString.equals("oracle")) { + List remainingCalculatorStringList = + new ArrayList(); + while (calculatorStringIterator.hasNext()) { + remainingCalculatorStringList.add(calculatorStringIterator.next()); + } + Calculator remainingCalculator = createCalculator( + commandLine, alignmentList, remainingCalculatorStringList); + calculator = createOracleCalculator(commandLine, remainingCalculator); + } else { + throw new UnknownParameterException("calculator"); + } + calculatorList.add(calculator); + } + + Calculator calculator; + if (calculatorList.size() == 1) { + calculator = calculatorList.get(0); + } else { + calculator = new CompositeCalculator(calculatorList); + } + return calculator; + } + + + private Calculator createNormalCalculator(CommandLine commandLine) { + Counter counter = createCounter(commandLine); + if (counter == null) { + throw new MissingParameterException("counter"); + } + Calculator calculator = new NormalDistributionCalculator(counter); + return calculator; + } + + private Calculator createPoissonCalculator(CommandLine commandLine, + List alignmentList) { + Counter counter = createCounter(commandLine); + if (counter == null) { + throw new MissingParameterException("counter"); + } + String lengthCorpus = commandLine.getOptionValue('l'); + List lengthAlignmentList; + if (lengthCorpus != null) { + lengthAlignmentList = loadAlignmentList(lengthCorpus); + } else { + lengthAlignmentList = alignmentList; + } + Calculator calculator = new PoissonDistributionCalculator(counter, + lengthAlignmentList); + return calculator; + } + + private Calculator createTranslationCalculator(CommandLine commandLine) { + Calculator calculator; + int iterations = createInt(commandLine, "iterations", + TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT); + String translationCorpus = commandLine.getOptionValue('t'); + String languageModels = commandLine.getOptionValue("x"); + String transModel = commandLine.getOptionValue("y"); + + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + + if (translationCorpus != null) { + List translationAlignmentList = loadAlignmentList(translationCorpus); + VocabularyUtil.tokenize(VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM, + translationAlignmentList, sourceVocabulary, + targetVocabulary, sourceWidList, targetWidList); + } + + LanguageModel sourceLanguageModel = null; + LanguageModel targetLanguageModel = null; + if (languageModels != null) { + String[] languageModelArray = languageModels.split(","); + if (languageModelArray.length != 2) { + throw new ParameterFormatException("language-models"); + } + sourceLanguageModel = loadLanguageModel(languageModelArray[0]); + targetLanguageModel = loadLanguageModel(languageModelArray[1]); + } else { + sourceLanguageModel = + LanguageModelUtil.train(sourceWidList); + targetLanguageModel = + LanguageModelUtil.train(targetWidList); + } + + TranslationModel translationModel = null; + if (transModel != null) { + translationModel = loadTranslationModel( + transModel, sourceVocabulary, targetVocabulary); + } else { + translationModel = TranslationModelUtil.train( + iterations, sourceWidList, targetWidList); + } + + calculator = new TranslationCalculator(sourceVocabulary, + targetVocabulary, sourceLanguageModel, targetLanguageModel, + translationModel, VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM); + + return calculator; + } + + private Calculator createOracleCalculator(CommandLine commandLine, + Calculator calculator) { + Calculator resultCalculator; + String oracleCorpus = commandLine.getOptionValue("oracle-corpus"); + if (oracleCorpus == null) { + throw new MissingParameterException("oracle-corpus"); + } + List oracleAlignmentList = loadAlignmentList(oracleCorpus); + resultCalculator = new MinimumCalculator(new OracleCalculator(oracleAlignmentList), + calculator, OracleCalculator.DEFAULT_SUCCESS_SCORE); + return resultCalculator; + + } + + private LanguageModel loadLanguageModel(String fileName) { + Reader reader = getReader(getFileInputStream(fileName)); + return LanguageModelUtil.parse(reader); + } + + private TranslationModel loadTranslationModel(String fileName, + Vocabulary sourceVocabulary, Vocabulary targetVocabulary) { + Reader reader = getReader(getFileInputStream(fileName)); + return TranslationModelUtil.parse(reader, sourceVocabulary, + targetVocabulary); + } + + private List loadAlignmentList(String fileName) { + Reader reader = getReader(getFileInputStream(fileName)); + Parser parser = new AlParser(reader); + return parser.parse(); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/Command.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/Command.java.svn-base new file mode 100755 index 0000000..2f6bbf1 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/Command.java.svn-base @@ -0,0 +1,10 @@ +package net.sourceforge.align.ui.console.command; + + +public interface Command { + + public String getName(); + + public void run(String[] args); + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/CommandFactory.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/CommandFactory.java.svn-base new file mode 100755 index 0000000..fee69a4 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/CommandFactory.java.svn-base @@ -0,0 +1,61 @@ +package net.sourceforge.align.ui.console.command; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + + +public class CommandFactory { + + private static volatile CommandFactory instance; + + private Map commandMap; + + + public static CommandFactory getInstance() + { + if (instance == null) + { + synchronized (CommandFactory.class) + { + if (instance == null) + { + instance = new CommandFactory(); + } + } + } + return instance; + } + + private CommandFactory() + { + initCommandMap(); + } + + private void initCommandMap() + { + commandMap = new HashMap(); + addCommand(new AlignCommand()); + addCommand(new CompareCommand()); + addCommand(new FormatCommand()); + addCommand(new ModelCommand()); + addCommand(new ModifyCommand()); + addCommand(new ParseCommand()); + addCommand(new SelectCommand()); + addCommand(new MacroCommand()); + addCommand(new TestCommand()); + } + + private void addCommand(Command command) { + commandMap.put(command.getName(), command); + } + + public Command getCommand(String name) { + return commandMap.get(name); + } + + public Set getCommandNameSet() { + return commandMap.keySet(); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/CompareCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/CompareCommand.java.svn-base new file mode 100644 index 0000000..ffbdc63 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/CompareCommand.java.svn-base @@ -0,0 +1,97 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.comparator.Comparator.compare; +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; +import static net.sourceforge.align.util.Util.round; + +import java.io.Reader; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.comparator.Diff; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.formatter.PresentationFormatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.WrongArgumentCountException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class CompareCommand extends AbstractCommand { + + private static char INTERSECTION_SYMBOL = '\u2229'; + + protected void initOptions(Options options) { + options.addOption("d", "diff", false, "Print differences."); + options.addOption("w", "width", true, "Differences output width (optional, default " + PresentationFormatter.DEFAULT_WIDTH + ")."); + } + + public void run(CommandLine commandLine) { + if (commandLine.getArgs().length != 2) { + throw new WrongArgumentCountException("2", commandLine.getArgs().length); + } + + String leftFileName = commandLine.getArgs()[0]; + String rightFileName = commandLine.getArgs()[1]; + Reader leftReader = getReader(getFileInputStream(leftFileName)); + Reader rightReader = getReader(getFileInputStream(rightFileName)); + Parser leftParser = new AlParser(leftReader); + Parser rightParser = new AlParser(rightReader); + + int width = createInt(commandLine, "width", PresentationFormatter.DEFAULT_WIDTH); + + Formatter formatter = new PresentationFormatter(getErr(), width); + + boolean showDiff = commandLine.hasOption('d'); + + List leftAlignmentList = leftParser.parse(); + List rightAlignmentList = rightParser.parse(); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + if (showDiff) { + + Iterator> leftIterator = diff.getLeftGroupList().iterator(); + Iterator> rightIterator = diff.getRightGroupList().iterator(); + + while (leftIterator.hasNext()) { + + List leftGroup = leftIterator.next(); + List rightGroup = rightIterator.next(); + + getErr().println("< left alignments"); + getErr().println(); + formatter.format(leftGroup); + getErr().println(); + getErr().println(); + + getErr().println("> right alignments"); + getErr().println(); + formatter.format(rightGroup); + getErr().println(); + getErr().println(); + + getErr().println(); + + } + + } + + int commonAlignmentCount = diff.getCommonList().size(); + double precision = round((double)commonAlignmentCount / + (double)rightAlignmentList.size(), 2); + double recall = round((double)commonAlignmentCount / + (double)leftAlignmentList.size(), 2); + getErr().println( + "Precision |A " + INTERSECTION_SYMBOL + " B| / |B| = " + + precision); + getErr().println( + "Recall |A " + INTERSECTION_SYMBOL + " B| / |A| = " + + recall); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/FormatCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/FormatCommand.java.svn-base new file mode 100644 index 0000000..2944020 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/FormatCommand.java.svn-base @@ -0,0 +1,95 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getFileOutputStream; +import static net.sourceforge.align.util.Util.getWriter; + +import java.io.Writer; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.formatter.HtmlFormatter; +import net.sourceforge.align.formatter.InfoFormatter; +import net.sourceforge.align.formatter.PlaintextFormatter; +import net.sourceforge.align.formatter.PresentationFormatter; +import net.sourceforge.align.formatter.TmxFormatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; +import net.sourceforge.align.ui.console.command.exception.WrongArgumentCountException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class FormatCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Formatter class. Valid values are: al, txt, tmx, presentation, html, info."); + options.addOption("l", "languages", true, "Source and target language separated by comma (required for tmx formatter)."); + options.addOption("w", "width", true, "Output width (optional for presentation formatter, default " + PresentationFormatter.DEFAULT_WIDTH + ")."); + } + + public void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + Formatter formatter; + if (cls.equals("al")) { + Writer writer = getSingleWriter(commandLine); + formatter = new AlFormatter(writer); + } else if (cls.equals("txt")) { + if (commandLine.getArgs().length != 2) { + throw new WrongArgumentCountException("2", commandLine.getArgs().length); + } + String sourceFileName = commandLine.getArgs()[0]; + String targetFileName = commandLine.getArgs()[1]; + Writer sourceWriter = getWriter(getFileOutputStream(sourceFileName)); + Writer targetWriter = getWriter(getFileOutputStream(targetFileName)); + formatter = new PlaintextFormatter(sourceWriter, targetWriter); + } else if (cls.equals("tmx")) { + Writer writer = getSingleWriter(commandLine); + String languages = commandLine.getOptionValue('l'); + if (languages == null) { + throw new MissingParameterException("languages"); + } + String[] languageArray = languages.split(","); + if (languageArray.length != 2) { + throw new ParameterFormatException("languages"); + } + formatter = new TmxFormatter(writer, languageArray[0], languageArray[1]); + } else if (cls.equals("presentation")) { + Writer writer = getSingleWriter(commandLine); + int width = createInt(commandLine, "width", PresentationFormatter.DEFAULT_WIDTH); + formatter = new PresentationFormatter(writer, width); + } else if (cls.equals("html")) { + Writer writer = getSingleWriter(commandLine); + formatter = new HtmlFormatter(writer); + } else if (cls.equals("info")) { + Writer writer = getSingleWriter(commandLine); + formatter = new InfoFormatter(writer); + } else { + throw new UnknownParameterException("class"); + } + Parser parser = new AlParser(getIn()); + List alignmentList = parser.parse(); + formatter.format(alignmentList); + } + + private Writer getSingleWriter(CommandLine commandLine) { + Writer writer; + if (commandLine.getArgs().length == 0) { + writer = getOut(); + } else if (commandLine.getArgs().length == 1) { + String fileName = commandLine.getArgs()[0]; + writer = getWriter(getFileOutputStream(fileName)); + } else { + throw new WrongArgumentCountException("0, 1", commandLine.getArgs().length); + } + return writer; + } +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/MacroCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/MacroCommand.java.svn-base new file mode 100644 index 0000000..2c02426 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/MacroCommand.java.svn-base @@ -0,0 +1,59 @@ +package net.sourceforge.align.ui.console.command; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.macro.GaleAndChurchMacro; +import net.sourceforge.align.filter.macro.MooreMacro; +import net.sourceforge.align.filter.macro.PoissonMacro; +import net.sourceforge.align.filter.macro.PoissonTranslationMacro; +import net.sourceforge.align.filter.macro.TranslationMacro; +import net.sourceforge.align.filter.meta.FilterDecorators; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + +public class MacroCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Macro class. Valid values are: galechurch, moore, poisson, translation, poisson-translation."); + } + + protected void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + + Filter filter; + if (cls.equals("galechurch")) { + filter = new GaleAndChurchMacro(); + } else if (cls.equals("moore")) { + filter = new MooreMacro(); + } else if (cls.equals("poisson")) { + filter = new PoissonMacro(); + } else if (cls.equals("translation")) { + filter = new TranslationMacro(); + } else if (cls.equals("poisson-translation")) { + filter = new PoissonTranslationMacro(); + } else { + throw new UnknownParameterException("class"); + } + + filter = FilterDecorators.decorate(filter); + + Parser parser = new AlParser(getIn()); + Formatter formatter = new AlFormatter(getOut()); + List alignmentList = parser.parse(); + alignmentList = filter.apply(alignmentList); + formatter.format(alignmentList); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/ModelCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/ModelCommand.java.svn-base new file mode 100644 index 0000000..5ad467a --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/ModelCommand.java.svn-base @@ -0,0 +1,79 @@ +package net.sourceforge.align.ui.console.command; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.model.translation.TranslationModelUtil; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class ModelCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Modeller class. Valid values are: length, language-translation."); + options.addOption("i", "iterations", true, "Translation model train iteration count. Optional for language-translation modeller, default " + TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT + "."); + } + + public void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } else if (cls.equals("language-translation")) { + + //int iterations = createInt(commandLine, "iterations", + // TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT); + + //Prosty algorytm tokenizujący dlatego że wejście powinno być już + //stokenizowane - tokeny rozdzielone spacją. + //TODO: Czy dobrze? nie może być tokenów ze spacją w środku. + SplitAlgorithm splitAlgorithm = + VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + + Parser parser = new AlParser(getIn()); + List alignmentList = parser.parse(); + + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + for (Alignment alignment : alignmentList) { + sourceWidList.add(tokenizePutGet( + alignment.getSourceSegmentList(), + sourceVocabulary, splitAlgorithm)); + targetWidList.add(tokenizePutGet( + alignment.getTargetSegmentList(), + targetVocabulary, splitAlgorithm)); + } + + //LanguageModel sourceLanguageModel = + // LanguageModelUtil.train(sourceWidList); + //LanguageModel targetLanguageModel = + // LanguageModelUtil.train(targetWidList); + //TranslationModel translationModel = + // TranslationModelUtil.train(iterations, sourceWidList, targetWidList); + + } else { + throw new UnknownParameterException("class"); + } + + } + + private List tokenizePutGet(List segmentList, + Vocabulary vocabulary, SplitAlgorithm splitAlgorithm) { + List wordList = splitAlgorithm.modify(segmentList); + vocabulary.putWordList(wordList); + List widList = vocabulary.getWidList(wordList); + return widList; + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/ModifyCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/ModifyCommand.java.svn-base new file mode 100644 index 0000000..4289348 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/ModifyCommand.java.svn-base @@ -0,0 +1,177 @@ +package net.sourceforge.align.ui.console.command; + + +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_MAX_WORD_COUNT; +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_MIN_OCCURRENCE_COUNT; +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.meta.FilterDecorators; +import net.sourceforge.align.filter.modifier.Modifier; +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; +import net.sourceforge.align.filter.modifier.modify.NullModifyAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.FilterNonWordsCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.LowercaseCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.TrimCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.UnifyRareWordsCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.merge.SeparatorMergeAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.ParagraphSplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SentenceSplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SrxSplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.WordSplitAlgorithm; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; +import net.sourceforge.align.util.Pair; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class ModifyCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Modifier class. Valid values are: merge, split-word, split-sentence, split-paragraph, split-srx, trim, lowercase, filter-non-words, unify-rare-words."); + options.addOption("p", "part", true, "Affected segment part. Valid values are: both(default), source, target."); + options.addOption("f", "file", true, "File containing modification information. Required by split-srx modifier."); + options.addOption("l", "languages", true, "Source and target language separated by comma. Required for split-srx modifier."); + options.addOption("s", "separator", true, "Merge separator string. Optional for merge modifier, default \"\"."); + options.addOption("w", "max-word-count", true, "Maximum number of words preserved. Optional for unify-rare-words modifier, default " + DEFAULT_MAX_WORD_COUNT + "."); + options.addOption("o", "min-occurrence-count", true, "Minimum number of occurences to preserve a word. Optional for unify-rare-words modifier, default " + DEFAULT_MIN_OCCURRENCE_COUNT + "."); + options.addOption("h", "help", false, "Display this help message."); + } + + protected void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + ModifyAlgorithm sourceAlgorithm; + ModifyAlgorithm targetAlgorithm = null; + Parser parser = new AlParser(getIn()); + List alignmentList = null; + if (cls.equals("split-word")) { + sourceAlgorithm = new WordSplitAlgorithm(); + } else if (cls.equals("split-sentence")) { + sourceAlgorithm = new SentenceSplitAlgorithm(); + } else if (cls.equals("split-paragraph")) { + sourceAlgorithm = new ParagraphSplitAlgorithm(); + } else if (cls.equals("split-srx")) { + String fileName = commandLine.getOptionValue('f'); + if (fileName == null) { + throw new MissingParameterException("file"); + } + String languages = commandLine.getOptionValue('l'); + if (languages == null) { + throw new MissingParameterException("languages"); + } + String[] languageArray = languages.split(","); + if (languageArray.length != 2) { + throw new ParameterFormatException("languages"); + } + Reader reader = getReader(getFileInputStream(fileName)); + sourceAlgorithm = new SrxSplitAlgorithm(reader, languageArray[0]); + reader = getReader(getFileInputStream(fileName)); + targetAlgorithm = new SrxSplitAlgorithm(reader, languageArray[1]); + } else if (cls.equals("merge")) { + String separator = commandLine.getOptionValue('s'); + if (separator == null) { + sourceAlgorithm = new SeparatorMergeAlgorithm(); + } else { + separator = separator.replaceAll("\\\\t", "\t"); + separator = separator.replaceAll("\\\\n", "\n"); + sourceAlgorithm = new SeparatorMergeAlgorithm(separator); + } + } else if (cls.equals("trim")) { + sourceAlgorithm = new TrimCleanAlgorithm(); + } else if (cls.equals("lowercase")) { + sourceAlgorithm = new LowercaseCleanAlgorithm(); + } else if (cls.equals("filter-non-words")) { + sourceAlgorithm = new FilterNonWordsCleanAlgorithm(); + } else if (cls.equals("unify-rare-words")) { + alignmentList = parser.parse(); + Pair algorithmPair = + createUnifyRareWordsAlgorithms(commandLine, alignmentList); + sourceAlgorithm = algorithmPair.first; + targetAlgorithm = algorithmPair.second; + } else { + throw new UnknownParameterException("class"); + } + String part = commandLine.getOptionValue('p'); + if (part == null) { + part = "both"; + } + if (part.equals("both")) { + if (targetAlgorithm == null) { + targetAlgorithm = sourceAlgorithm; + } + } else if (part.equals("source")) { + targetAlgorithm = new NullModifyAlgorithm(); + } else if (part.equals("target")) { + sourceAlgorithm = new NullModifyAlgorithm(); + } else { + throw new UnknownParameterException("part"); + } + + Formatter formatter = new AlFormatter(getOut()); + + Filter filter = new Modifier(sourceAlgorithm, targetAlgorithm); + filter = FilterDecorators.decorate(filter); + + if (alignmentList == null) { + alignmentList = parser.parse(); + } + + alignmentList = filter.apply(alignmentList); + formatter.format(alignmentList); + } + + private Pair createUnifyRareWordsAlgorithms( + CommandLine commandLine, List alignmentList) { + + SplitAlgorithm splitAlgorithm = DEFAULT_TOKENIZE_ALGORITHM; + int maxWordCount = createInt(commandLine, "max-word-count", + DEFAULT_MAX_WORD_COUNT); + int minOccurenceCount = createInt(commandLine, "min-occurrence-count", + DEFAULT_MIN_OCCURRENCE_COUNT); + + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + + VocabularyUtil.tokenize(splitAlgorithm, alignmentList, + sourceVocabulary, targetVocabulary, + sourceWidList, targetWidList); + + sourceVocabulary = VocabularyUtil.createTruncatedVocabulary( + sourceWidList, sourceVocabulary, + maxWordCount, minOccurenceCount); + targetVocabulary = VocabularyUtil.createTruncatedVocabulary( + targetWidList, targetVocabulary, + maxWordCount, minOccurenceCount); + + ModifyAlgorithm sourceAlgorithm = + new UnifyRareWordsCleanAlgorithm(sourceVocabulary); + ModifyAlgorithm targetAlgorithm = + new UnifyRareWordsCleanAlgorithm(targetVocabulary); + + return new Pair( + sourceAlgorithm, targetAlgorithm); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/ParseCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/ParseCommand.java.svn-base new file mode 100644 index 0000000..79fa568 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/ParseCommand.java.svn-base @@ -0,0 +1,105 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; + +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.parser.PlaintextParser; +import net.sourceforge.align.parser.TmxParser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; +import net.sourceforge.align.ui.console.command.exception.WrongArgumentCountException; +import net.sourceforge.align.util.IORuntimeException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class ParseCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Parser class. Valid values are: al, txt, tmx."); + options.addOption("l", "languages", true, "Source and target language separated by comma (optional for tmx parser)."); + } + + public void run(CommandLine commandLine) { + try { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + List alignmentList = new ArrayList(); + if (cls.equals("al")) { + if (commandLine.getArgs().length < 1) { + throw new WrongArgumentCountException("1, 2, 3, ...", commandLine.getArgs().length); + } + for (String fileName : commandLine.getArgs()) { + Reader reader = getReader(getFileInputStream(fileName)); + Parser parser = new AlParser(reader); + List currentAlignmentList = parser.parse(); + alignmentList.addAll(currentAlignmentList); + reader.close(); + } + } else if (cls.equals("txt")) { + if ((commandLine.getArgs().length % 2) != 0) { + throw new WrongArgumentCountException("2, 4, 6, ...", commandLine.getArgs().length); + } + for (int i = 0; i < commandLine.getArgs().length; i += 2) { + String sourceFileName = commandLine.getArgs()[i]; + String targetFileName = commandLine.getArgs()[i + 1]; + Reader sourceReader = getReader(getFileInputStream(sourceFileName)); + Reader targetReader = getReader(getFileInputStream(targetFileName)); + Parser parser = new PlaintextParser(sourceReader, targetReader); + List currentAlignmentList = parser.parse(); + alignmentList.addAll(currentAlignmentList); + sourceReader.close(); + targetReader.close(); + } + } else if (cls.equals("tmx")) { + if (commandLine.getArgs().length < 1) { + throw new WrongArgumentCountException("1, 2, 3, ...", commandLine.getArgs().length); + } + String languages = commandLine.getOptionValue('l'); + String[] languageArray; + if (languages == null) { + languageArray = new String[0]; + } else { + languageArray = languages.split(","); + if (languageArray.length != 2) { + throw new ParameterFormatException("languages"); + } + } + for (String fileName : commandLine.getArgs()) { + Reader reader = getReader(getFileInputStream(fileName)); + Parser parser; + if (languageArray.length == 0) { + parser = new TmxParser(reader); + } else { + parser = new TmxParser(reader, languageArray[0], + languageArray[1]); + } + List currentAlignmentList = parser.parse(); + alignmentList.addAll(currentAlignmentList); + reader.close(); + } + + } else { + throw new UnknownParameterException("class"); + } + Formatter formatter = new AlFormatter(getOut()); + formatter.format(alignmentList); + } catch (IOException e) { + throw new IORuntimeException(e); + } + } +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/SelectCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/SelectCommand.java.svn-base new file mode 100644 index 0000000..273e739 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/SelectCommand.java.svn-base @@ -0,0 +1,85 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; + +import java.io.Reader; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.meta.FilterDecorators; +import net.sourceforge.align.filter.selector.DifferenceSelector; +import net.sourceforge.align.filter.selector.FractionSelector; +import net.sourceforge.align.filter.selector.IntersectionSelector; +import net.sourceforge.align.filter.selector.OneToOneSelector; +import net.sourceforge.align.filter.selector.ProbabilitySelector; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class SelectCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Selector class. Valid values are: one-to-one, fraction, probability, intersection, difference"); + options.addOption("f", "fraction", true, "Fraction <0, 1> to leave in alignment. Required by fraction selector."); + options.addOption("p", "probability", true, "Probability threshold, <0, 1>, to leave mapping in alignment. Required by preobability selector."); + options.addOption("a", "alignment", true, "Other alignment. Required by intersection and difference selectors."); + options.addOption("h", "help", false, "Display this help message."); + } + + protected void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + Filter filter; + + if (cls.equals("one-to-one")) { + filter = new OneToOneSelector(); + } else if (cls.equals("fraction")) { + float fraction = createFloat(commandLine, "fraction"); + filter = new FractionSelector(fraction); + } else if (cls.equals("probability")) { + float probability = createFloat(commandLine, "probability"); + filter = new ProbabilitySelector(probability); + } else if (cls.equals("intersection") || cls.equals("difference")) { + String alignmentString = commandLine.getOptionValue("alignment"); + if (alignmentString == null) { + throw new MissingParameterException("alignment"); + } + List alignment = loadAlignmentList(alignmentString); + if (cls.equals("intersection")) { + filter = new IntersectionSelector(alignment); + } else if (cls.equals("difference")) { + filter = new DifferenceSelector(alignment); + } else { + throw new UnknownParameterException("class"); + } + } else { + throw new UnknownParameterException("class"); + } + + filter = FilterDecorators.decorate(filter); + + Parser parser = new AlParser(getIn()); + Formatter formatter = new AlFormatter(getOut()); + List alignmentList = parser.parse(); + alignmentList = filter.apply(alignmentList); + formatter.format(alignmentList); + } + + private List loadAlignmentList(String fileName) { + Reader reader = getReader(getFileInputStream(fileName)); + Parser parser = new AlParser(reader); + return parser.parse(); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/.svn/text-base/TestCommand.java.svn-base b/src/net/sourceforge/align/ui/console/command/.svn/text-base/TestCommand.java.svn-base new file mode 100644 index 0000000..0580d7b --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/.svn/text-base/TestCommand.java.svn-base @@ -0,0 +1,33 @@ +package net.sourceforge.align.ui.console.command; + + +import net.sourceforge.align.AlignTestSuite; + +import org.junit.internal.runners.TextListener; +import org.junit.runner.JUnitCore; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + + +/** + * Test suite containing all tests executed using console. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlignTestSuite.class +}) +public class TestCommand implements Command { + + public String getName() { + return "test"; + } + + public void run(String[] args) { + JUnitCore core = new JUnitCore(); + core.addListener(new TextListener()); + core.run(TestCommand.class); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/AbstractCommand.java b/src/net/sourceforge/align/ui/console/command/AbstractCommand.java new file mode 100755 index 0000000..9e7e445 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/AbstractCommand.java @@ -0,0 +1,202 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getReader; +import static net.sourceforge.align.util.Util.getWriter; + +import java.io.BufferedReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + +import net.sourceforge.align.progress.ProgressManager; +import net.sourceforge.align.progress.WriterProgressObserver; +import net.sourceforge.align.ui.console.Maligna; +import net.sourceforge.align.ui.console.command.exception.CommandException; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.ParametersParseException; + +import org.apache.commons.cli.BasicParser; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.Parser; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + + +public abstract class AbstractCommand implements Command { + + Log log = LogFactory.getLog(AbstractCommand.class); + + private BufferedReader in; + private PrintWriter out; + private PrintWriter err; + private HelpFormatter helpFormatter; + private Options options; + + public AbstractCommand() { + this.in = getReader(System.in); + this.err = new PrintWriter(System.err, true); + this.out = getWriter(System.out); + this.helpFormatter = new HelpFormatter(); + this.options = new Options(); + initBasicOptions(options); + initOptions(options); + } + + public String getName() { + String className = this.getClass().getSimpleName(); + int nameLength = className.length() - Command.class.getSimpleName().length(); + String name = className.substring(0, nameLength).toLowerCase(); + return name; + } + + public void run(String[] args) { + try { + Parser optionParser = new BasicParser(); + CommandLine commandLine; + try { + commandLine = optionParser.parse(options, args); + } catch (ParseException e) { + throw new ParametersParseException(e); + } + if (commandLine.hasOption('h')) { + printHelp(); + } else { + String verbosity = commandLine.getOptionValue('v'); + setVerbosity(verbosity); + setProgress(verbosity); + run(commandLine); + } + } catch (CommandException e) { + log.debug("Command exception.", e); + err.println(e.getMessage()); + printUsage(); + } catch (Exception e) { + log.error("Unknown exception", e); + } + } + + protected Options getOptions() { + return options; + } + + protected BufferedReader getIn() { + return in; + } + + protected PrintWriter getOut() { + return out; + } + + protected PrintWriter getErr() { + return err; + } + + protected void printUsage() { + helpFormatter.printUsage(out, 80, Maligna.MAIN_COMMAND_NAME + " " + getName() + " -h"); + } + + protected void printHelp() { + Maligna.printSignature(); + helpFormatter.printHelp(Maligna.MAIN_COMMAND_NAME + " " + getName(), options, true); + } + + private void initBasicOptions(Options options) { + options.addOption("h", "help", false, "Display help message."); + options.addOption("v", "verbosity", true, "Set verbosity level. Correct values are: trace, debug, info[default], warn, error, fatal, quiet[no progress meter]"); + } + + private void setVerbosity(String verbosity) { + Level level = Level.INFO; + if ("trace".equals(verbosity)) { + level = Level.FINEST; + } else if ("debug".equals(verbosity)) { + level = Level.FINE; + } else if ("info".equals(verbosity)) { + level = Level.INFO; + } else if ("warn".equals(verbosity)) { + level = Level.WARNING; + } else if ("error".equals(verbosity)) { + level = Level.SEVERE; + } else if ("fatal".equals(verbosity)) { + level = Level.SEVERE; + } else if ("quiet".equals(verbosity)) { + level = Level.OFF; + } else if (verbosity != null) { + throw new ParameterFormatException("verbosity"); + } + Logger logger = Logger.getLogger(""); + logger.setLevel(level); + for (Handler handler : logger.getHandlers()) { + handler.setLevel(Level.ALL); + } + log.debug("Setting verbosity level to " + verbosity + "."); + } + + private void setProgress(String verbosity) { + if (!"quiet".equals(verbosity)) { + log.debug("Enabling progress meter."); + WriterProgressObserver progressObserver = new WriterProgressObserver(new OutputStreamWriter(System.err), 40); + ProgressManager.getInstance().registerProgressObserver(progressObserver); + } + } + + protected abstract void initOptions(Options options); + + protected abstract void run(CommandLine commandLine); + + protected int createInt(CommandLine commandLine, String command) { + return createInt(commandLine, command, null); + } + + protected int createInt(CommandLine commandLine, String command, + Integer defaultValue) { + String string = commandLine.getOptionValue(command); + int value; + if (string == null) { + if (defaultValue != null) { + value = defaultValue; + } else { + throw new MissingParameterException(command); + } + } else { + try { + value = Integer.parseInt(string); + } catch (NumberFormatException e) { + throw new ParameterFormatException(command); + } + } + return value; + } + + protected float createFloat(CommandLine commandLine, String command) { + return createFloat(commandLine, command, null); + } + + protected float createFloat(CommandLine commandLine, String command, + Float defaultValue) { + String string = commandLine.getOptionValue(command); + float value; + if (string == null) { + if (defaultValue != null) { + value = defaultValue; + } else { + throw new MissingParameterException(command); + } + } else { + try { + value = Float.parseFloat(string); + } catch (NumberFormatException e) { + throw new ParameterFormatException(command); + } + } + return value; + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/AlignCommand.java b/src/net/sourceforge/align/ui/console/command/AlignCommand.java new file mode 100755 index 0000000..22ade1d --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/AlignCommand.java @@ -0,0 +1,352 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.calculator.Calculator; +import net.sourceforge.align.calculator.content.OracleCalculator; +import net.sourceforge.align.calculator.content.TranslationCalculator; +import net.sourceforge.align.calculator.length.NormalDistributionCalculator; +import net.sourceforge.align.calculator.length.PoissonDistributionCalculator; +import net.sourceforge.align.calculator.length.counter.CharCounter; +import net.sourceforge.align.calculator.length.counter.Counter; +import net.sourceforge.align.calculator.length.counter.SplitCounter; +import net.sourceforge.align.calculator.meta.CompositeCalculator; +import net.sourceforge.align.calculator.meta.MinimumCalculator; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.coretypes.Category; +import net.sourceforge.align.coretypes.CategoryDefaults; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.aligner.Aligner; +import net.sourceforge.align.filter.aligner.UnifyAligner; +import net.sourceforge.align.filter.aligner.align.AlignAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.HmmAlignAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.adaptive.AdaptiveBandAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.fb.ForwardBackwardAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithm; +import net.sourceforge.align.filter.aligner.align.hmm.viterbi.ViterbiAlgorithmFactory; +import net.sourceforge.align.filter.aligner.align.onetoone.OneToOneAlgorithm; +import net.sourceforge.align.filter.meta.FilterDecorators; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.matrix.BandMatrixFactory; +import net.sourceforge.align.matrix.FullMatrixFactory; +import net.sourceforge.align.matrix.MatrixFactory; +import net.sourceforge.align.model.language.LanguageModel; +import net.sourceforge.align.model.language.LanguageModelUtil; +import net.sourceforge.align.model.translation.TranslationModel; +import net.sourceforge.align.model.translation.TranslationModelUtil; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + + +public class AlignCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Algorithm class. Valid values are: viterbi, fb, one-to-one, unify."); + options.addOption("o", "one", false, "Strict one to one alignment."); + options.addOption("s", "search", true, "Search method. Valid values are: exhaustive, band, iterative-band. Required by viterbi and fb algorithms."); + options.addOption("r", "radius", true, "Band radius in segments. Optional for band, iterband search method, default " + BandMatrixFactory.DEFAULT_BAND_RADIUS + "."); + options.addOption("e", "increment", true, "Band increment ratio in each pass. Optional for iterband search method, default " + AdaptiveBandAlgorithm.DEFAULT_BAND_INCREMENT_RATIO + "."); + options.addOption("m", "margin", true, "Band minimum acceptable margin. Optional for iterband search method, default " + AdaptiveBandAlgorithm.DEFAULT_MIN_BAND_MARGIN + "."); + options.addOption("a", "calculator", true, "Calculator classes separated by commas. Valid values are: normal, poisson, translation, oracle. Required by viterbi and fb algorithms."); + options.addOption("n", "counter", true, "Length counter, Valid values are: char, word. Required by normal and poisson calculators."); + options.addOption("l", "length-corpus", true, "Length model training corpus. Optional for poisson calculator."); + options.addOption("t", "translation-corpus", true, "Translation model training corpus. Optional for translation calculator."); + options.addOption("d", "oracle-corpus", true, "Oracle calculator corpus. Required by oracle calculator."); + options.addOption("x", "language-models", true, "Source and target language model separated by comma. Optional for translation calculator."); + options.addOption("y", "translation-model", true, "Translation model. Optional for translation calculator."); + options.addOption("i", "iterations", true, "Translation model train iteration count. Optional for translation calculator, default " + TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT + "."); + options.addOption("u", "unification-corpus", true, "Unification reference corpus. Required by unify algorithm."); + } + + protected void run(CommandLine commandLine) { + if (commandLine.getOptions().length == 0) { + throw new MissingParameterException("class"); + } + Filter filter; + Parser parser = new AlParser(getIn()); + List alignmentList = null; + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + if (cls.equals("unify")) { + String unificationCorpus = commandLine.getOptionValue('u'); + if (unificationCorpus == null) { + throw new MissingParameterException("unification-corpus"); + } + List unificationAlignmentList = + loadAlignmentList(unificationCorpus); + filter = new UnifyAligner(unificationAlignmentList); + } else { + alignmentList = parser.parse(); + AlignAlgorithm algorithm = createAlgorithm(commandLine, alignmentList); + filter = new Aligner(algorithm); + } + filter = FilterDecorators.decorate(filter); + Formatter formatter = new AlFormatter(getOut()); + if (alignmentList == null) { + alignmentList = parser.parse(); + } + alignmentList = filter.apply(alignmentList); + formatter.format(alignmentList); + } + + private AlignAlgorithm createAlgorithm(CommandLine commandLine, + List alignmentList) { + String cls = commandLine.getOptionValue('c'); + AlignAlgorithm algorithm; + if (cls.equals("fb") || cls.equals("viterbi")) { + Calculator calculator = createCalculator(commandLine, + alignmentList); + Map categoryMap = + CategoryDefaults.BEST_CATEGORY_MAP; + String search = commandLine.getOptionValue('s'); + if (search == null) { + throw new MissingParameterException("search"); + } + if (search.equals("exhaustive") || search.equals("band")) { + MatrixFactory matrixFactory; + if (search.equals("exhaustive")) { + matrixFactory = new FullMatrixFactory(); + } else if (search.equals("band")) { + int radius = createInt(commandLine, "radius", + BandMatrixFactory.DEFAULT_BAND_RADIUS); + matrixFactory = new BandMatrixFactory(radius); + } else { + throw new UnknownParameterException("search"); + } + if (cls.equals("viterbi")) { + algorithm = new ViterbiAlgorithm(calculator, + categoryMap, matrixFactory); + } else if (cls.equals("fb")) { + algorithm = new ForwardBackwardAlgorithm(calculator, + categoryMap, matrixFactory); + } else { + throw new UnknownParameterException("class"); + } + } else if (search.equals("iterative-band")) { + int radius = createInt(commandLine, "radius", + BandMatrixFactory.DEFAULT_BAND_RADIUS); + int margin = createInt(commandLine, "margin", + AdaptiveBandAlgorithm.DEFAULT_MIN_BAND_MARGIN); + float increment = createFloat(commandLine, "increment", + AdaptiveBandAlgorithm.DEFAULT_BAND_INCREMENT_RATIO); + HmmAlignAlgorithmFactory algorithmFactory; + if (cls.equals("viterbi")) { + algorithmFactory = new ViterbiAlgorithmFactory(); + } else if (cls.equals("fb")) { + algorithmFactory = new ForwardBackwardAlgorithmFactory(); + } else { + throw new UnknownParameterException("class"); + } + algorithm = new AdaptiveBandAlgorithm(algorithmFactory, + calculator, radius, increment, margin, + categoryMap); + } else { + throw new UnknownParameterException("search"); + } + } else if (cls.equals("one-to-one")) { + boolean one = commandLine.hasOption('o'); + algorithm = new OneToOneAlgorithm(one); + } else { + throw new UnknownParameterException("class"); + } + return algorithm; + } + + private Counter createCounter(CommandLine commandLine) { + String ctr = commandLine.getOptionValue('n'); + Counter counter; + if (ctr == null) { + counter = null; + } else if (ctr.equals("word")) { + counter = new SplitCounter(); + } else if (ctr.equals("char")) { + counter = new CharCounter(); + } else { + throw new UnknownParameterException("counter"); + } + return counter; + } + + private Calculator createCalculator(CommandLine commandLine, + List alignmentList) { + String calculatorString = commandLine.getOptionValue('a'); + if (calculatorString == null) { + throw new MissingParameterException("calculator"); + } + List calculatorStringList = + Arrays.asList(calculatorString.split(",")); + return createCalculator(commandLine, alignmentList, calculatorStringList); + } + + private Calculator createCalculator(CommandLine commandLine, + List alignmentList, List calculatorStringList) { + + List calculatorList = new ArrayList(); + Iterator calculatorStringIterator = calculatorStringList.iterator(); + while (calculatorStringIterator.hasNext()) { + String calculatorString = calculatorStringIterator.next(); + Calculator calculator; + if (calculatorString.equals("normal")) { + calculator = createNormalCalculator(commandLine); + } else if(calculatorString.equals("poisson")) { + calculator = createPoissonCalculator(commandLine, alignmentList); + } else if(calculatorString.equals("translation")) { + calculator = createTranslationCalculator(commandLine); + } else if(calculatorString.equals("oracle")) { + List remainingCalculatorStringList = + new ArrayList(); + while (calculatorStringIterator.hasNext()) { + remainingCalculatorStringList.add(calculatorStringIterator.next()); + } + Calculator remainingCalculator = createCalculator( + commandLine, alignmentList, remainingCalculatorStringList); + calculator = createOracleCalculator(commandLine, remainingCalculator); + } else { + throw new UnknownParameterException("calculator"); + } + calculatorList.add(calculator); + } + + Calculator calculator; + if (calculatorList.size() == 1) { + calculator = calculatorList.get(0); + } else { + calculator = new CompositeCalculator(calculatorList); + } + return calculator; + } + + + private Calculator createNormalCalculator(CommandLine commandLine) { + Counter counter = createCounter(commandLine); + if (counter == null) { + throw new MissingParameterException("counter"); + } + Calculator calculator = new NormalDistributionCalculator(counter); + return calculator; + } + + private Calculator createPoissonCalculator(CommandLine commandLine, + List alignmentList) { + Counter counter = createCounter(commandLine); + if (counter == null) { + throw new MissingParameterException("counter"); + } + String lengthCorpus = commandLine.getOptionValue('l'); + List lengthAlignmentList; + if (lengthCorpus != null) { + lengthAlignmentList = loadAlignmentList(lengthCorpus); + } else { + lengthAlignmentList = alignmentList; + } + Calculator calculator = new PoissonDistributionCalculator(counter, + lengthAlignmentList); + return calculator; + } + + private Calculator createTranslationCalculator(CommandLine commandLine) { + Calculator calculator; + int iterations = createInt(commandLine, "iterations", + TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT); + String translationCorpus = commandLine.getOptionValue('t'); + String languageModels = commandLine.getOptionValue("x"); + String transModel = commandLine.getOptionValue("y"); + + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + + if (translationCorpus != null) { + List translationAlignmentList = loadAlignmentList(translationCorpus); + VocabularyUtil.tokenize(VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM, + translationAlignmentList, sourceVocabulary, + targetVocabulary, sourceWidList, targetWidList); + } + + LanguageModel sourceLanguageModel = null; + LanguageModel targetLanguageModel = null; + if (languageModels != null) { + String[] languageModelArray = languageModels.split(","); + if (languageModelArray.length != 2) { + throw new ParameterFormatException("language-models"); + } + sourceLanguageModel = loadLanguageModel(languageModelArray[0]); + targetLanguageModel = loadLanguageModel(languageModelArray[1]); + } else { + sourceLanguageModel = + LanguageModelUtil.train(sourceWidList); + targetLanguageModel = + LanguageModelUtil.train(targetWidList); + } + + TranslationModel translationModel = null; + if (transModel != null) { + translationModel = loadTranslationModel( + transModel, sourceVocabulary, targetVocabulary); + } else { + translationModel = TranslationModelUtil.train( + iterations, sourceWidList, targetWidList); + } + + calculator = new TranslationCalculator(sourceVocabulary, + targetVocabulary, sourceLanguageModel, targetLanguageModel, + translationModel, VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM); + + return calculator; + } + + private Calculator createOracleCalculator(CommandLine commandLine, + Calculator calculator) { + Calculator resultCalculator; + String oracleCorpus = commandLine.getOptionValue("oracle-corpus"); + if (oracleCorpus == null) { + throw new MissingParameterException("oracle-corpus"); + } + List oracleAlignmentList = loadAlignmentList(oracleCorpus); + resultCalculator = new MinimumCalculator(new OracleCalculator(oracleAlignmentList), + calculator, OracleCalculator.DEFAULT_SUCCESS_SCORE); + return resultCalculator; + + } + + private LanguageModel loadLanguageModel(String fileName) { + Reader reader = getReader(getFileInputStream(fileName)); + return LanguageModelUtil.parse(reader); + } + + private TranslationModel loadTranslationModel(String fileName, + Vocabulary sourceVocabulary, Vocabulary targetVocabulary) { + Reader reader = getReader(getFileInputStream(fileName)); + return TranslationModelUtil.parse(reader, sourceVocabulary, + targetVocabulary); + } + + private List loadAlignmentList(String fileName) { + Reader reader = getReader(getFileInputStream(fileName)); + Parser parser = new AlParser(reader); + return parser.parse(); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/Command.java b/src/net/sourceforge/align/ui/console/command/Command.java new file mode 100755 index 0000000..2f6bbf1 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/Command.java @@ -0,0 +1,10 @@ +package net.sourceforge.align.ui.console.command; + + +public interface Command { + + public String getName(); + + public void run(String[] args); + +} diff --git a/src/net/sourceforge/align/ui/console/command/CommandFactory.java b/src/net/sourceforge/align/ui/console/command/CommandFactory.java new file mode 100755 index 0000000..fee69a4 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/CommandFactory.java @@ -0,0 +1,61 @@ +package net.sourceforge.align.ui.console.command; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + + +public class CommandFactory { + + private static volatile CommandFactory instance; + + private Map commandMap; + + + public static CommandFactory getInstance() + { + if (instance == null) + { + synchronized (CommandFactory.class) + { + if (instance == null) + { + instance = new CommandFactory(); + } + } + } + return instance; + } + + private CommandFactory() + { + initCommandMap(); + } + + private void initCommandMap() + { + commandMap = new HashMap(); + addCommand(new AlignCommand()); + addCommand(new CompareCommand()); + addCommand(new FormatCommand()); + addCommand(new ModelCommand()); + addCommand(new ModifyCommand()); + addCommand(new ParseCommand()); + addCommand(new SelectCommand()); + addCommand(new MacroCommand()); + addCommand(new TestCommand()); + } + + private void addCommand(Command command) { + commandMap.put(command.getName(), command); + } + + public Command getCommand(String name) { + return commandMap.get(name); + } + + public Set getCommandNameSet() { + return commandMap.keySet(); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/CompareCommand.java b/src/net/sourceforge/align/ui/console/command/CompareCommand.java new file mode 100755 index 0000000..ffbdc63 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/CompareCommand.java @@ -0,0 +1,97 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.comparator.Comparator.compare; +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; +import static net.sourceforge.align.util.Util.round; + +import java.io.Reader; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.comparator.Diff; +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.formatter.PresentationFormatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.WrongArgumentCountException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class CompareCommand extends AbstractCommand { + + private static char INTERSECTION_SYMBOL = '\u2229'; + + protected void initOptions(Options options) { + options.addOption("d", "diff", false, "Print differences."); + options.addOption("w", "width", true, "Differences output width (optional, default " + PresentationFormatter.DEFAULT_WIDTH + ")."); + } + + public void run(CommandLine commandLine) { + if (commandLine.getArgs().length != 2) { + throw new WrongArgumentCountException("2", commandLine.getArgs().length); + } + + String leftFileName = commandLine.getArgs()[0]; + String rightFileName = commandLine.getArgs()[1]; + Reader leftReader = getReader(getFileInputStream(leftFileName)); + Reader rightReader = getReader(getFileInputStream(rightFileName)); + Parser leftParser = new AlParser(leftReader); + Parser rightParser = new AlParser(rightReader); + + int width = createInt(commandLine, "width", PresentationFormatter.DEFAULT_WIDTH); + + Formatter formatter = new PresentationFormatter(getErr(), width); + + boolean showDiff = commandLine.hasOption('d'); + + List leftAlignmentList = leftParser.parse(); + List rightAlignmentList = rightParser.parse(); + + Diff diff = compare(leftAlignmentList, rightAlignmentList); + + if (showDiff) { + + Iterator> leftIterator = diff.getLeftGroupList().iterator(); + Iterator> rightIterator = diff.getRightGroupList().iterator(); + + while (leftIterator.hasNext()) { + + List leftGroup = leftIterator.next(); + List rightGroup = rightIterator.next(); + + getErr().println("< left alignments"); + getErr().println(); + formatter.format(leftGroup); + getErr().println(); + getErr().println(); + + getErr().println("> right alignments"); + getErr().println(); + formatter.format(rightGroup); + getErr().println(); + getErr().println(); + + getErr().println(); + + } + + } + + int commonAlignmentCount = diff.getCommonList().size(); + double precision = round((double)commonAlignmentCount / + (double)rightAlignmentList.size(), 2); + double recall = round((double)commonAlignmentCount / + (double)leftAlignmentList.size(), 2); + getErr().println( + "Precision |A " + INTERSECTION_SYMBOL + " B| / |B| = " + + precision); + getErr().println( + "Recall |A " + INTERSECTION_SYMBOL + " B| / |A| = " + + recall); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/FormatCommand.java b/src/net/sourceforge/align/ui/console/command/FormatCommand.java new file mode 100755 index 0000000..2944020 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/FormatCommand.java @@ -0,0 +1,95 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getFileOutputStream; +import static net.sourceforge.align.util.Util.getWriter; + +import java.io.Writer; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.formatter.HtmlFormatter; +import net.sourceforge.align.formatter.InfoFormatter; +import net.sourceforge.align.formatter.PlaintextFormatter; +import net.sourceforge.align.formatter.PresentationFormatter; +import net.sourceforge.align.formatter.TmxFormatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; +import net.sourceforge.align.ui.console.command.exception.WrongArgumentCountException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class FormatCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Formatter class. Valid values are: al, txt, tmx, presentation, html, info."); + options.addOption("l", "languages", true, "Source and target language separated by comma (required for tmx formatter)."); + options.addOption("w", "width", true, "Output width (optional for presentation formatter, default " + PresentationFormatter.DEFAULT_WIDTH + ")."); + } + + public void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + Formatter formatter; + if (cls.equals("al")) { + Writer writer = getSingleWriter(commandLine); + formatter = new AlFormatter(writer); + } else if (cls.equals("txt")) { + if (commandLine.getArgs().length != 2) { + throw new WrongArgumentCountException("2", commandLine.getArgs().length); + } + String sourceFileName = commandLine.getArgs()[0]; + String targetFileName = commandLine.getArgs()[1]; + Writer sourceWriter = getWriter(getFileOutputStream(sourceFileName)); + Writer targetWriter = getWriter(getFileOutputStream(targetFileName)); + formatter = new PlaintextFormatter(sourceWriter, targetWriter); + } else if (cls.equals("tmx")) { + Writer writer = getSingleWriter(commandLine); + String languages = commandLine.getOptionValue('l'); + if (languages == null) { + throw new MissingParameterException("languages"); + } + String[] languageArray = languages.split(","); + if (languageArray.length != 2) { + throw new ParameterFormatException("languages"); + } + formatter = new TmxFormatter(writer, languageArray[0], languageArray[1]); + } else if (cls.equals("presentation")) { + Writer writer = getSingleWriter(commandLine); + int width = createInt(commandLine, "width", PresentationFormatter.DEFAULT_WIDTH); + formatter = new PresentationFormatter(writer, width); + } else if (cls.equals("html")) { + Writer writer = getSingleWriter(commandLine); + formatter = new HtmlFormatter(writer); + } else if (cls.equals("info")) { + Writer writer = getSingleWriter(commandLine); + formatter = new InfoFormatter(writer); + } else { + throw new UnknownParameterException("class"); + } + Parser parser = new AlParser(getIn()); + List alignmentList = parser.parse(); + formatter.format(alignmentList); + } + + private Writer getSingleWriter(CommandLine commandLine) { + Writer writer; + if (commandLine.getArgs().length == 0) { + writer = getOut(); + } else if (commandLine.getArgs().length == 1) { + String fileName = commandLine.getArgs()[0]; + writer = getWriter(getFileOutputStream(fileName)); + } else { + throw new WrongArgumentCountException("0, 1", commandLine.getArgs().length); + } + return writer; + } +} diff --git a/src/net/sourceforge/align/ui/console/command/MacroCommand.java b/src/net/sourceforge/align/ui/console/command/MacroCommand.java new file mode 100755 index 0000000..2c02426 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/MacroCommand.java @@ -0,0 +1,59 @@ +package net.sourceforge.align.ui.console.command; + +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.macro.GaleAndChurchMacro; +import net.sourceforge.align.filter.macro.MooreMacro; +import net.sourceforge.align.filter.macro.PoissonMacro; +import net.sourceforge.align.filter.macro.PoissonTranslationMacro; +import net.sourceforge.align.filter.macro.TranslationMacro; +import net.sourceforge.align.filter.meta.FilterDecorators; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + +public class MacroCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Macro class. Valid values are: galechurch, moore, poisson, translation, poisson-translation."); + } + + protected void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + + Filter filter; + if (cls.equals("galechurch")) { + filter = new GaleAndChurchMacro(); + } else if (cls.equals("moore")) { + filter = new MooreMacro(); + } else if (cls.equals("poisson")) { + filter = new PoissonMacro(); + } else if (cls.equals("translation")) { + filter = new TranslationMacro(); + } else if (cls.equals("poisson-translation")) { + filter = new PoissonTranslationMacro(); + } else { + throw new UnknownParameterException("class"); + } + + filter = FilterDecorators.decorate(filter); + + Parser parser = new AlParser(getIn()); + Formatter formatter = new AlFormatter(getOut()); + List alignmentList = parser.parse(); + alignmentList = filter.apply(alignmentList); + formatter.format(alignmentList); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/ModelCommand.java b/src/net/sourceforge/align/ui/console/command/ModelCommand.java new file mode 100755 index 0000000..5ad467a --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/ModelCommand.java @@ -0,0 +1,79 @@ +package net.sourceforge.align.ui.console.command; + +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.model.translation.TranslationModelUtil; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class ModelCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Modeller class. Valid values are: length, language-translation."); + options.addOption("i", "iterations", true, "Translation model train iteration count. Optional for language-translation modeller, default " + TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT + "."); + } + + public void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } else if (cls.equals("language-translation")) { + + //int iterations = createInt(commandLine, "iterations", + // TranslationModelUtil.DEFAULT_TRAIN_ITERATION_COUNT); + + //Prosty algorytm tokenizujący dlatego że wejście powinno być już + //stokenizowane - tokeny rozdzielone spacją. + //TODO: Czy dobrze? nie może być tokenów ze spacją w środku. + SplitAlgorithm splitAlgorithm = + VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + + Parser parser = new AlParser(getIn()); + List alignmentList = parser.parse(); + + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + for (Alignment alignment : alignmentList) { + sourceWidList.add(tokenizePutGet( + alignment.getSourceSegmentList(), + sourceVocabulary, splitAlgorithm)); + targetWidList.add(tokenizePutGet( + alignment.getTargetSegmentList(), + targetVocabulary, splitAlgorithm)); + } + + //LanguageModel sourceLanguageModel = + // LanguageModelUtil.train(sourceWidList); + //LanguageModel targetLanguageModel = + // LanguageModelUtil.train(targetWidList); + //TranslationModel translationModel = + // TranslationModelUtil.train(iterations, sourceWidList, targetWidList); + + } else { + throw new UnknownParameterException("class"); + } + + } + + private List tokenizePutGet(List segmentList, + Vocabulary vocabulary, SplitAlgorithm splitAlgorithm) { + List wordList = splitAlgorithm.modify(segmentList); + vocabulary.putWordList(wordList); + List widList = vocabulary.getWidList(wordList); + return widList; + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/ModifyCommand.java b/src/net/sourceforge/align/ui/console/command/ModifyCommand.java new file mode 100755 index 0000000..4289348 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/ModifyCommand.java @@ -0,0 +1,177 @@ +package net.sourceforge.align.ui.console.command; + + +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_MAX_WORD_COUNT; +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_MIN_OCCURRENCE_COUNT; +import static net.sourceforge.align.model.vocabulary.VocabularyUtil.DEFAULT_TOKENIZE_ALGORITHM; +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.meta.FilterDecorators; +import net.sourceforge.align.filter.modifier.Modifier; +import net.sourceforge.align.filter.modifier.modify.ModifyAlgorithm; +import net.sourceforge.align.filter.modifier.modify.NullModifyAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.FilterNonWordsCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.LowercaseCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.TrimCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.clean.UnifyRareWordsCleanAlgorithm; +import net.sourceforge.align.filter.modifier.modify.merge.SeparatorMergeAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.ParagraphSplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SentenceSplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.SrxSplitAlgorithm; +import net.sourceforge.align.filter.modifier.modify.split.WordSplitAlgorithm; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.model.vocabulary.Vocabulary; +import net.sourceforge.align.model.vocabulary.VocabularyUtil; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; +import net.sourceforge.align.util.Pair; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class ModifyCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Modifier class. Valid values are: merge, split-word, split-sentence, split-paragraph, split-srx, trim, lowercase, filter-non-words, unify-rare-words."); + options.addOption("p", "part", true, "Affected segment part. Valid values are: both(default), source, target."); + options.addOption("f", "file", true, "File containing modification information. Required by split-srx modifier."); + options.addOption("l", "languages", true, "Source and target language separated by comma. Required for split-srx modifier."); + options.addOption("s", "separator", true, "Merge separator string. Optional for merge modifier, default \"\"."); + options.addOption("w", "max-word-count", true, "Maximum number of words preserved. Optional for unify-rare-words modifier, default " + DEFAULT_MAX_WORD_COUNT + "."); + options.addOption("o", "min-occurrence-count", true, "Minimum number of occurences to preserve a word. Optional for unify-rare-words modifier, default " + DEFAULT_MIN_OCCURRENCE_COUNT + "."); + options.addOption("h", "help", false, "Display this help message."); + } + + protected void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + ModifyAlgorithm sourceAlgorithm; + ModifyAlgorithm targetAlgorithm = null; + Parser parser = new AlParser(getIn()); + List alignmentList = null; + if (cls.equals("split-word")) { + sourceAlgorithm = new WordSplitAlgorithm(); + } else if (cls.equals("split-sentence")) { + sourceAlgorithm = new SentenceSplitAlgorithm(); + } else if (cls.equals("split-paragraph")) { + sourceAlgorithm = new ParagraphSplitAlgorithm(); + } else if (cls.equals("split-srx")) { + String fileName = commandLine.getOptionValue('f'); + if (fileName == null) { + throw new MissingParameterException("file"); + } + String languages = commandLine.getOptionValue('l'); + if (languages == null) { + throw new MissingParameterException("languages"); + } + String[] languageArray = languages.split(","); + if (languageArray.length != 2) { + throw new ParameterFormatException("languages"); + } + Reader reader = getReader(getFileInputStream(fileName)); + sourceAlgorithm = new SrxSplitAlgorithm(reader, languageArray[0]); + reader = getReader(getFileInputStream(fileName)); + targetAlgorithm = new SrxSplitAlgorithm(reader, languageArray[1]); + } else if (cls.equals("merge")) { + String separator = commandLine.getOptionValue('s'); + if (separator == null) { + sourceAlgorithm = new SeparatorMergeAlgorithm(); + } else { + separator = separator.replaceAll("\\\\t", "\t"); + separator = separator.replaceAll("\\\\n", "\n"); + sourceAlgorithm = new SeparatorMergeAlgorithm(separator); + } + } else if (cls.equals("trim")) { + sourceAlgorithm = new TrimCleanAlgorithm(); + } else if (cls.equals("lowercase")) { + sourceAlgorithm = new LowercaseCleanAlgorithm(); + } else if (cls.equals("filter-non-words")) { + sourceAlgorithm = new FilterNonWordsCleanAlgorithm(); + } else if (cls.equals("unify-rare-words")) { + alignmentList = parser.parse(); + Pair algorithmPair = + createUnifyRareWordsAlgorithms(commandLine, alignmentList); + sourceAlgorithm = algorithmPair.first; + targetAlgorithm = algorithmPair.second; + } else { + throw new UnknownParameterException("class"); + } + String part = commandLine.getOptionValue('p'); + if (part == null) { + part = "both"; + } + if (part.equals("both")) { + if (targetAlgorithm == null) { + targetAlgorithm = sourceAlgorithm; + } + } else if (part.equals("source")) { + targetAlgorithm = new NullModifyAlgorithm(); + } else if (part.equals("target")) { + sourceAlgorithm = new NullModifyAlgorithm(); + } else { + throw new UnknownParameterException("part"); + } + + Formatter formatter = new AlFormatter(getOut()); + + Filter filter = new Modifier(sourceAlgorithm, targetAlgorithm); + filter = FilterDecorators.decorate(filter); + + if (alignmentList == null) { + alignmentList = parser.parse(); + } + + alignmentList = filter.apply(alignmentList); + formatter.format(alignmentList); + } + + private Pair createUnifyRareWordsAlgorithms( + CommandLine commandLine, List alignmentList) { + + SplitAlgorithm splitAlgorithm = DEFAULT_TOKENIZE_ALGORITHM; + int maxWordCount = createInt(commandLine, "max-word-count", + DEFAULT_MAX_WORD_COUNT); + int minOccurenceCount = createInt(commandLine, "min-occurrence-count", + DEFAULT_MIN_OCCURRENCE_COUNT); + + Vocabulary sourceVocabulary = new Vocabulary(); + Vocabulary targetVocabulary = new Vocabulary(); + List> sourceWidList = new ArrayList>(); + List> targetWidList = new ArrayList>(); + + VocabularyUtil.tokenize(splitAlgorithm, alignmentList, + sourceVocabulary, targetVocabulary, + sourceWidList, targetWidList); + + sourceVocabulary = VocabularyUtil.createTruncatedVocabulary( + sourceWidList, sourceVocabulary, + maxWordCount, minOccurenceCount); + targetVocabulary = VocabularyUtil.createTruncatedVocabulary( + targetWidList, targetVocabulary, + maxWordCount, minOccurenceCount); + + ModifyAlgorithm sourceAlgorithm = + new UnifyRareWordsCleanAlgorithm(sourceVocabulary); + ModifyAlgorithm targetAlgorithm = + new UnifyRareWordsCleanAlgorithm(targetVocabulary); + + return new Pair( + sourceAlgorithm, targetAlgorithm); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/ParseCommand.java b/src/net/sourceforge/align/ui/console/command/ParseCommand.java new file mode 100755 index 0000000..79fa568 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/ParseCommand.java @@ -0,0 +1,105 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; + +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.parser.PlaintextParser; +import net.sourceforge.align.parser.TmxParser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.ParameterFormatException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; +import net.sourceforge.align.ui.console.command.exception.WrongArgumentCountException; +import net.sourceforge.align.util.IORuntimeException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class ParseCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Parser class. Valid values are: al, txt, tmx."); + options.addOption("l", "languages", true, "Source and target language separated by comma (optional for tmx parser)."); + } + + public void run(CommandLine commandLine) { + try { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + List alignmentList = new ArrayList(); + if (cls.equals("al")) { + if (commandLine.getArgs().length < 1) { + throw new WrongArgumentCountException("1, 2, 3, ...", commandLine.getArgs().length); + } + for (String fileName : commandLine.getArgs()) { + Reader reader = getReader(getFileInputStream(fileName)); + Parser parser = new AlParser(reader); + List currentAlignmentList = parser.parse(); + alignmentList.addAll(currentAlignmentList); + reader.close(); + } + } else if (cls.equals("txt")) { + if ((commandLine.getArgs().length % 2) != 0) { + throw new WrongArgumentCountException("2, 4, 6, ...", commandLine.getArgs().length); + } + for (int i = 0; i < commandLine.getArgs().length; i += 2) { + String sourceFileName = commandLine.getArgs()[i]; + String targetFileName = commandLine.getArgs()[i + 1]; + Reader sourceReader = getReader(getFileInputStream(sourceFileName)); + Reader targetReader = getReader(getFileInputStream(targetFileName)); + Parser parser = new PlaintextParser(sourceReader, targetReader); + List currentAlignmentList = parser.parse(); + alignmentList.addAll(currentAlignmentList); + sourceReader.close(); + targetReader.close(); + } + } else if (cls.equals("tmx")) { + if (commandLine.getArgs().length < 1) { + throw new WrongArgumentCountException("1, 2, 3, ...", commandLine.getArgs().length); + } + String languages = commandLine.getOptionValue('l'); + String[] languageArray; + if (languages == null) { + languageArray = new String[0]; + } else { + languageArray = languages.split(","); + if (languageArray.length != 2) { + throw new ParameterFormatException("languages"); + } + } + for (String fileName : commandLine.getArgs()) { + Reader reader = getReader(getFileInputStream(fileName)); + Parser parser; + if (languageArray.length == 0) { + parser = new TmxParser(reader); + } else { + parser = new TmxParser(reader, languageArray[0], + languageArray[1]); + } + List currentAlignmentList = parser.parse(); + alignmentList.addAll(currentAlignmentList); + reader.close(); + } + + } else { + throw new UnknownParameterException("class"); + } + Formatter formatter = new AlFormatter(getOut()); + formatter.format(alignmentList); + } catch (IOException e) { + throw new IORuntimeException(e); + } + } +} diff --git a/src/net/sourceforge/align/ui/console/command/SelectCommand.java b/src/net/sourceforge/align/ui/console/command/SelectCommand.java new file mode 100755 index 0000000..273e739 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/SelectCommand.java @@ -0,0 +1,85 @@ +package net.sourceforge.align.ui.console.command; + +import static net.sourceforge.align.util.Util.getFileInputStream; +import static net.sourceforge.align.util.Util.getReader; + +import java.io.Reader; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; +import net.sourceforge.align.filter.Filter; +import net.sourceforge.align.filter.meta.FilterDecorators; +import net.sourceforge.align.filter.selector.DifferenceSelector; +import net.sourceforge.align.filter.selector.FractionSelector; +import net.sourceforge.align.filter.selector.IntersectionSelector; +import net.sourceforge.align.filter.selector.OneToOneSelector; +import net.sourceforge.align.filter.selector.ProbabilitySelector; +import net.sourceforge.align.formatter.AlFormatter; +import net.sourceforge.align.formatter.Formatter; +import net.sourceforge.align.parser.AlParser; +import net.sourceforge.align.parser.Parser; +import net.sourceforge.align.ui.console.command.exception.MissingParameterException; +import net.sourceforge.align.ui.console.command.exception.UnknownParameterException; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; + + +public class SelectCommand extends AbstractCommand { + + protected void initOptions(Options options) { + options.addOption("c", "class", true, "Selector class. Valid values are: one-to-one, fraction, probability, intersection, difference"); + options.addOption("f", "fraction", true, "Fraction <0, 1> to leave in alignment. Required by fraction selector."); + options.addOption("p", "probability", true, "Probability threshold, <0, 1>, to leave mapping in alignment. Required by preobability selector."); + options.addOption("a", "alignment", true, "Other alignment. Required by intersection and difference selectors."); + options.addOption("h", "help", false, "Display this help message."); + } + + protected void run(CommandLine commandLine) { + String cls = commandLine.getOptionValue('c'); + if (cls == null) { + throw new MissingParameterException("class"); + } + Filter filter; + + if (cls.equals("one-to-one")) { + filter = new OneToOneSelector(); + } else if (cls.equals("fraction")) { + float fraction = createFloat(commandLine, "fraction"); + filter = new FractionSelector(fraction); + } else if (cls.equals("probability")) { + float probability = createFloat(commandLine, "probability"); + filter = new ProbabilitySelector(probability); + } else if (cls.equals("intersection") || cls.equals("difference")) { + String alignmentString = commandLine.getOptionValue("alignment"); + if (alignmentString == null) { + throw new MissingParameterException("alignment"); + } + List alignment = loadAlignmentList(alignmentString); + if (cls.equals("intersection")) { + filter = new IntersectionSelector(alignment); + } else if (cls.equals("difference")) { + filter = new DifferenceSelector(alignment); + } else { + throw new UnknownParameterException("class"); + } + } else { + throw new UnknownParameterException("class"); + } + + filter = FilterDecorators.decorate(filter); + + Parser parser = new AlParser(getIn()); + Formatter formatter = new AlFormatter(getOut()); + List alignmentList = parser.parse(); + alignmentList = filter.apply(alignmentList); + formatter.format(alignmentList); + } + + private List loadAlignmentList(String fileName) { + Reader reader = getReader(getFileInputStream(fileName)); + Parser parser = new AlParser(reader); + return parser.parse(); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/TestCommand.java b/src/net/sourceforge/align/ui/console/command/TestCommand.java new file mode 100755 index 0000000..0580d7b --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/TestCommand.java @@ -0,0 +1,33 @@ +package net.sourceforge.align.ui.console.command; + + +import net.sourceforge.align.AlignTestSuite; + +import org.junit.internal.runners.TextListener; +import org.junit.runner.JUnitCore; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + + + +/** + * Test suite containing all tests executed using console. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AlignTestSuite.class +}) +public class TestCommand implements Command { + + public String getName() { + return "test"; + } + + public void run(String[] args) { + JUnitCore core = new JUnitCore(); + core.addListener(new TextListener()); + core.run(TestCommand.class); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/.svn/all-wcprops b/src/net/sourceforge/align/ui/console/command/exception/.svn/all-wcprops new file mode 100644 index 0000000..f8b4365 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/.svn/all-wcprops @@ -0,0 +1,41 @@ +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/ui/console/command/exception +END +UnknownParameterException.java +K 25 +svn:wc:ra_dav:version-url +V 126 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/ui/console/command/exception/UnknownParameterException.java +END +ParameterFormatException.java +K 25 +svn:wc:ra_dav:version-url +V 125 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/ui/console/command/exception/ParameterFormatException.java +END +MissingParameterException.java +K 25 +svn:wc:ra_dav:version-url +V 126 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/ui/console/command/exception/MissingParameterException.java +END +WrongArgumentCountException.java +K 25 +svn:wc:ra_dav:version-url +V 128 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/ui/console/command/exception/WrongArgumentCountException.java +END +ParametersParseException.java +K 25 +svn:wc:ra_dav:version-url +V 125 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/ui/console/command/exception/ParametersParseException.java +END +CommandException.java +K 25 +svn:wc:ra_dav:version-url +V 117 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/ui/console/command/exception/CommandException.java +END diff --git a/src/net/sourceforge/align/ui/console/command/exception/.svn/entries b/src/net/sourceforge/align/ui/console/command/exception/.svn/entries new file mode 100644 index 0000000..477335a --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/.svn/entries @@ -0,0 +1,100 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/ui/console/command/exception +https://align.svn.sourceforge.net/svnroot/align + + + +2008-04-24T08:23:10.479977Z +11 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +CommandException.java +file + + + + +2008-08-20T21:15:14.000000Z +a86c5a839b15b9ed2f4ad8d2472bcc99 +2008-04-24T08:23:10.479977Z +11 +jarekl + +MissingParameterException.java +file + + + + +2008-08-20T21:15:14.000000Z +055c063e9fe11663b0f8b7986aa94163 +2008-04-24T08:23:10.479977Z +11 +jarekl + +ParameterFormatException.java +file + + + + +2008-08-20T21:15:14.000000Z +08dcc2311d5271500a121363b2200e0d +2008-04-24T08:23:10.479977Z +11 +jarekl + +ParametersParseException.java +file + + + + +2008-08-20T21:15:14.000000Z +8e7e820172ebc7944c56bed8df64b8c9 +2008-04-24T08:23:10.479977Z +11 +jarekl + +UnknownParameterException.java +file + + + + +2008-08-20T21:15:14.000000Z +25a1a32e823e7aaaf19335900036ddbd +2008-04-24T08:23:10.479977Z +11 +jarekl + +WrongArgumentCountException.java +file + + + + +2008-08-20T21:15:14.000000Z +aa88daa27e2e4922df7b492b2ead0868 +2008-04-24T08:23:10.479977Z +11 +jarekl + diff --git a/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/CommandException.java.svn-base b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/CommandException.java.svn-base new file mode 100755 index 0000000..1ecbcfa --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/CommandException.java.svn-base @@ -0,0 +1,19 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class CommandException extends RuntimeException { + + private static final long serialVersionUID = 1962758074740784763L; + + public CommandException(String message) { + super(message); + } + + public CommandException(Throwable cause) { + super(cause); + } + + public CommandException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/MissingParameterException.java.svn-base b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/MissingParameterException.java.svn-base new file mode 100755 index 0000000..a4060b9 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/MissingParameterException.java.svn-base @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class MissingParameterException extends CommandException { + + private static final long serialVersionUID = 6250339071503029391L; + + public MissingParameterException(String parameter) { + super("Missing " + parameter + " parameter."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/ParameterFormatException.java.svn-base b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/ParameterFormatException.java.svn-base new file mode 100755 index 0000000..f180959 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/ParameterFormatException.java.svn-base @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class ParameterFormatException extends CommandException { + + private static final long serialVersionUID = 917612043442645990L; + + public ParameterFormatException(String parameter) { + super("Invlid " + parameter + " parameter format."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/ParametersParseException.java.svn-base b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/ParametersParseException.java.svn-base new file mode 100755 index 0000000..7361299 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/ParametersParseException.java.svn-base @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class ParametersParseException extends CommandException { + + private static final long serialVersionUID = 4883570247314804577L; + + public ParametersParseException(Throwable cause) { + super("Error parsing parameters.", cause); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/UnknownParameterException.java.svn-base b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/UnknownParameterException.java.svn-base new file mode 100755 index 0000000..2e66288 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/UnknownParameterException.java.svn-base @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class UnknownParameterException extends CommandException { + + private static final long serialVersionUID = 917612043442645990L; + + public UnknownParameterException(String parameter) { + super("Unknown " + parameter + " parameter."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/WrongArgumentCountException.java.svn-base b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/WrongArgumentCountException.java.svn-base new file mode 100755 index 0000000..b25f7b6 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/.svn/text-base/WrongArgumentCountException.java.svn-base @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class WrongArgumentCountException extends CommandException { + + private static final long serialVersionUID = 4883570247314804577L; + + public WrongArgumentCountException(String expected, int actual) { + super("Wrong argument count. Expected " + expected + ", but was " + actual + "."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/CommandException.java b/src/net/sourceforge/align/ui/console/command/exception/CommandException.java new file mode 100755 index 0000000..1ecbcfa --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/CommandException.java @@ -0,0 +1,19 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class CommandException extends RuntimeException { + + private static final long serialVersionUID = 1962758074740784763L; + + public CommandException(String message) { + super(message); + } + + public CommandException(Throwable cause) { + super(cause); + } + + public CommandException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/MissingParameterException.java b/src/net/sourceforge/align/ui/console/command/exception/MissingParameterException.java new file mode 100755 index 0000000..a4060b9 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/MissingParameterException.java @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class MissingParameterException extends CommandException { + + private static final long serialVersionUID = 6250339071503029391L; + + public MissingParameterException(String parameter) { + super("Missing " + parameter + " parameter."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/ParameterFormatException.java b/src/net/sourceforge/align/ui/console/command/exception/ParameterFormatException.java new file mode 100755 index 0000000..f180959 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/ParameterFormatException.java @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class ParameterFormatException extends CommandException { + + private static final long serialVersionUID = 917612043442645990L; + + public ParameterFormatException(String parameter) { + super("Invlid " + parameter + " parameter format."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/ParametersParseException.java b/src/net/sourceforge/align/ui/console/command/exception/ParametersParseException.java new file mode 100755 index 0000000..7361299 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/ParametersParseException.java @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class ParametersParseException extends CommandException { + + private static final long serialVersionUID = 4883570247314804577L; + + public ParametersParseException(Throwable cause) { + super("Error parsing parameters.", cause); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/UnknownParameterException.java b/src/net/sourceforge/align/ui/console/command/exception/UnknownParameterException.java new file mode 100755 index 0000000..2e66288 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/UnknownParameterException.java @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class UnknownParameterException extends CommandException { + + private static final long serialVersionUID = 917612043442645990L; + + public UnknownParameterException(String parameter) { + super("Unknown " + parameter + " parameter."); + } + +} diff --git a/src/net/sourceforge/align/ui/console/command/exception/WrongArgumentCountException.java b/src/net/sourceforge/align/ui/console/command/exception/WrongArgumentCountException.java new file mode 100755 index 0000000..b25f7b6 --- /dev/null +++ b/src/net/sourceforge/align/ui/console/command/exception/WrongArgumentCountException.java @@ -0,0 +1,11 @@ +package net.sourceforge.align.ui.console.command.exception; + +public class WrongArgumentCountException extends CommandException { + + private static final long serialVersionUID = 4883570247314804577L; + + public WrongArgumentCountException(String expected, int actual) { + super("Wrong argument count. Expected " + expected + ", but was " + actual + "."); + } + +} diff --git a/src/net/sourceforge/align/util/.svn/all-wcprops b/src/net/sourceforge/align/util/.svn/all-wcprops new file mode 100644 index 0000000..105e9a9 --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/all-wcprops @@ -0,0 +1,53 @@ +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/align/!svn/ver/45/trunk/maligna/src/net/sourceforge/align/util +END +IORuntimeException.java +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/40/trunk/maligna/src/net/sourceforge/align/util/IORuntimeException.java +END +ImpossibleException.java +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/40/trunk/maligna/src/net/sourceforge/align/util/ImpossibleException.java +END +Pair.java +K 25 +svn:wc:ra_dav:version-url +V 81 +/svnroot/align/!svn/ver/40/trunk/maligna/src/net/sourceforge/align/util/Pair.java +END +Version.java +K 25 +svn:wc:ra_dav:version-url +V 84 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/Version.java +END +UtilTest.java +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/UtilTest.java +END +UtilTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/UtilTestSuite.java +END +ResourceNotFoundException.java +K 25 +svn:wc:ra_dav:version-url +V 102 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/ResourceNotFoundException.java +END +Util.java +K 25 +svn:wc:ra_dav:version-url +V 81 +/svnroot/align/!svn/ver/53/trunk/maligna/src/net/sourceforge/align/util/Util.java +END diff --git a/src/net/sourceforge/align/util/.svn/entries b/src/net/sourceforge/align/util/.svn/entries new file mode 100644 index 0000000..1e250a8 --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/entries @@ -0,0 +1,306 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/util +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-13T19:43:41.835402Z +45 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +IORuntimeException.java +file + + + + +2009-08-28T16:49:04.000000Z +f7217de17f8f6d32c909f6965fabf1e6 +2009-09-01T19:06:52.277402Z +40 +jarekl + + + + + + + + + + + + + + + + + + + + + +356 + +ImpossibleException.java +file + + + + +2009-08-28T16:44:28.000000Z +1f6fd783769e52305aa118f0622d087a +2009-09-01T19:06:52.277402Z +40 +jarekl + + + + + + + + + + + + + + + + + + + + + +637 + +Pair.java +file + + + + +2009-09-01T17:45:51.000000Z +c680f56e5c56f54d5a3f9f3549f8d479 +2009-09-01T19:06:52.277402Z +40 +jarekl + + + + + + + + + + + + + + + + + + + + + +979 + +ResourceNotFoundException.java +file + + + + +2010-10-19T19:31:50.000000Z +7dc5bd1a125d34e693860f9786e525ca +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +461 + +Util.java +file +53 + + + +2010-12-30T00:26:02.000000Z +dea290ee1d913075d403ac461bb8b5ba +2011-02-16T09:44:41.906134Z +53 +jarekl + + + + + + + + + + + + + + + + + + + + + +11565 + +UtilTest.java +file + + + + +2010-10-28T16:40:14.000000Z +e512caaa2be355478baa98f0a35ca47c +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +3062 + +UtilTestSuite.java +file + + + + +2010-10-19T19:32:43.000000Z +0cc80faa2e6be1b0a2c0cb7563faa8be +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +300 + +Version.java +file + + + + +2010-11-01T18:23:44.000000Z +e8135a5e617329d4a08488dfe58acd74 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2634 + +bind +dir + +date +dir + diff --git a/src/net/sourceforge/align/util/.svn/text-base/IORuntimeException.java.svn-base b/src/net/sourceforge/align/util/.svn/text-base/IORuntimeException.java.svn-base new file mode 100755 index 0000000..88f3e72 --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/text-base/IORuntimeException.java.svn-base @@ -0,0 +1,17 @@ +package net.sourceforge.align.util; + +import java.io.IOException; + +public class IORuntimeException extends RuntimeException { + + private static final long serialVersionUID = -6587044052300876023L; + + public IORuntimeException(IOException exception) { + super(exception); + } + + public void rethrow() throws IOException { + throw (IOException) getCause(); + } + +} diff --git a/src/net/sourceforge/align/util/.svn/text-base/ImpossibleException.java.svn-base b/src/net/sourceforge/align/util/.svn/text-base/ImpossibleException.java.svn-base new file mode 100755 index 0000000..f50f1a5 --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/text-base/ImpossibleException.java.svn-base @@ -0,0 +1,28 @@ +package net.sourceforge.align.util; + +/** + * Represents exception that should never occur. Should be thrown when You want + * to swallow other exception because you are sure that it won't be thrown. + * + * @author Jarek Lipski (loomchild) + */ +public class ImpossibleException extends RuntimeException { + + private static final long serialVersionUID = -5899108883494773808L; + + public ImpossibleException() { + } + + public ImpossibleException(String message) { + super(message); + } + + public ImpossibleException(String message, Throwable cause) { + super(message, cause); + } + + public ImpossibleException(Throwable cause) { + super(cause); + } + +} diff --git a/src/net/sourceforge/align/util/.svn/text-base/Pair.java.svn-base b/src/net/sourceforge/align/util/.svn/text-base/Pair.java.svn-base new file mode 100755 index 0000000..732ad04 --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/text-base/Pair.java.svn-base @@ -0,0 +1,47 @@ +package net.sourceforge.align.util; + +/** + * Simple structure of two values of any type. + * + * @author loomchild + */ +public class Pair { + + public F first; + public S second; + + public Pair(F first, S second) { + this.first = first; + this.second = second; + } + + public int hashCode() { + final int PRIME = 31; + int result = 1; + result = PRIME * result + ((first == null) ? 0 : first.hashCode()); + result = PRIME * result + ((second == null) ? 0 : second.hashCode()); + return result; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Pair other = (Pair) obj; + if (first == null) { + if (other.first != null) + return false; + } else if (!first.equals(other.first)) + return false; + if (second == null) { + if (other.second != null) + return false; + } else if (!second.equals(other.second)) + return false; + return true; + } + +} diff --git a/src/net/sourceforge/align/util/.svn/text-base/ResourceNotFoundException.java.svn-base b/src/net/sourceforge/align/util/.svn/text-base/ResourceNotFoundException.java.svn-base new file mode 100644 index 0000000..6ff2131 --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/text-base/ResourceNotFoundException.java.svn-base @@ -0,0 +1,21 @@ +package net.sourceforge.align.util; + +/** + * Represents an exception that is thrown when a resource (usually a file) + * cannot be found. + * @author loomchild + * + */ +public class ResourceNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 318909218824445026L; + + public ResourceNotFoundException(String name) { + super(name); + } + + public ResourceNotFoundException(String name, Throwable cause) { + super(name, cause); + } + +} diff --git a/src/net/sourceforge/align/util/.svn/text-base/Util.java.svn-base b/src/net/sourceforge/align/util/.svn/text-base/Util.java.svn-base new file mode 100644 index 0000000..7aab49b --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/text-base/Util.java.svn-base @@ -0,0 +1,374 @@ +package net.sourceforge.align.util; + +import static org.junit.Assert.assertEquals; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * General purpose utility functions. + * + * @author Jarek Lipski (loomchild) + */ +public class Util { + + public static final int READ_BUFFER_SIZE = 1024; + + /** + * Creates alignment list containing one alignment. This alignment + * contains given source segments and no target segments. + * + * @param sourceSegmentList source segments + * @return singleton alignment list + */ + public static List alignManyToZero( + List sourceSegmentList) { + Alignment alignment = new Alignment(); + alignment.addSourceSegmentList(sourceSegmentList); + return Collections.singletonList(alignment); + } + + /** + * Creates alignment list containing one alignment. This alignment + * contains no source segments and given target segments. + * + * @param targetSegmentList target segments + * @return singleton alignment list + */ + public static List alignZeroToMany( + List targetSegmentList) { + Alignment alignment = new Alignment(); + alignment.addTargetSegmentList(targetSegmentList); + return Collections.singletonList(alignment); + } + + /** + * Creates alignment list containing one alignment. This alignment contains + * given source and target segments. + * + * @param sourceSegmentList source segments + * @param targetSegmentList target segments + * @return singleton alignment list + */ + public static List alignManyToMany( + List sourceSegmentList, List targetSegmentList) { + Alignment alignment = + new Alignment(sourceSegmentList, targetSegmentList, 0.0f); + return Collections.singletonList(alignment); + } + + /** + * Asserts that given alignment consists of given source and + * target segments. If not then exception is thrown. Used for unit testing. + * + * @param sourceSegmentArray expected source segments + * @param targetSegmentArray expected target segments + * @param alignment alignment to be checked + * @throws AssertionError when alignment does not consist of + * given segments + */ + public static void assertAlignmentEquals(String[] sourceSegmentArray, + String[] targetSegmentArray, Alignment alignment) { + List sourceSegmentList = alignment.getSourceSegmentList(); + List targetSegmentList = alignment.getTargetSegmentList(); + String[] actualSourceSegmentArray = + sourceSegmentList.toArray(new String[sourceSegmentList.size()]); + String[] actualTargetSegmentArray = + targetSegmentList.toArray(new String[targetSegmentList.size()]); + assertEquals(sourceSegmentArray, actualSourceSegmentArray); + assertEquals(targetSegmentArray, actualTargetSegmentArray); + } + + /** + * Asserts that alignments on a given list consists of given source and + * target segments in given arrays. If not then exception is thrown. + * + * @param sourceSegmentArray expected source segments + * @param targetSegmentArray expected target segments + * @param alignmentList alignments to be checked + * @throws AssertionError when any alignment on the list does not + * consist of given segments + */ + public static void assertAlignmentListEquals(String[][] sourceSegmentArray, + String[][] targetSegmentArray, List alignmentList) { + assertEquals(sourceSegmentArray.length, targetSegmentArray.length); + int length = sourceSegmentArray.length; + assertEquals(length, alignmentList.size()); + int i = 0; + for (Alignment alignment : alignmentList) { + assertAlignmentEquals(sourceSegmentArray[i], targetSegmentArray[i], + alignment); + ++i; + } + } + + /** + * Asserts that given alignment list consists only from given + * source and target segments in the same order. + * + * @param sourceSegments expected source segments, order is important + * @param targetSegments expected target segments, order is important + * @param alignmentList alignments to be checked + * @throws AssertionError when alignment list does not consist only from + * given source and target segments + */ + public static void assertAlignmentListContains(String[] sourceSegments, + String[] targetSegments, List alignmentList) { + List actualSourceSegments = new ArrayList(); + List actualTargetSegments = new ArrayList(); + for (Alignment alignment : alignmentList) { + actualSourceSegments.addAll(alignment.getSourceSegmentList()); + actualTargetSegments.addAll(alignment.getTargetSegmentList()); + } + assertEquals(sourceSegments, actualSourceSegments.toArray()); + assertEquals(targetSegments, actualTargetSegments.toArray()); + } + + /** + * Creates alignment list from segments read from given source and target + * segment arrays. Array sizes must be equalm the resulting list will have + * the same size. Used for unit testing. + * + * @param sourceArray + * @param targetArray + * @return alignment list + */ + public static List createAlignmentList(String[][] sourceArray, + String[][] targetArray) { + assertEquals(sourceArray.length, targetArray.length); + List alignmentList = new ArrayList(); + int alignmentCount = sourceArray.length; + for (int i = 0; i < alignmentCount; ++i) { + Alignment alignment = new Alignment(Arrays.asList(sourceArray[i]), + Arrays.asList(targetArray[i]), 1.0f); + alignmentList.add(alignment); + } + return alignmentList; + } + + /** + * Returns array of segments containing only alignments with indexes + * specified in indexes array from given segment array. + * Used for unit testing. + * + * @param segmentArray segment array + * @param indexes index array; contains indexes of elements from + * segment array + * @return segment array containing selected segments + */ + public static String[][] filterSegmentArray(String[][] segmentArray, + int[] indexes) { + String[][] newArray = new String[indexes.length][]; + for (int i = 0; i < indexes.length; ++i) { + newArray[i] = segmentArray[indexes[i]]; + } + return newArray; + } + + /** + *

Converts probability to score. The score is more accurate for + * calculations

+ *

score = -ln(probability)

+ * + * @param probability probability + * @return score + */ + public static double toScore(double probability) { + return -Math.log(probability); + } + + /** + *

Converts score to probability. The probability is easier to understand + * by humans than score.

+ *

probability = e^(-score)

+ * + * @param score score + * @return probability + */ + public static double toProbability(double score) { + return Math.exp(-score); + } + + /** + * Calculates a sum of probabilities. The probabilities are given + * as score and the result is returned as score as well. Takes care + * to preserve maximum precision. + * + * @see #toScore(double) + * @see #toProbability(double) + * + * @param scoreList list of score that need to be converted to probabilities + * and added + * @return score representing a sum of probabilities + */ + public static float scoreSum(List scoreList) { + float scoreSum; + if (scoreList.size() == 0) { + scoreSum = 0.0f; + } else { + float minScore = Collections.min(scoreList); + if (minScore == Float.POSITIVE_INFINITY) { + scoreSum = Float.POSITIVE_INFINITY; + } else { + double probabilitySum = 0.0; + for (float score : scoreList) { + double probability = Util.toProbability(score - minScore); + probabilitySum += probability; + } + double probabilityScore = Util.toScore(probabilitySum); + scoreSum = (float)(minScore + probabilityScore); + } + } + return scoreSum; + } + + /** + * Merges a string list into a single string without inserting any extra + * characters between strings. + * + * @param stringList + * @return merged string + */ + public static String merge(List stringList) { + StringBuilder stringBuilder = new StringBuilder(); + for (String string : stringList) { + stringBuilder.append(string); + } + return stringBuilder.toString(); + } + + /** + * Rounds a given number to a given precision places after decimal point. + * + * @param number + * @param precision + * @return Returns rounded number. + */ + public static double round(double number, int precision) { + double cutter = Math.pow(10, precision); + return (double) ((int) (number * cutter)) / cutter; + } + + /** + * Creates a UTF-8 reader from a given input stream. + * @param inputStream + * @return reader + */ + public static BufferedReader getReader(InputStream inputStream) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader( + inputStream, "utf-8")); + return reader; + } catch (UnsupportedEncodingException e) { + throw new IORuntimeException(e); + } + } + + /** + * Creates a UTF-8 writer from given output stream. + * @param outputStream + * @return writer + */ + public static PrintWriter getWriter(OutputStream outputStream) { + try { + return new PrintWriter(new OutputStreamWriter((outputStream), + "utf-8"), true); + } catch (UnsupportedEncodingException e) { + throw new IORuntimeException(e); + } + } + + /** + * Opens a file with given name for reading. + * @param fileName + * @return file input stream + */ + public static FileInputStream getFileInputStream(String fileName) { + try { + return new FileInputStream(fileName); + } catch (FileNotFoundException e) { + throw new IORuntimeException(e); + } + } + + /** + * Opens a file with given name for writing. + * @param fileName + * @return file output stream + */ + public static FileOutputStream getFileOutputStream(String fileName) { + try { + return new FileOutputStream(fileName); + } catch (FileNotFoundException e) { + throw new IORuntimeException(e); + } + } + + /** + * Finds a resource using class loader and opens it for reading. + * + * @param name resource name + * @return resource input stream + * @throws ResourceNotFoundException when resource could not be found + */ + public static InputStream getResourceStream(String name) { + InputStream inputStream = Util.class.getClassLoader() + .getResourceAsStream(name); + if (inputStream == null) { + throw new ResourceNotFoundException(name); + } + return inputStream; + } + + /** + * Reads all reader content into a string. + * Uses {@link #copyAll(Reader, Writer)}. + * + * @param reader input reader + * @return string + * @throws IORuntimeException when IO error occurs + */ + public static String readAll(Reader reader) { + StringWriter writer = new StringWriter(); + copyAll(reader, writer); + return writer.toString(); + } + + /** + * Copies all the content of given reader to given writer. Uses internal + * {@value #READ_BUFFER_SIZE} byte buffer to speed up the operation. + * @param reader + * @param writer + * @throws IORuntimeException when error occurs + */ + public static void copyAll(Reader reader, Writer writer) { + try { + char[] readBuffer = new char[READ_BUFFER_SIZE]; + int count; + while ((count = reader.read(readBuffer)) != -1) { + writer.write(readBuffer, 0, count); + } + } catch (IOException e) { + throw new IORuntimeException(e); + } + } + +} diff --git a/src/net/sourceforge/align/util/.svn/text-base/UtilTest.java.svn-base b/src/net/sourceforge/align/util/.svn/text-base/UtilTest.java.svn-base new file mode 100644 index 0000000..8baa244 --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/text-base/UtilTest.java.svn-base @@ -0,0 +1,106 @@ +package net.sourceforge.align.util; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents utility methods test. + * + * @author loomchild + */ +public class UtilTest { + + @Test + public void alignManyToZero() { + List alignmentList = Util.alignManyToZero( + Arrays.asList(new String[]{"a", "b"})); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + Util.assertAlignmentEquals(new String[]{"a", "b"}, new String[]{}, + alignment); + } + + @Test + public void alignZeroToMany() { + List alignmentList = Util.alignZeroToMany( + Arrays.asList(new String[]{"a", "b"})); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + Util.assertAlignmentEquals(new String[]{}, new String[]{"a", "b"}, + alignment); + } + + @Test + public void alignManyToMany() { + List alignmentList = Util.alignManyToMany( + Arrays.asList(new String[]{"a", "b"}), + Arrays.asList(new String[]{"c", "d", "e"})); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + Util.assertAlignmentEquals(new String[]{"a","b"}, + new String[]{"c", "d", "e"}, alignment); + } + + @Test + public void assertAlignmentEquals() { + Alignment alignment = new Alignment( + Arrays.asList(new String[]{"a", "b"}), + Arrays.asList(new String[]{"c"}), 0.5f); + Util.assertAlignmentEquals(new String[]{"a", "b"}, new String[]{"c"}, + alignment); + try { + Util.assertAlignmentEquals(new String[]{"a", "b"}, new String[]{"d"}, + alignment); + } catch (AssertionError e) { + } + } + + public static final float[][] PROBABILITY_ARRAY = new float[][] { + new float[] {0.1f, }, + new float[] {0.1f, 0.3f,}, + new float[] {0.1f, 0.3f, 0.2f, }, + }; + + @Test + public void testScoreSum() { + List emptyScoreList = Collections.emptyList(); + assertEquals(0.0f, Util.scoreSum(emptyScoreList), 0.00001f); + for (int i = 0; i < PROBABILITY_ARRAY.length; ++i) { + float[] probabilityArray = PROBABILITY_ARRAY[i]; + float expectedProbability = sum(probabilityArray); + float expectedScore = (float)Util.toScore(expectedProbability); + List scoreList = toScore(probabilityArray); + float actualScore = Util.scoreSum(scoreList); + float actualProbability = (float)Util.toProbability(actualScore); + assertEquals("Array " + i, expectedProbability, actualProbability, + 0.00001f); + assertEquals("Array " + i, expectedScore, actualScore, 0.00001f); + } + } + + private float sum(float[] array) { + float sum = 0; + for (float element : array) { + sum += element; + } + return sum; + } + + private List toScore(float[] probabilityArray) { + List scoreList = new ArrayList(probabilityArray.length); + for (float probability : probabilityArray) { + float score = (float)Util.toScore(probability); + scoreList.add(score); + } + return scoreList; + } + +} diff --git a/src/net/sourceforge/align/util/.svn/text-base/UtilTestSuite.java.svn-base b/src/net/sourceforge/align/util/.svn/text-base/UtilTestSuite.java.svn-base new file mode 100644 index 0000000..228466a --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/text-base/UtilTestSuite.java.svn-base @@ -0,0 +1,16 @@ +package net.sourceforge.align.util; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Test suite containing all unit tests in util package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + UtilTest.class + }) +public class UtilTestSuite { + +} diff --git a/src/net/sourceforge/align/util/.svn/text-base/Version.java.svn-base b/src/net/sourceforge/align/util/.svn/text-base/Version.java.svn-base new file mode 100644 index 0000000..d0cb3bb --- /dev/null +++ b/src/net/sourceforge/align/util/.svn/text-base/Version.java.svn-base @@ -0,0 +1,89 @@ +package net.sourceforge.align.util; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.jar.Manifest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Retrieves program version and build date from META-INF/MANIFEST.MF file + * stored in a JAR. Singleton. + * @author loomchild + */ +public class Version { + + private static final Log log = LogFactory.getLog(Version.class); + + public static final String VERSION_ATTRIBUTE = "Implementation-Version"; + public static final String DATE_ATTRIBUTE = "Build-Date"; + + private static final String MANIFEST_PATH = "/META-INF/MANIFEST.MF"; + + private static Version instance = new Version(); + + private String version; + + private String date; + + public static Version getInstance() { + return instance; + } + + private Version() { + try { + Manifest manifest = getJarManifest(Version.class); + version = manifest.getMainAttributes().getValue(VERSION_ATTRIBUTE); + date = manifest.getMainAttributes().getValue(DATE_ATTRIBUTE); + } catch (ResourceNotFoundException e) { + // Ignore, attributes stay null + log.debug("Version number cannot be retrieved."); + } + } + + public String getVersion() { + return version; + } + + public String getDate() { + return date; + } + + /** + * Returns Manifest of a jar containing given class. If class is not + * in a jar, throws {@link ResourceNotFoundException}. + * @param klass Class. + * @return Manifest. + * @throws ResourceNotFoundException Thrown if manifest was not found. + */ + private Manifest getJarManifest(Class klass) { + URL classUrl = klass.getResource(klass.getSimpleName() + ".class"); + if (classUrl == null) { + throw new IllegalArgumentException("Class not found: " + + klass.getName() + "."); + } + String classPath = classUrl.toString(); + int jarIndex = classPath.indexOf('!'); + if (jarIndex != -1) { + String manifestPath = + classPath.substring(0, jarIndex + 1) + MANIFEST_PATH; + try { + URL manifestUrl = new URL(manifestPath); + InputStream manifestStream = manifestUrl.openStream(); + Manifest manifest = new Manifest(manifestStream); + return manifest; + } + catch (IOException e) { + throw new ResourceNotFoundException( + "IO Error retrieving manifest.", e); + } + } + else { + throw new ResourceNotFoundException( + "Class is not in a JAR archive " + klass.getName() + "."); + } + } + +} diff --git a/src/net/sourceforge/align/util/IORuntimeException.java b/src/net/sourceforge/align/util/IORuntimeException.java new file mode 100755 index 0000000..88f3e72 --- /dev/null +++ b/src/net/sourceforge/align/util/IORuntimeException.java @@ -0,0 +1,17 @@ +package net.sourceforge.align.util; + +import java.io.IOException; + +public class IORuntimeException extends RuntimeException { + + private static final long serialVersionUID = -6587044052300876023L; + + public IORuntimeException(IOException exception) { + super(exception); + } + + public void rethrow() throws IOException { + throw (IOException) getCause(); + } + +} diff --git a/src/net/sourceforge/align/util/ImpossibleException.java b/src/net/sourceforge/align/util/ImpossibleException.java new file mode 100755 index 0000000..f50f1a5 --- /dev/null +++ b/src/net/sourceforge/align/util/ImpossibleException.java @@ -0,0 +1,28 @@ +package net.sourceforge.align.util; + +/** + * Represents exception that should never occur. Should be thrown when You want + * to swallow other exception because you are sure that it won't be thrown. + * + * @author Jarek Lipski (loomchild) + */ +public class ImpossibleException extends RuntimeException { + + private static final long serialVersionUID = -5899108883494773808L; + + public ImpossibleException() { + } + + public ImpossibleException(String message) { + super(message); + } + + public ImpossibleException(String message, Throwable cause) { + super(message, cause); + } + + public ImpossibleException(Throwable cause) { + super(cause); + } + +} diff --git a/src/net/sourceforge/align/util/Pair.java b/src/net/sourceforge/align/util/Pair.java new file mode 100755 index 0000000..732ad04 --- /dev/null +++ b/src/net/sourceforge/align/util/Pair.java @@ -0,0 +1,47 @@ +package net.sourceforge.align.util; + +/** + * Simple structure of two values of any type. + * + * @author loomchild + */ +public class Pair { + + public F first; + public S second; + + public Pair(F first, S second) { + this.first = first; + this.second = second; + } + + public int hashCode() { + final int PRIME = 31; + int result = 1; + result = PRIME * result + ((first == null) ? 0 : first.hashCode()); + result = PRIME * result + ((second == null) ? 0 : second.hashCode()); + return result; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Pair other = (Pair) obj; + if (first == null) { + if (other.first != null) + return false; + } else if (!first.equals(other.first)) + return false; + if (second == null) { + if (other.second != null) + return false; + } else if (!second.equals(other.second)) + return false; + return true; + } + +} diff --git a/src/net/sourceforge/align/util/ResourceNotFoundException.java b/src/net/sourceforge/align/util/ResourceNotFoundException.java new file mode 100755 index 0000000..6ff2131 --- /dev/null +++ b/src/net/sourceforge/align/util/ResourceNotFoundException.java @@ -0,0 +1,21 @@ +package net.sourceforge.align.util; + +/** + * Represents an exception that is thrown when a resource (usually a file) + * cannot be found. + * @author loomchild + * + */ +public class ResourceNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 318909218824445026L; + + public ResourceNotFoundException(String name) { + super(name); + } + + public ResourceNotFoundException(String name, Throwable cause) { + super(name, cause); + } + +} diff --git a/src/net/sourceforge/align/util/Util.java b/src/net/sourceforge/align/util/Util.java new file mode 100755 index 0000000..7aab49b --- /dev/null +++ b/src/net/sourceforge/align/util/Util.java @@ -0,0 +1,374 @@ +package net.sourceforge.align.util; + +import static org.junit.Assert.assertEquals; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +/** + * General purpose utility functions. + * + * @author Jarek Lipski (loomchild) + */ +public class Util { + + public static final int READ_BUFFER_SIZE = 1024; + + /** + * Creates alignment list containing one alignment. This alignment + * contains given source segments and no target segments. + * + * @param sourceSegmentList source segments + * @return singleton alignment list + */ + public static List alignManyToZero( + List sourceSegmentList) { + Alignment alignment = new Alignment(); + alignment.addSourceSegmentList(sourceSegmentList); + return Collections.singletonList(alignment); + } + + /** + * Creates alignment list containing one alignment. This alignment + * contains no source segments and given target segments. + * + * @param targetSegmentList target segments + * @return singleton alignment list + */ + public static List alignZeroToMany( + List targetSegmentList) { + Alignment alignment = new Alignment(); + alignment.addTargetSegmentList(targetSegmentList); + return Collections.singletonList(alignment); + } + + /** + * Creates alignment list containing one alignment. This alignment contains + * given source and target segments. + * + * @param sourceSegmentList source segments + * @param targetSegmentList target segments + * @return singleton alignment list + */ + public static List alignManyToMany( + List sourceSegmentList, List targetSegmentList) { + Alignment alignment = + new Alignment(sourceSegmentList, targetSegmentList, 0.0f); + return Collections.singletonList(alignment); + } + + /** + * Asserts that given alignment consists of given source and + * target segments. If not then exception is thrown. Used for unit testing. + * + * @param sourceSegmentArray expected source segments + * @param targetSegmentArray expected target segments + * @param alignment alignment to be checked + * @throws AssertionError when alignment does not consist of + * given segments + */ + public static void assertAlignmentEquals(String[] sourceSegmentArray, + String[] targetSegmentArray, Alignment alignment) { + List sourceSegmentList = alignment.getSourceSegmentList(); + List targetSegmentList = alignment.getTargetSegmentList(); + String[] actualSourceSegmentArray = + sourceSegmentList.toArray(new String[sourceSegmentList.size()]); + String[] actualTargetSegmentArray = + targetSegmentList.toArray(new String[targetSegmentList.size()]); + assertEquals(sourceSegmentArray, actualSourceSegmentArray); + assertEquals(targetSegmentArray, actualTargetSegmentArray); + } + + /** + * Asserts that alignments on a given list consists of given source and + * target segments in given arrays. If not then exception is thrown. + * + * @param sourceSegmentArray expected source segments + * @param targetSegmentArray expected target segments + * @param alignmentList alignments to be checked + * @throws AssertionError when any alignment on the list does not + * consist of given segments + */ + public static void assertAlignmentListEquals(String[][] sourceSegmentArray, + String[][] targetSegmentArray, List alignmentList) { + assertEquals(sourceSegmentArray.length, targetSegmentArray.length); + int length = sourceSegmentArray.length; + assertEquals(length, alignmentList.size()); + int i = 0; + for (Alignment alignment : alignmentList) { + assertAlignmentEquals(sourceSegmentArray[i], targetSegmentArray[i], + alignment); + ++i; + } + } + + /** + * Asserts that given alignment list consists only from given + * source and target segments in the same order. + * + * @param sourceSegments expected source segments, order is important + * @param targetSegments expected target segments, order is important + * @param alignmentList alignments to be checked + * @throws AssertionError when alignment list does not consist only from + * given source and target segments + */ + public static void assertAlignmentListContains(String[] sourceSegments, + String[] targetSegments, List alignmentList) { + List actualSourceSegments = new ArrayList(); + List actualTargetSegments = new ArrayList(); + for (Alignment alignment : alignmentList) { + actualSourceSegments.addAll(alignment.getSourceSegmentList()); + actualTargetSegments.addAll(alignment.getTargetSegmentList()); + } + assertEquals(sourceSegments, actualSourceSegments.toArray()); + assertEquals(targetSegments, actualTargetSegments.toArray()); + } + + /** + * Creates alignment list from segments read from given source and target + * segment arrays. Array sizes must be equalm the resulting list will have + * the same size. Used for unit testing. + * + * @param sourceArray + * @param targetArray + * @return alignment list + */ + public static List createAlignmentList(String[][] sourceArray, + String[][] targetArray) { + assertEquals(sourceArray.length, targetArray.length); + List alignmentList = new ArrayList(); + int alignmentCount = sourceArray.length; + for (int i = 0; i < alignmentCount; ++i) { + Alignment alignment = new Alignment(Arrays.asList(sourceArray[i]), + Arrays.asList(targetArray[i]), 1.0f); + alignmentList.add(alignment); + } + return alignmentList; + } + + /** + * Returns array of segments containing only alignments with indexes + * specified in indexes array from given segment array. + * Used for unit testing. + * + * @param segmentArray segment array + * @param indexes index array; contains indexes of elements from + * segment array + * @return segment array containing selected segments + */ + public static String[][] filterSegmentArray(String[][] segmentArray, + int[] indexes) { + String[][] newArray = new String[indexes.length][]; + for (int i = 0; i < indexes.length; ++i) { + newArray[i] = segmentArray[indexes[i]]; + } + return newArray; + } + + /** + *

Converts probability to score. The score is more accurate for + * calculations

+ *

score = -ln(probability)

+ * + * @param probability probability + * @return score + */ + public static double toScore(double probability) { + return -Math.log(probability); + } + + /** + *

Converts score to probability. The probability is easier to understand + * by humans than score.

+ *

probability = e^(-score)

+ * + * @param score score + * @return probability + */ + public static double toProbability(double score) { + return Math.exp(-score); + } + + /** + * Calculates a sum of probabilities. The probabilities are given + * as score and the result is returned as score as well. Takes care + * to preserve maximum precision. + * + * @see #toScore(double) + * @see #toProbability(double) + * + * @param scoreList list of score that need to be converted to probabilities + * and added + * @return score representing a sum of probabilities + */ + public static float scoreSum(List scoreList) { + float scoreSum; + if (scoreList.size() == 0) { + scoreSum = 0.0f; + } else { + float minScore = Collections.min(scoreList); + if (minScore == Float.POSITIVE_INFINITY) { + scoreSum = Float.POSITIVE_INFINITY; + } else { + double probabilitySum = 0.0; + for (float score : scoreList) { + double probability = Util.toProbability(score - minScore); + probabilitySum += probability; + } + double probabilityScore = Util.toScore(probabilitySum); + scoreSum = (float)(minScore + probabilityScore); + } + } + return scoreSum; + } + + /** + * Merges a string list into a single string without inserting any extra + * characters between strings. + * + * @param stringList + * @return merged string + */ + public static String merge(List stringList) { + StringBuilder stringBuilder = new StringBuilder(); + for (String string : stringList) { + stringBuilder.append(string); + } + return stringBuilder.toString(); + } + + /** + * Rounds a given number to a given precision places after decimal point. + * + * @param number + * @param precision + * @return Returns rounded number. + */ + public static double round(double number, int precision) { + double cutter = Math.pow(10, precision); + return (double) ((int) (number * cutter)) / cutter; + } + + /** + * Creates a UTF-8 reader from a given input stream. + * @param inputStream + * @return reader + */ + public static BufferedReader getReader(InputStream inputStream) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader( + inputStream, "utf-8")); + return reader; + } catch (UnsupportedEncodingException e) { + throw new IORuntimeException(e); + } + } + + /** + * Creates a UTF-8 writer from given output stream. + * @param outputStream + * @return writer + */ + public static PrintWriter getWriter(OutputStream outputStream) { + try { + return new PrintWriter(new OutputStreamWriter((outputStream), + "utf-8"), true); + } catch (UnsupportedEncodingException e) { + throw new IORuntimeException(e); + } + } + + /** + * Opens a file with given name for reading. + * @param fileName + * @return file input stream + */ + public static FileInputStream getFileInputStream(String fileName) { + try { + return new FileInputStream(fileName); + } catch (FileNotFoundException e) { + throw new IORuntimeException(e); + } + } + + /** + * Opens a file with given name for writing. + * @param fileName + * @return file output stream + */ + public static FileOutputStream getFileOutputStream(String fileName) { + try { + return new FileOutputStream(fileName); + } catch (FileNotFoundException e) { + throw new IORuntimeException(e); + } + } + + /** + * Finds a resource using class loader and opens it for reading. + * + * @param name resource name + * @return resource input stream + * @throws ResourceNotFoundException when resource could not be found + */ + public static InputStream getResourceStream(String name) { + InputStream inputStream = Util.class.getClassLoader() + .getResourceAsStream(name); + if (inputStream == null) { + throw new ResourceNotFoundException(name); + } + return inputStream; + } + + /** + * Reads all reader content into a string. + * Uses {@link #copyAll(Reader, Writer)}. + * + * @param reader input reader + * @return string + * @throws IORuntimeException when IO error occurs + */ + public static String readAll(Reader reader) { + StringWriter writer = new StringWriter(); + copyAll(reader, writer); + return writer.toString(); + } + + /** + * Copies all the content of given reader to given writer. Uses internal + * {@value #READ_BUFFER_SIZE} byte buffer to speed up the operation. + * @param reader + * @param writer + * @throws IORuntimeException when error occurs + */ + public static void copyAll(Reader reader, Writer writer) { + try { + char[] readBuffer = new char[READ_BUFFER_SIZE]; + int count; + while ((count = reader.read(readBuffer)) != -1) { + writer.write(readBuffer, 0, count); + } + } catch (IOException e) { + throw new IORuntimeException(e); + } + } + +} diff --git a/src/net/sourceforge/align/util/UtilTest.java b/src/net/sourceforge/align/util/UtilTest.java new file mode 100755 index 0000000..8baa244 --- /dev/null +++ b/src/net/sourceforge/align/util/UtilTest.java @@ -0,0 +1,106 @@ +package net.sourceforge.align.util; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.sourceforge.align.coretypes.Alignment; + +import org.junit.Test; + +/** + * Represents utility methods test. + * + * @author loomchild + */ +public class UtilTest { + + @Test + public void alignManyToZero() { + List alignmentList = Util.alignManyToZero( + Arrays.asList(new String[]{"a", "b"})); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + Util.assertAlignmentEquals(new String[]{"a", "b"}, new String[]{}, + alignment); + } + + @Test + public void alignZeroToMany() { + List alignmentList = Util.alignZeroToMany( + Arrays.asList(new String[]{"a", "b"})); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + Util.assertAlignmentEquals(new String[]{}, new String[]{"a", "b"}, + alignment); + } + + @Test + public void alignManyToMany() { + List alignmentList = Util.alignManyToMany( + Arrays.asList(new String[]{"a", "b"}), + Arrays.asList(new String[]{"c", "d", "e"})); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + Util.assertAlignmentEquals(new String[]{"a","b"}, + new String[]{"c", "d", "e"}, alignment); + } + + @Test + public void assertAlignmentEquals() { + Alignment alignment = new Alignment( + Arrays.asList(new String[]{"a", "b"}), + Arrays.asList(new String[]{"c"}), 0.5f); + Util.assertAlignmentEquals(new String[]{"a", "b"}, new String[]{"c"}, + alignment); + try { + Util.assertAlignmentEquals(new String[]{"a", "b"}, new String[]{"d"}, + alignment); + } catch (AssertionError e) { + } + } + + public static final float[][] PROBABILITY_ARRAY = new float[][] { + new float[] {0.1f, }, + new float[] {0.1f, 0.3f,}, + new float[] {0.1f, 0.3f, 0.2f, }, + }; + + @Test + public void testScoreSum() { + List emptyScoreList = Collections.emptyList(); + assertEquals(0.0f, Util.scoreSum(emptyScoreList), 0.00001f); + for (int i = 0; i < PROBABILITY_ARRAY.length; ++i) { + float[] probabilityArray = PROBABILITY_ARRAY[i]; + float expectedProbability = sum(probabilityArray); + float expectedScore = (float)Util.toScore(expectedProbability); + List scoreList = toScore(probabilityArray); + float actualScore = Util.scoreSum(scoreList); + float actualProbability = (float)Util.toProbability(actualScore); + assertEquals("Array " + i, expectedProbability, actualProbability, + 0.00001f); + assertEquals("Array " + i, expectedScore, actualScore, 0.00001f); + } + } + + private float sum(float[] array) { + float sum = 0; + for (float element : array) { + sum += element; + } + return sum; + } + + private List toScore(float[] probabilityArray) { + List scoreList = new ArrayList(probabilityArray.length); + for (float probability : probabilityArray) { + float score = (float)Util.toScore(probability); + scoreList.add(score); + } + return scoreList; + } + +} diff --git a/src/net/sourceforge/align/util/UtilTestSuite.java b/src/net/sourceforge/align/util/UtilTestSuite.java new file mode 100755 index 0000000..228466a --- /dev/null +++ b/src/net/sourceforge/align/util/UtilTestSuite.java @@ -0,0 +1,16 @@ +package net.sourceforge.align.util; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Test suite containing all unit tests in util package. + * @author loomchild + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + UtilTest.class + }) +public class UtilTestSuite { + +} diff --git a/src/net/sourceforge/align/util/Version.java b/src/net/sourceforge/align/util/Version.java new file mode 100755 index 0000000..d0cb3bb --- /dev/null +++ b/src/net/sourceforge/align/util/Version.java @@ -0,0 +1,89 @@ +package net.sourceforge.align.util; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.jar.Manifest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Retrieves program version and build date from META-INF/MANIFEST.MF file + * stored in a JAR. Singleton. + * @author loomchild + */ +public class Version { + + private static final Log log = LogFactory.getLog(Version.class); + + public static final String VERSION_ATTRIBUTE = "Implementation-Version"; + public static final String DATE_ATTRIBUTE = "Build-Date"; + + private static final String MANIFEST_PATH = "/META-INF/MANIFEST.MF"; + + private static Version instance = new Version(); + + private String version; + + private String date; + + public static Version getInstance() { + return instance; + } + + private Version() { + try { + Manifest manifest = getJarManifest(Version.class); + version = manifest.getMainAttributes().getValue(VERSION_ATTRIBUTE); + date = manifest.getMainAttributes().getValue(DATE_ATTRIBUTE); + } catch (ResourceNotFoundException e) { + // Ignore, attributes stay null + log.debug("Version number cannot be retrieved."); + } + } + + public String getVersion() { + return version; + } + + public String getDate() { + return date; + } + + /** + * Returns Manifest of a jar containing given class. If class is not + * in a jar, throws {@link ResourceNotFoundException}. + * @param klass Class. + * @return Manifest. + * @throws ResourceNotFoundException Thrown if manifest was not found. + */ + private Manifest getJarManifest(Class klass) { + URL classUrl = klass.getResource(klass.getSimpleName() + ".class"); + if (classUrl == null) { + throw new IllegalArgumentException("Class not found: " + + klass.getName() + "."); + } + String classPath = classUrl.toString(); + int jarIndex = classPath.indexOf('!'); + if (jarIndex != -1) { + String manifestPath = + classPath.substring(0, jarIndex + 1) + MANIFEST_PATH; + try { + URL manifestUrl = new URL(manifestPath); + InputStream manifestStream = manifestUrl.openStream(); + Manifest manifest = new Manifest(manifestStream); + return manifest; + } + catch (IOException e) { + throw new ResourceNotFoundException( + "IO Error retrieving manifest.", e); + } + } + else { + throw new ResourceNotFoundException( + "Class is not in a JAR archive " + klass.getName() + "."); + } + } + +} diff --git a/src/net/sourceforge/align/util/bind/.svn/all-wcprops b/src/net/sourceforge/align/util/bind/.svn/all-wcprops new file mode 100644 index 0000000..db20065 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/.svn/all-wcprops @@ -0,0 +1,35 @@ +K 25 +svn:wc:ra_dav:version-url +V 76 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/bind +END +MarshallerUnmarshaller.java +K 25 +svn:wc:ra_dav:version-url +V 104 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/bind/MarshallerUnmarshaller.java +END +TmxMarshallerUnmarshaller.java +K 25 +svn:wc:ra_dav:version-url +V 107 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/bind/TmxMarshallerUnmarshaller.java +END +QuietValidationEventHandler.java +K 25 +svn:wc:ra_dav:version-url +V 109 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/bind/QuietValidationEventHandler.java +END +AlMarshallerUnmarshaller.java +K 25 +svn:wc:ra_dav:version-url +V 106 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/bind/AlMarshallerUnmarshaller.java +END +BindException.java +K 25 +svn:wc:ra_dav:version-url +V 95 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/bind/BindException.java +END diff --git a/src/net/sourceforge/align/util/bind/.svn/entries b/src/net/sourceforge/align/util/bind/.svn/entries new file mode 100644 index 0000000..ce3992d --- /dev/null +++ b/src/net/sourceforge/align/util/bind/.svn/entries @@ -0,0 +1,204 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/util/bind +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-02T23:37:42.328942Z +42 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +AlMarshallerUnmarshaller.java +file + + + + +2010-10-19T20:17:57.000000Z +337fc5af69263e95bed7c087aa77b926 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1300 + +BindException.java +file + + + + +2010-10-19T20:12:54.000000Z +6bab471099fbf0a4c42dab10a9f1ad29 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +470 + +MarshallerUnmarshaller.java +file + + + + +2010-10-19T20:12:17.000000Z +2094dd5a66a9319c84becfaa31749001 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +2548 + +QuietValidationEventHandler.java +file + + + + +2010-10-19T20:14:14.000000Z +bf13c0283a26a77cd731b5e61d53d05d +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +965 + +TmxMarshallerUnmarshaller.java +file + + + + +2010-10-19T20:17:35.000000Z +ec8bc8abff88d93564e75ff65cbe2a31 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1449 + +al +dir + +tmx +dir + diff --git a/src/net/sourceforge/align/util/bind/.svn/text-base/AlMarshallerUnmarshaller.java.svn-base b/src/net/sourceforge/align/util/bind/.svn/text-base/AlMarshallerUnmarshaller.java.svn-base new file mode 100644 index 0000000..7686e96 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/.svn/text-base/AlMarshallerUnmarshaller.java.svn-base @@ -0,0 +1,51 @@ +package net.sourceforge.align.util.bind; + +import java.io.Reader; +import java.io.Writer; + +import net.sourceforge.align.util.bind.al.Alignmentlist; + +/** + * Represents XML marshaller / unmarshaller of .al native format. + * Uses {@link MarshallerUnmarshaller}. Singleton. + * + * @author loomchild + */ +public class AlMarshallerUnmarshaller { + + public static final String CONTEXT = "net.sourceforge.align.util.bind.al"; + + public static final String SCHEMA = "net/sourceforge/align/res/xml/al.xsd"; + + private static volatile AlMarshallerUnmarshaller instance; + + private MarshallerUnmarshaller marshallerUnmarshaller; + + /** + * @return singleton instance + */ + public static AlMarshallerUnmarshaller getInstance() { + if (instance == null) { + synchronized (AlMarshallerUnmarshaller.class) { + if (instance == null) { + instance = new AlMarshallerUnmarshaller(); + } + } + } + return instance; + } + + private AlMarshallerUnmarshaller() { + this.marshallerUnmarshaller = new MarshallerUnmarshaller(CONTEXT, + SCHEMA); + } + + public void marshal(Alignmentlist al, Writer writer) { + marshallerUnmarshaller.marshal(al, writer); + } + + public Alignmentlist unmarshal(Reader reader) { + return (Alignmentlist)marshallerUnmarshaller.unmarshal(reader); + } + +} diff --git a/src/net/sourceforge/align/util/bind/.svn/text-base/BindException.java.svn-base b/src/net/sourceforge/align/util/bind/.svn/text-base/BindException.java.svn-base new file mode 100644 index 0000000..3c08c12 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/.svn/text-base/BindException.java.svn-base @@ -0,0 +1,24 @@ +package net.sourceforge.align.util.bind; + +/** + * Represents JAXB parse / format exception. + * + * @author Jarek Lipski (loomchild) + */ +public class BindException extends RuntimeException { + + private static final long serialVersionUID = 4729174015756939625L; + + public BindException(String message) { + super(message); + } + + public BindException(String message, Throwable cause) { + super(message, cause); + } + + public BindException(Throwable cause) { + super(cause); + } + +} diff --git a/src/net/sourceforge/align/util/bind/.svn/text-base/MarshallerUnmarshaller.java.svn-base b/src/net/sourceforge/align/util/bind/.svn/text-base/MarshallerUnmarshaller.java.svn-base new file mode 100644 index 0000000..bc1b842 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/.svn/text-base/MarshallerUnmarshaller.java.svn-base @@ -0,0 +1,86 @@ +package net.sourceforge.align.util.bind; + +import static net.sourceforge.align.util.Util.getResourceStream; + +import java.io.InputStream; +import java.io.Reader; +import java.io.Writer; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.XMLConstants; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; + +import net.sourceforge.align.util.ResourceNotFoundException; + +import org.xml.sax.SAXException; + +/** + * Represents configurable, validating XML marshaller / unmarshaller. + * Implemented using JAXB technology. + * + * @author loomchild + */ +public class MarshallerUnmarshaller { + + private Marshaller marshaller; + + private Unmarshaller unmarshaller; + + public MarshallerUnmarshaller(String context, + String[] schemaNameArray) { + try { + List sourceList = new ArrayList(); + for (String schemaName : schemaNameArray) { + InputStream schemaStream = getResourceStream(schemaName); + sourceList.add(new StreamSource(schemaStream)); + } + SchemaFactory schemaFactory = SchemaFactory.newInstance( + XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = + schemaFactory.newSchema(sourceList.toArray(new Source[]{})); + JAXBContext jaxbcontext = JAXBContext.newInstance(context); + unmarshaller = jaxbcontext.createUnmarshaller(); + unmarshaller.setSchema(schema); + unmarshaller.setEventHandler(new QuietValidationEventHandler()); + marshaller = jaxbcontext.createMarshaller(); + marshaller.setSchema(schema); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + } catch (JAXBException e) { + throw new BindException("JAXB error", e); + } catch (SAXException e) { + throw new BindException("Error parsing XML Schema", e); + } catch (ResourceNotFoundException e) { + throw new BindException("Resource not found", e); + } + } + + public MarshallerUnmarshaller(String context, String schemaName) { + this(context, new String[] {schemaName}); + } + + public void marshal(Object object, Writer writer) { + try { + marshaller.marshal(object, writer); + } catch (JAXBException e) { + throw new BindException("JAXB marshalling error", e); + } + } + + public Object unmarshal(Reader reader) { + try { + return unmarshaller.unmarshal(reader); + } catch (JAXBException e) { + throw new BindException("JAXB unmarshalling error", e); + } + } + + +} diff --git a/src/net/sourceforge/align/util/bind/.svn/text-base/QuietValidationEventHandler.java.svn-base b/src/net/sourceforge/align/util/bind/.svn/text-base/QuietValidationEventHandler.java.svn-base new file mode 100644 index 0000000..9649bcb --- /dev/null +++ b/src/net/sourceforge/align/util/bind/.svn/text-base/QuietValidationEventHandler.java.svn-base @@ -0,0 +1,33 @@ +package net.sourceforge.align.util.bind; + +import javax.xml.bind.ValidationEvent; +import javax.xml.bind.ValidationEventHandler; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + +/** + * XML validation event handler. On fatal error or error fails the valiadation. + * Warnings are logged on DEBUG level. + * + * @author loomchild + */ +public class QuietValidationEventHandler implements ValidationEventHandler { + + private static Log log = LogFactory.getLog(QuietValidationEventHandler.class); + + public boolean handleEvent(ValidationEvent event) { + if ((event.getSeverity() == ValidationEvent.FATAL_ERROR) || + (event.getSeverity() == ValidationEvent.ERROR)) { + return false; + } else if (event.getSeverity() == ValidationEvent.WARNING) { + log.debug("Validation warning: " + event.getMessage()); + return true; + } else { + log.fatal("Unknown validation event severity: " + event.getSeverity()); + return false; + } + } + +} diff --git a/src/net/sourceforge/align/util/bind/.svn/text-base/TmxMarshallerUnmarshaller.java.svn-base b/src/net/sourceforge/align/util/bind/.svn/text-base/TmxMarshallerUnmarshaller.java.svn-base new file mode 100644 index 0000000..96c1145 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/.svn/text-base/TmxMarshallerUnmarshaller.java.svn-base @@ -0,0 +1,57 @@ +package net.sourceforge.align.util.bind; + +import java.io.Reader; +import java.io.Writer; + +import net.sourceforge.align.util.bind.tmx.Tmx; + +/** + * Represents XML marshaller / unmarshaller of .tmx format. + * Uses {@link MarshallerUnmarshaller}. Singleton. + * + * @author loomchild + */ +public class TmxMarshallerUnmarshaller { + + public static final String CONTEXT = "net.sourceforge.align.util.bind.tmx"; + + /** + * List of XML schemas used for validation. + * Order of appearance on this array is important! + */ + public static final String[] SCHEMA_ARRAY = new String[] { + "net/sourceforge/align/res/xml/xml.xsd", "net/sourceforge/align/res/xml/tmx.xsd" + }; + + private static volatile TmxMarshallerUnmarshaller instance; + + private MarshallerUnmarshaller marshallerUnmarshaller; + + /** + * @return singleton instance + */ + public static TmxMarshallerUnmarshaller getInstance() { + if (instance == null) { + synchronized (TmxMarshallerUnmarshaller.class) { + if (instance == null) { + instance = new TmxMarshallerUnmarshaller(); + } + } + } + return instance; + } + + private TmxMarshallerUnmarshaller() { + this.marshallerUnmarshaller = new MarshallerUnmarshaller(CONTEXT, + SCHEMA_ARRAY); + } + + public void marshal(Tmx tmx, Writer writer) { + marshallerUnmarshaller.marshal(tmx, writer); + } + + public Tmx unmarshal(Reader reader) { + return (Tmx)marshallerUnmarshaller.unmarshal(reader); + } + +} diff --git a/src/net/sourceforge/align/util/bind/AlMarshallerUnmarshaller.java b/src/net/sourceforge/align/util/bind/AlMarshallerUnmarshaller.java new file mode 100755 index 0000000..7686e96 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/AlMarshallerUnmarshaller.java @@ -0,0 +1,51 @@ +package net.sourceforge.align.util.bind; + +import java.io.Reader; +import java.io.Writer; + +import net.sourceforge.align.util.bind.al.Alignmentlist; + +/** + * Represents XML marshaller / unmarshaller of .al native format. + * Uses {@link MarshallerUnmarshaller}. Singleton. + * + * @author loomchild + */ +public class AlMarshallerUnmarshaller { + + public static final String CONTEXT = "net.sourceforge.align.util.bind.al"; + + public static final String SCHEMA = "net/sourceforge/align/res/xml/al.xsd"; + + private static volatile AlMarshallerUnmarshaller instance; + + private MarshallerUnmarshaller marshallerUnmarshaller; + + /** + * @return singleton instance + */ + public static AlMarshallerUnmarshaller getInstance() { + if (instance == null) { + synchronized (AlMarshallerUnmarshaller.class) { + if (instance == null) { + instance = new AlMarshallerUnmarshaller(); + } + } + } + return instance; + } + + private AlMarshallerUnmarshaller() { + this.marshallerUnmarshaller = new MarshallerUnmarshaller(CONTEXT, + SCHEMA); + } + + public void marshal(Alignmentlist al, Writer writer) { + marshallerUnmarshaller.marshal(al, writer); + } + + public Alignmentlist unmarshal(Reader reader) { + return (Alignmentlist)marshallerUnmarshaller.unmarshal(reader); + } + +} diff --git a/src/net/sourceforge/align/util/bind/BindException.java b/src/net/sourceforge/align/util/bind/BindException.java new file mode 100755 index 0000000..3c08c12 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/BindException.java @@ -0,0 +1,24 @@ +package net.sourceforge.align.util.bind; + +/** + * Represents JAXB parse / format exception. + * + * @author Jarek Lipski (loomchild) + */ +public class BindException extends RuntimeException { + + private static final long serialVersionUID = 4729174015756939625L; + + public BindException(String message) { + super(message); + } + + public BindException(String message, Throwable cause) { + super(message, cause); + } + + public BindException(Throwable cause) { + super(cause); + } + +} diff --git a/src/net/sourceforge/align/util/bind/MarshallerUnmarshaller.java b/src/net/sourceforge/align/util/bind/MarshallerUnmarshaller.java new file mode 100755 index 0000000..bc1b842 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/MarshallerUnmarshaller.java @@ -0,0 +1,86 @@ +package net.sourceforge.align.util.bind; + +import static net.sourceforge.align.util.Util.getResourceStream; + +import java.io.InputStream; +import java.io.Reader; +import java.io.Writer; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.XMLConstants; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; + +import net.sourceforge.align.util.ResourceNotFoundException; + +import org.xml.sax.SAXException; + +/** + * Represents configurable, validating XML marshaller / unmarshaller. + * Implemented using JAXB technology. + * + * @author loomchild + */ +public class MarshallerUnmarshaller { + + private Marshaller marshaller; + + private Unmarshaller unmarshaller; + + public MarshallerUnmarshaller(String context, + String[] schemaNameArray) { + try { + List sourceList = new ArrayList(); + for (String schemaName : schemaNameArray) { + InputStream schemaStream = getResourceStream(schemaName); + sourceList.add(new StreamSource(schemaStream)); + } + SchemaFactory schemaFactory = SchemaFactory.newInstance( + XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = + schemaFactory.newSchema(sourceList.toArray(new Source[]{})); + JAXBContext jaxbcontext = JAXBContext.newInstance(context); + unmarshaller = jaxbcontext.createUnmarshaller(); + unmarshaller.setSchema(schema); + unmarshaller.setEventHandler(new QuietValidationEventHandler()); + marshaller = jaxbcontext.createMarshaller(); + marshaller.setSchema(schema); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + } catch (JAXBException e) { + throw new BindException("JAXB error", e); + } catch (SAXException e) { + throw new BindException("Error parsing XML Schema", e); + } catch (ResourceNotFoundException e) { + throw new BindException("Resource not found", e); + } + } + + public MarshallerUnmarshaller(String context, String schemaName) { + this(context, new String[] {schemaName}); + } + + public void marshal(Object object, Writer writer) { + try { + marshaller.marshal(object, writer); + } catch (JAXBException e) { + throw new BindException("JAXB marshalling error", e); + } + } + + public Object unmarshal(Reader reader) { + try { + return unmarshaller.unmarshal(reader); + } catch (JAXBException e) { + throw new BindException("JAXB unmarshalling error", e); + } + } + + +} diff --git a/src/net/sourceforge/align/util/bind/QuietValidationEventHandler.java b/src/net/sourceforge/align/util/bind/QuietValidationEventHandler.java new file mode 100755 index 0000000..9649bcb --- /dev/null +++ b/src/net/sourceforge/align/util/bind/QuietValidationEventHandler.java @@ -0,0 +1,33 @@ +package net.sourceforge.align.util.bind; + +import javax.xml.bind.ValidationEvent; +import javax.xml.bind.ValidationEventHandler; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + +/** + * XML validation event handler. On fatal error or error fails the valiadation. + * Warnings are logged on DEBUG level. + * + * @author loomchild + */ +public class QuietValidationEventHandler implements ValidationEventHandler { + + private static Log log = LogFactory.getLog(QuietValidationEventHandler.class); + + public boolean handleEvent(ValidationEvent event) { + if ((event.getSeverity() == ValidationEvent.FATAL_ERROR) || + (event.getSeverity() == ValidationEvent.ERROR)) { + return false; + } else if (event.getSeverity() == ValidationEvent.WARNING) { + log.debug("Validation warning: " + event.getMessage()); + return true; + } else { + log.fatal("Unknown validation event severity: " + event.getSeverity()); + return false; + } + } + +} diff --git a/src/net/sourceforge/align/util/bind/TmxMarshallerUnmarshaller.java b/src/net/sourceforge/align/util/bind/TmxMarshallerUnmarshaller.java new file mode 100755 index 0000000..96c1145 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/TmxMarshallerUnmarshaller.java @@ -0,0 +1,57 @@ +package net.sourceforge.align.util.bind; + +import java.io.Reader; +import java.io.Writer; + +import net.sourceforge.align.util.bind.tmx.Tmx; + +/** + * Represents XML marshaller / unmarshaller of .tmx format. + * Uses {@link MarshallerUnmarshaller}. Singleton. + * + * @author loomchild + */ +public class TmxMarshallerUnmarshaller { + + public static final String CONTEXT = "net.sourceforge.align.util.bind.tmx"; + + /** + * List of XML schemas used for validation. + * Order of appearance on this array is important! + */ + public static final String[] SCHEMA_ARRAY = new String[] { + "net/sourceforge/align/res/xml/xml.xsd", "net/sourceforge/align/res/xml/tmx.xsd" + }; + + private static volatile TmxMarshallerUnmarshaller instance; + + private MarshallerUnmarshaller marshallerUnmarshaller; + + /** + * @return singleton instance + */ + public static TmxMarshallerUnmarshaller getInstance() { + if (instance == null) { + synchronized (TmxMarshallerUnmarshaller.class) { + if (instance == null) { + instance = new TmxMarshallerUnmarshaller(); + } + } + } + return instance; + } + + private TmxMarshallerUnmarshaller() { + this.marshallerUnmarshaller = new MarshallerUnmarshaller(CONTEXT, + SCHEMA_ARRAY); + } + + public void marshal(Tmx tmx, Writer writer) { + marshallerUnmarshaller.marshal(tmx, writer); + } + + public Tmx unmarshal(Reader reader) { + return (Tmx)marshallerUnmarshaller.unmarshal(reader); + } + +} diff --git a/src/net/sourceforge/align/util/bind/al/.svn/all-wcprops b/src/net/sourceforge/align/util/bind/al/.svn/all-wcprops new file mode 100644 index 0000000..abc417a --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 79 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/al +END +ObjectFactory.java +K 25 +svn:wc:ra_dav:version-url +V 98 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/util/bind/al/ObjectFactory.java +END +Alignment.java +K 25 +svn:wc:ra_dav:version-url +V 94 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/util/bind/al/Alignment.java +END +Alignmentlist.java +K 25 +svn:wc:ra_dav:version-url +V 98 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/al/Alignmentlist.java +END +Segmentlist.java +K 25 +svn:wc:ra_dav:version-url +V 96 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/al/Segmentlist.java +END diff --git a/src/net/sourceforge/align/util/bind/al/.svn/entries b/src/net/sourceforge/align/util/bind/al/.svn/entries new file mode 100644 index 0000000..38f5f4b --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/.svn/entries @@ -0,0 +1,76 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/util/bind/al +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Alignment.java +file + + + + +2008-08-20T21:15:17.000000Z +6b89c4c96910836909d4ee303b285450 +2008-04-24T08:23:10.479977Z +11 +jarekl + +Alignmentlist.java +file + + + + +2008-08-20T22:03:22.000000Z +729d9e54e5d6a46190588b7c5c17d417 +2008-08-20T23:12:34.302965Z +16 +jarekl + +ObjectFactory.java +file + + + + +2008-08-20T21:15:17.000000Z +61cfef515b247f092f061e3f8c5016a8 +2008-04-24T08:23:10.479977Z +11 +jarekl + +Segmentlist.java +file + + + + +2008-08-20T22:03:23.000000Z +348b66a065f585762a3038182dcab37b +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/src/net/sourceforge/align/util/bind/al/.svn/text-base/Alignment.java.svn-base b/src/net/sourceforge/align/util/bind/al/.svn/text-base/Alignment.java.svn-base new file mode 100755 index 0000000..b4e1f56 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/.svn/text-base/Alignment.java.svn-base @@ -0,0 +1,126 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:14:49 PM CEST +// + + +package net.sourceforge.align.util.bind.al; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <all>
+ *         <element ref="{}sourcelist"/>
+ *         <element ref="{}targetlist"/>
+ *       </all>
+ *       <attribute ref="{}score"/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + +}) +@XmlRootElement(name = "alignment") +public class Alignment { + + @XmlElement(required = true) + protected Segmentlist sourcelist; + @XmlElement(required = true) + protected Segmentlist targetlist; + @XmlAttribute + protected Double score; + + /** + * Gets the value of the sourcelist property. + * + * @return + * possible object is + * {@link Segmentlist } + * + */ + public Segmentlist getSourcelist() { + return sourcelist; + } + + /** + * Sets the value of the sourcelist property. + * + * @param value + * allowed object is + * {@link Segmentlist } + * + */ + public void setSourcelist(Segmentlist value) { + this.sourcelist = value; + } + + /** + * Gets the value of the targetlist property. + * + * @return + * possible object is + * {@link Segmentlist } + * + */ + public Segmentlist getTargetlist() { + return targetlist; + } + + /** + * Sets the value of the targetlist property. + * + * @param value + * allowed object is + * {@link Segmentlist } + * + */ + public void setTargetlist(Segmentlist value) { + this.targetlist = value; + } + + /** + * Gets the value of the score property. + * + * @return + * possible object is + * {@link Double } + * + */ + public Double getScore() { + return score; + } + + /** + * Sets the value of the score property. + * + * @param value + * allowed object is + * {@link Double } + * + */ + public void setScore(Double value) { + this.score = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/al/.svn/text-base/Alignmentlist.java.svn-base b/src/net/sourceforge/align/util/bind/al/.svn/text-base/Alignmentlist.java.svn-base new file mode 100755 index 0000000..fa49c02 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/.svn/text-base/Alignmentlist.java.svn-base @@ -0,0 +1,77 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:14:49 PM CEST +// + + +package net.sourceforge.align.util.bind.al; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}alignment" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "alignment" +}) +@XmlRootElement(name = "alignmentlist") +public class Alignmentlist { + + protected List alignment; + + /** + * Gets the value of the alignment property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the alignment property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getAlignment().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Alignment } + * + * + */ + public List getAlignment() { + if (alignment == null) { + alignment = new ArrayList(); + } + return this.alignment; + } + +} diff --git a/src/net/sourceforge/align/util/bind/al/.svn/text-base/ObjectFactory.java.svn-base b/src/net/sourceforge/align/util/bind/al/.svn/text-base/ObjectFactory.java.svn-base new file mode 100755 index 0000000..8a62e7b --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/.svn/text-base/ObjectFactory.java.svn-base @@ -0,0 +1,96 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:14:49 PM CEST +// + + +package net.sourceforge.align.util.bind.al; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlElementDecl; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the align.util.bind.al package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _Sourcelist_QNAME = new QName("", "sourcelist"); + private final static QName _Segment_QNAME = new QName("", "segment"); + private final static QName _Targetlist_QNAME = new QName("", "targetlist"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: align.util.bind.al + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Alignmentlist } + * + */ + public Alignmentlist createAlignmentlist() { + return new Alignmentlist(); + } + + /** + * Create an instance of {@link Segmentlist } + * + */ + public Segmentlist createSegmentlist() { + return new Segmentlist(); + } + + /** + * Create an instance of {@link Alignment } + * + */ + public Alignment createAlignment() { + return new Alignment(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Segmentlist }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "sourcelist") + public JAXBElement createSourcelist(Segmentlist value) { + return new JAXBElement(_Sourcelist_QNAME, Segmentlist.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "segment") + public JAXBElement createSegment(String value) { + return new JAXBElement(_Segment_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Segmentlist }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "targetlist") + public JAXBElement createTargetlist(Segmentlist value) { + return new JAXBElement(_Targetlist_QNAME, Segmentlist.class, null, value); + } + +} diff --git a/src/net/sourceforge/align/util/bind/al/.svn/text-base/Segmentlist.java.svn-base b/src/net/sourceforge/align/util/bind/al/.svn/text-base/Segmentlist.java.svn-base new file mode 100755 index 0000000..877b2e5 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/.svn/text-base/Segmentlist.java.svn-base @@ -0,0 +1,75 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:14:49 PM CEST +// + + +package net.sourceforge.align.util.bind.al; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for segmentlist complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="segmentlist">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}segment" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "segmentlist", propOrder = { + "segment" +}) +public class Segmentlist { + + protected List segment; + + /** + * Gets the value of the segment property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the segment property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getSegment().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public List getSegment() { + if (segment == null) { + segment = new ArrayList(); + } + return this.segment; + } + +} diff --git a/src/net/sourceforge/align/util/bind/al/Alignment.java b/src/net/sourceforge/align/util/bind/al/Alignment.java new file mode 100755 index 0000000..b4e1f56 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/Alignment.java @@ -0,0 +1,126 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:14:49 PM CEST +// + + +package net.sourceforge.align.util.bind.al; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <all>
+ *         <element ref="{}sourcelist"/>
+ *         <element ref="{}targetlist"/>
+ *       </all>
+ *       <attribute ref="{}score"/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + +}) +@XmlRootElement(name = "alignment") +public class Alignment { + + @XmlElement(required = true) + protected Segmentlist sourcelist; + @XmlElement(required = true) + protected Segmentlist targetlist; + @XmlAttribute + protected Double score; + + /** + * Gets the value of the sourcelist property. + * + * @return + * possible object is + * {@link Segmentlist } + * + */ + public Segmentlist getSourcelist() { + return sourcelist; + } + + /** + * Sets the value of the sourcelist property. + * + * @param value + * allowed object is + * {@link Segmentlist } + * + */ + public void setSourcelist(Segmentlist value) { + this.sourcelist = value; + } + + /** + * Gets the value of the targetlist property. + * + * @return + * possible object is + * {@link Segmentlist } + * + */ + public Segmentlist getTargetlist() { + return targetlist; + } + + /** + * Sets the value of the targetlist property. + * + * @param value + * allowed object is + * {@link Segmentlist } + * + */ + public void setTargetlist(Segmentlist value) { + this.targetlist = value; + } + + /** + * Gets the value of the score property. + * + * @return + * possible object is + * {@link Double } + * + */ + public Double getScore() { + return score; + } + + /** + * Sets the value of the score property. + * + * @param value + * allowed object is + * {@link Double } + * + */ + public void setScore(Double value) { + this.score = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/al/Alignmentlist.java b/src/net/sourceforge/align/util/bind/al/Alignmentlist.java new file mode 100755 index 0000000..fa49c02 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/Alignmentlist.java @@ -0,0 +1,77 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:14:49 PM CEST +// + + +package net.sourceforge.align.util.bind.al; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}alignment" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "alignment" +}) +@XmlRootElement(name = "alignmentlist") +public class Alignmentlist { + + protected List alignment; + + /** + * Gets the value of the alignment property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the alignment property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getAlignment().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Alignment } + * + * + */ + public List getAlignment() { + if (alignment == null) { + alignment = new ArrayList(); + } + return this.alignment; + } + +} diff --git a/src/net/sourceforge/align/util/bind/al/ObjectFactory.java b/src/net/sourceforge/align/util/bind/al/ObjectFactory.java new file mode 100755 index 0000000..8a62e7b --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/ObjectFactory.java @@ -0,0 +1,96 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:14:49 PM CEST +// + + +package net.sourceforge.align.util.bind.al; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlElementDecl; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the align.util.bind.al package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _Sourcelist_QNAME = new QName("", "sourcelist"); + private final static QName _Segment_QNAME = new QName("", "segment"); + private final static QName _Targetlist_QNAME = new QName("", "targetlist"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: align.util.bind.al + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Alignmentlist } + * + */ + public Alignmentlist createAlignmentlist() { + return new Alignmentlist(); + } + + /** + * Create an instance of {@link Segmentlist } + * + */ + public Segmentlist createSegmentlist() { + return new Segmentlist(); + } + + /** + * Create an instance of {@link Alignment } + * + */ + public Alignment createAlignment() { + return new Alignment(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Segmentlist }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "sourcelist") + public JAXBElement createSourcelist(Segmentlist value) { + return new JAXBElement(_Sourcelist_QNAME, Segmentlist.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "segment") + public JAXBElement createSegment(String value) { + return new JAXBElement(_Segment_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Segmentlist }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "targetlist") + public JAXBElement createTargetlist(Segmentlist value) { + return new JAXBElement(_Targetlist_QNAME, Segmentlist.class, null, value); + } + +} diff --git a/src/net/sourceforge/align/util/bind/al/Segmentlist.java b/src/net/sourceforge/align/util/bind/al/Segmentlist.java new file mode 100755 index 0000000..877b2e5 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/al/Segmentlist.java @@ -0,0 +1,75 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:14:49 PM CEST +// + + +package net.sourceforge.align.util.bind.al; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for segmentlist complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="segmentlist">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}segment" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "segmentlist", propOrder = { + "segment" +}) +public class Segmentlist { + + protected List segment; + + /** + * Gets the value of the segment property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the segment property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getSegment().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public List getSegment() { + if (segment == null) { + segment = new ArrayList(); + } + return this.segment; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/all-wcprops b/src/net/sourceforge/align/util/bind/tmx/.svn/all-wcprops new file mode 100644 index 0000000..bc7f757 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/all-wcprops @@ -0,0 +1,113 @@ +K 25 +svn:wc:ra_dav:version-url +V 80 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx +END +Header.java +K 25 +svn:wc:ra_dav:version-url +V 92 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Header.java +END +It.java +K 25 +svn:wc:ra_dav:version-url +V 88 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/It.java +END +ObjectFactory.java +K 25 +svn:wc:ra_dav:version-url +V 99 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/ObjectFactory.java +END +Ept.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Ept.java +END +Bpt.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Bpt.java +END +Prop.java +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Prop.java +END +Body.java +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Body.java +END +Hi.java +K 25 +svn:wc:ra_dav:version-url +V 88 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Hi.java +END +Tu.java +K 25 +svn:wc:ra_dav:version-url +V 88 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Tu.java +END +Sub.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Sub.java +END +Tmx.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Tmx.java +END +Ut.java +K 25 +svn:wc:ra_dav:version-url +V 88 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Ut.java +END +Map.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/11/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Map.java +END +Ph.java +K 25 +svn:wc:ra_dav:version-url +V 88 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Ph.java +END +Ude.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Ude.java +END +Seg.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Seg.java +END +Tuv.java +K 25 +svn:wc:ra_dav:version-url +V 89 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Tuv.java +END +Note.java +K 25 +svn:wc:ra_dav:version-url +V 90 +/svnroot/align/!svn/ver/16/trunk/maligna/src/net/sourceforge/align/util/bind/tmx/Note.java +END diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/entries b/src/net/sourceforge/align/util/bind/tmx/.svn/entries new file mode 100644 index 0000000..0bc6667 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/entries @@ -0,0 +1,244 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/util/bind/tmx +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Body.java +file + + + + +2008-08-20T22:03:23.000000Z +b58c8df3ba9a40ba135eb19543c95eb2 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Bpt.java +file + + + + +2008-08-20T22:03:22.000000Z +fdd0e1b76aae013ef3e0b35a426c6ffb +2008-08-20T23:12:34.302965Z +16 +jarekl + +Ept.java +file + + + + +2008-08-20T22:03:23.000000Z +7ff328bdccc62d14f725feb6ff142b33 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Header.java +file + + + + +2008-08-20T22:03:23.000000Z +106dd090fbb6fdc5d6480c7e9b0c99a5 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Hi.java +file + + + + +2008-08-20T22:03:23.000000Z +7e979a07bf13808d1bff299f0e4f7f81 +2008-08-20T23:12:34.302965Z +16 +jarekl + +It.java +file + + + + +2008-08-20T22:03:23.000000Z +b9221560d012acd6426436d493cde52b +2008-08-20T23:12:34.302965Z +16 +jarekl + +Map.java +file + + + + +2008-08-20T21:15:15.000000Z +3797e88c7d5c5f877778ac2d1ec2fc79 +2008-04-24T08:23:10.479977Z +11 +jarekl + +Note.java +file + + + + +2008-08-20T22:03:23.000000Z +7daba106d6870aa37b7552c9ba4e08d5 +2008-08-20T23:12:34.302965Z +16 +jarekl + +ObjectFactory.java +file + + + + +2008-08-20T21:15:16.000000Z +dd56c854a0f21dfe8e0b9f1eb54c0c2c +2008-04-24T08:23:10.479977Z +11 +jarekl + +Ph.java +file + + + + +2008-08-20T22:03:22.000000Z +ec1115fb1d86c997125656392b874a85 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Prop.java +file + + + + +2008-08-20T22:03:23.000000Z +ca2d5852792640e12e893a80b20040d9 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Seg.java +file + + + + +2008-08-20T22:03:23.000000Z +9b4f1820ec97d19e9e4dc147615593c8 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Sub.java +file + + + + +2008-08-20T22:03:23.000000Z +d367c79245cc2ad84de4583af816a205 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Tmx.java +file + + + + +2008-08-20T21:15:15.000000Z +5ccd53367eade6a58b240e0ccd2726aa +2008-04-24T08:23:10.479977Z +11 +jarekl + +Tu.java +file + + + + +2008-08-20T22:03:23.000000Z +f06719f615f493dc4b631cb54b23dec8 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Tuv.java +file + + + + +2008-08-20T22:03:22.000000Z +4ef52089704aad689f27a42df81cff40 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Ude.java +file + + + + +2008-08-20T22:03:23.000000Z +56c0c0721ae7a67d68be17617fbe8ff9 +2008-08-20T23:12:34.302965Z +16 +jarekl + +Ut.java +file + + + + +2008-08-20T22:03:23.000000Z +62fd2d4e3c146fa2ef339b6bc21fb7ec +2008-08-20T23:12:34.302965Z +16 +jarekl + diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Body.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Body.java.svn-base new file mode 100755 index 0000000..e796f50 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Body.java.svn-base @@ -0,0 +1,77 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}tu" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "tu" +}) +@XmlRootElement(name = "body") +public class Body { + + protected List tu; + + /** + * Gets the value of the tu property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the tu property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getTu().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Tu } + * + * + */ + public List getTu() { + if (tu == null) { + tu = new ArrayList(); + } + return this.tu; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Bpt.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Bpt.java.svn-base new file mode 100755 index 0000000..18e5d46 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Bpt.java.svn-base @@ -0,0 +1,164 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="i" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "bpt") +public class Bpt { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute(required = true) + protected String i; + @XmlAttribute + protected String type; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the i property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getI() { + return i; + } + + /** + * Sets the value of the i property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setI(String value) { + this.i = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ept.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ept.java.svn-base new file mode 100755 index 0000000..5e1ad0f --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ept.java.svn-base @@ -0,0 +1,110 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="i" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "ept") +public class Ept { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute(required = true) + protected String i; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the i property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getI() { + return i; + } + + /** + * Sets the value of the i property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setI(String value) { + this.i = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Header.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Header.java.svn-base new file mode 100755 index 0000000..220e316 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Header.java.svn-base @@ -0,0 +1,425 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}note"/>
+ *         <element ref="{}prop"/>
+ *         <element ref="{}ude"/>
+ *       </choice>
+ *       <attribute name="adminlang" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="changedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="changeid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationdate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtool" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtoolversion" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="datatype" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-tmf" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="segtype" use="required">
+ *         <simpleType>
+ *           <restriction base="{http://www.w3.org/2001/XMLSchema}NMTOKEN">
+ *             <enumeration value="block"/>
+ *             <enumeration value="paragraph"/>
+ *             <enumeration value="sentence"/>
+ *             <enumeration value="phrase"/>
+ *           </restriction>
+ *         </simpleType>
+ *       </attribute>
+ *       <attribute name="srclang" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "noteOrPropOrUde" +}) +@XmlRootElement(name = "header") +public class Header { + + @XmlElements({ + @XmlElement(name = "note", type = Note.class), + @XmlElement(name = "prop", type = Prop.class), + @XmlElement(name = "ude", type = Ude.class) + }) + protected List noteOrPropOrUde; + @XmlAttribute(required = true) + protected String adminlang; + @XmlAttribute + protected String changedate; + @XmlAttribute + protected String changeid; + @XmlAttribute + protected String creationdate; + @XmlAttribute + protected String creationid; + @XmlAttribute(required = true) + protected String creationtool; + @XmlAttribute(required = true) + protected String creationtoolversion; + @XmlAttribute(required = true) + protected String datatype; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(name = "o-tmf", required = true) + protected String oTmf; + @XmlAttribute(required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String segtype; + @XmlAttribute(required = true) + protected String srclang; + + /** + * Gets the value of the noteOrPropOrUde property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the noteOrPropOrUde property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getNoteOrPropOrUde().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Note } + * {@link Prop } + * {@link Ude } + * + * + */ + public List getNoteOrPropOrUde() { + if (noteOrPropOrUde == null) { + noteOrPropOrUde = new ArrayList(); + } + return this.noteOrPropOrUde; + } + + /** + * Gets the value of the adminlang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAdminlang() { + return adminlang; + } + + /** + * Sets the value of the adminlang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAdminlang(String value) { + this.adminlang = value; + } + + /** + * Gets the value of the changedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangedate() { + return changedate; + } + + /** + * Sets the value of the changedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangedate(String value) { + this.changedate = value; + } + + /** + * Gets the value of the changeid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangeid() { + return changeid; + } + + /** + * Sets the value of the changeid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangeid(String value) { + this.changeid = value; + } + + /** + * Gets the value of the creationdate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationdate() { + return creationdate; + } + + /** + * Sets the value of the creationdate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationdate(String value) { + this.creationdate = value; + } + + /** + * Gets the value of the creationid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationid() { + return creationid; + } + + /** + * Sets the value of the creationid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationid(String value) { + this.creationid = value; + } + + /** + * Gets the value of the creationtool property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtool() { + return creationtool; + } + + /** + * Sets the value of the creationtool property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtool(String value) { + this.creationtool = value; + } + + /** + * Gets the value of the creationtoolversion property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtoolversion() { + return creationtoolversion; + } + + /** + * Sets the value of the creationtoolversion property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtoolversion(String value) { + this.creationtoolversion = value; + } + + /** + * Gets the value of the datatype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDatatype() { + return datatype; + } + + /** + * Sets the value of the datatype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDatatype(String value) { + this.datatype = value; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the oTmf property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOTmf() { + return oTmf; + } + + /** + * Sets the value of the oTmf property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOTmf(String value) { + this.oTmf = value; + } + + /** + * Gets the value of the segtype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSegtype() { + return segtype; + } + + /** + * Sets the value of the segtype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSegtype(String value) { + this.segtype = value; + } + + /** + * Gets the value of the srclang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSrclang() { + return srclang; + } + + /** + * Sets the value of the srclang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSrclang(String value) { + this.srclang = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Hi.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Hi.java.svn-base new file mode 100755 index 0000000..d5b9596 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Hi.java.svn-base @@ -0,0 +1,155 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}hi"/>
+ *         <element ref="{}ut"/>
+ *         <element ref="{}it"/>
+ *         <element ref="{}ept"/>
+ *         <element ref="{}bpt"/>
+ *         <element ref="{}ph"/>
+ *       </choice>
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "hi") +public class Hi { + + @XmlElementRefs({ + @XmlElementRef(name = "ept", type = Ept.class), + @XmlElementRef(name = "ut", type = Ut.class), + @XmlElementRef(name = "it", type = It.class), + @XmlElementRef(name = "bpt", type = Bpt.class), + @XmlElementRef(name = "hi", type = Hi.class), + @XmlElementRef(name = "ph", type = Ph.class) + }) + @XmlMixed + protected List content; + @XmlAttribute + protected String type; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Ept } + * {@link Ut } + * {@link String } + * {@link It } + * {@link Bpt } + * {@link Hi } + * {@link Ph } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/It.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/It.java.svn-base new file mode 100755 index 0000000..3eddd7d --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/It.java.svn-base @@ -0,0 +1,174 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="pos" use="required">
+ *         <simpleType>
+ *           <restriction base="{http://www.w3.org/2001/XMLSchema}NMTOKEN">
+ *             <enumeration value="begin"/>
+ *             <enumeration value="end"/>
+ *           </restriction>
+ *         </simpleType>
+ *       </attribute>
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "it") +public class It { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute(required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String pos; + @XmlAttribute + protected String type; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the pos property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getPos() { + return pos; + } + + /** + * Sets the value of the pos property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setPos(String value) { + this.pos = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Map.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Map.java.svn-base new file mode 100755 index 0000000..2e8bd4a --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Map.java.svn-base @@ -0,0 +1,148 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="code" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="ent" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="subst" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="unicode" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "") +@XmlRootElement(name = "map") +public class Map { + + @XmlAttribute + protected String code; + @XmlAttribute + protected String ent; + @XmlAttribute + protected String subst; + @XmlAttribute(required = true) + protected String unicode; + + /** + * Gets the value of the code property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCode() { + return code; + } + + /** + * Sets the value of the code property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCode(String value) { + this.code = value; + } + + /** + * Gets the value of the ent property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getEnt() { + return ent; + } + + /** + * Sets the value of the ent property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEnt(String value) { + this.ent = value; + } + + /** + * Gets the value of the subst property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSubst() { + return subst; + } + + /** + * Sets the value of the subst property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSubst(String value) { + this.subst = value; + } + + /** + * Gets the value of the unicode property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUnicode() { + return unicode; + } + + /** + * Sets the value of the unicode property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUnicode(String value) { + this.unicode = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Note.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Note.java.svn-base new file mode 100755 index 0000000..7e47935 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Note.java.svn-base @@ -0,0 +1,133 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *       </sequence>
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "note") +public class Note { + + @XmlMixed + protected List content; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") + protected String lang; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the lang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLang() { + return lang; + } + + /** + * Sets the value of the lang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLang(String value) { + this.lang = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/ObjectFactory.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/ObjectFactory.java.svn-base new file mode 100755 index 0000000..353a5b8 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/ObjectFactory.java.svn-base @@ -0,0 +1,175 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import javax.xml.bind.annotation.XmlRegistry; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the align.util.bind.tmx package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: align.util.bind.tmx + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Seg } + * + */ + public Seg createSeg() { + return new Seg(); + } + + /** + * Create an instance of {@link Ept } + * + */ + public Ept createEpt() { + return new Ept(); + } + + /** + * Create an instance of {@link Ut } + * + */ + public Ut createUt() { + return new Ut(); + } + + /** + * Create an instance of {@link Prop } + * + */ + public Prop createProp() { + return new Prop(); + } + + /** + * Create an instance of {@link Ude } + * + */ + public Ude createUde() { + return new Ude(); + } + + /** + * Create an instance of {@link Tu } + * + */ + public Tu createTu() { + return new Tu(); + } + + /** + * Create an instance of {@link Tmx } + * + */ + public Tmx createTmx() { + return new Tmx(); + } + + /** + * Create an instance of {@link Body } + * + */ + public Body createBody() { + return new Body(); + } + + /** + * Create an instance of {@link Header } + * + */ + public Header createHeader() { + return new Header(); + } + + /** + * Create an instance of {@link Note } + * + */ + public Note createNote() { + return new Note(); + } + + /** + * Create an instance of {@link Tuv } + * + */ + public Tuv createTuv() { + return new Tuv(); + } + + /** + * Create an instance of {@link Map } + * + */ + public Map createMap() { + return new Map(); + } + + /** + * Create an instance of {@link Sub } + * + */ + public Sub createSub() { + return new Sub(); + } + + /** + * Create an instance of {@link It } + * + */ + public It createIt() { + return new It(); + } + + /** + * Create an instance of {@link Hi } + * + */ + public Hi createHi() { + return new Hi(); + } + + /** + * Create an instance of {@link Bpt } + * + */ + public Bpt createBpt() { + return new Bpt(); + } + + /** + * Create an instance of {@link Ph } + * + */ + public Ph createPh() { + return new Ph(); + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ph.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ph.java.svn-base new file mode 100755 index 0000000..730db1a --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ph.java.svn-base @@ -0,0 +1,164 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="assoc" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "ph") +public class Ph { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute + protected String assoc; + @XmlAttribute + protected String type; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the assoc property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAssoc() { + return assoc; + } + + /** + * Sets the value of the assoc property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAssoc(String value) { + this.assoc = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Prop.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Prop.java.svn-base new file mode 100755 index 0000000..39527fe --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Prop.java.svn-base @@ -0,0 +1,160 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *       </sequence>
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "prop") +public class Prop { + + @XmlMixed + protected List content; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(required = true) + protected String type; + @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") + protected String lang; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the lang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLang() { + return lang; + } + + /** + * Sets the value of the lang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLang(String value) { + this.lang = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Seg.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Seg.java.svn-base new file mode 100755 index 0000000..ffe3c68 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Seg.java.svn-base @@ -0,0 +1,100 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}hi"/>
+ *         <element ref="{}ut"/>
+ *         <element ref="{}ph"/>
+ *         <element ref="{}ept"/>
+ *         <element ref="{}bpt"/>
+ *         <element ref="{}it"/>
+ *       </choice>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "seg") +public class Seg { + + @XmlElementRefs({ + @XmlElementRef(name = "ept", type = Ept.class), + @XmlElementRef(name = "ut", type = Ut.class), + @XmlElementRef(name = "it", type = It.class), + @XmlElementRef(name = "hi", type = Hi.class), + @XmlElementRef(name = "bpt", type = Bpt.class), + @XmlElementRef(name = "ph", type = Ph.class) + }) + @XmlMixed + protected List content; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Ept } + * {@link Ut } + * {@link String } + * {@link It } + * {@link Hi } + * {@link Bpt } + * {@link Ph } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Sub.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Sub.java.svn-base new file mode 100755 index 0000000..eb04622 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Sub.java.svn-base @@ -0,0 +1,155 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}hi"/>
+ *         <element ref="{}ut"/>
+ *         <element ref="{}it"/>
+ *         <element ref="{}ept"/>
+ *         <element ref="{}bpt"/>
+ *         <element ref="{}ph"/>
+ *       </choice>
+ *       <attribute name="datatype" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "sub") +public class Sub { + + @XmlElementRefs({ + @XmlElementRef(name = "ept", type = Ept.class), + @XmlElementRef(name = "ut", type = Ut.class), + @XmlElementRef(name = "it", type = It.class), + @XmlElementRef(name = "hi", type = Hi.class), + @XmlElementRef(name = "bpt", type = Bpt.class), + @XmlElementRef(name = "ph", type = Ph.class) + }) + @XmlMixed + protected List content; + @XmlAttribute + protected String datatype; + @XmlAttribute + protected String type; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Ept } + * {@link Ut } + * {@link String } + * {@link It } + * {@link Hi } + * {@link Bpt } + * {@link Ph } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the datatype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDatatype() { + return datatype; + } + + /** + * Sets the value of the datatype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDatatype(String value) { + this.datatype = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tmx.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tmx.java.svn-base new file mode 100755 index 0000000..5cbc5b2 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tmx.java.svn-base @@ -0,0 +1,127 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}header"/>
+ *         <element ref="{}body"/>
+ *       </sequence>
+ *       <attribute name="version" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "header", + "body" +}) +@XmlRootElement(name = "tmx") +public class Tmx { + + @XmlElement(required = true) + protected Header header; + @XmlElement(required = true) + protected Body body; + @XmlAttribute + protected String version; + + /** + * Gets the value of the header property. + * + * @return + * possible object is + * {@link Header } + * + */ + public Header getHeader() { + return header; + } + + /** + * Sets the value of the header property. + * + * @param value + * allowed object is + * {@link Header } + * + */ + public void setHeader(Header value) { + this.header = value; + } + + /** + * Gets the value of the body property. + * + * @return + * possible object is + * {@link Body } + * + */ + public Body getBody() { + return body; + } + + /** + * Sets the value of the body property. + * + * @param value + * allowed object is + * {@link Body } + * + */ + public void setBody(Body value) { + this.body = value; + } + + /** + * Gets the value of the version property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getVersion() { + return version; + } + + /** + * Sets the value of the version property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setVersion(String value) { + this.version = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tu.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tu.java.svn-base new file mode 100755 index 0000000..e577c7c --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tu.java.svn-base @@ -0,0 +1,511 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <choice maxOccurs="unbounded" minOccurs="0">
+ *           <element ref="{}note"/>
+ *           <element ref="{}prop"/>
+ *         </choice>
+ *         <element ref="{}tuv" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="changedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="changeid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationdate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtool" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtoolversion" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="datatype" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="lastusagedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-tmf" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="segtype">
+ *         <simpleType>
+ *           <restriction base="{http://www.w3.org/2001/XMLSchema}NMTOKEN">
+ *             <enumeration value="block"/>
+ *             <enumeration value="paragraph"/>
+ *             <enumeration value="sentence"/>
+ *             <enumeration value="phrase"/>
+ *           </restriction>
+ *         </simpleType>
+ *       </attribute>
+ *       <attribute name="srclang" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="tuid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="usagecount" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "noteOrProp", + "tuv" +}) +@XmlRootElement(name = "tu") +public class Tu { + + @XmlElements({ + @XmlElement(name = "prop", type = Prop.class), + @XmlElement(name = "note", type = Note.class) + }) + protected List noteOrProp; + @XmlElement(required = true) + protected List tuv; + @XmlAttribute + protected String changedate; + @XmlAttribute + protected String changeid; + @XmlAttribute + protected String creationdate; + @XmlAttribute + protected String creationid; + @XmlAttribute + protected String creationtool; + @XmlAttribute + protected String creationtoolversion; + @XmlAttribute + protected String datatype; + @XmlAttribute + protected String lastusagedate; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(name = "o-tmf") + protected String oTmf; + @XmlAttribute + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String segtype; + @XmlAttribute + protected String srclang; + @XmlAttribute + protected String tuid; + @XmlAttribute + protected String usagecount; + + /** + * Gets the value of the noteOrProp property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the noteOrProp property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getNoteOrProp().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Prop } + * {@link Note } + * + * + */ + public List getNoteOrProp() { + if (noteOrProp == null) { + noteOrProp = new ArrayList(); + } + return this.noteOrProp; + } + + /** + * Gets the value of the tuv property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the tuv property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getTuv().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Tuv } + * + * + */ + public List getTuv() { + if (tuv == null) { + tuv = new ArrayList(); + } + return this.tuv; + } + + /** + * Gets the value of the changedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangedate() { + return changedate; + } + + /** + * Sets the value of the changedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangedate(String value) { + this.changedate = value; + } + + /** + * Gets the value of the changeid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangeid() { + return changeid; + } + + /** + * Sets the value of the changeid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangeid(String value) { + this.changeid = value; + } + + /** + * Gets the value of the creationdate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationdate() { + return creationdate; + } + + /** + * Sets the value of the creationdate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationdate(String value) { + this.creationdate = value; + } + + /** + * Gets the value of the creationid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationid() { + return creationid; + } + + /** + * Sets the value of the creationid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationid(String value) { + this.creationid = value; + } + + /** + * Gets the value of the creationtool property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtool() { + return creationtool; + } + + /** + * Sets the value of the creationtool property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtool(String value) { + this.creationtool = value; + } + + /** + * Gets the value of the creationtoolversion property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtoolversion() { + return creationtoolversion; + } + + /** + * Sets the value of the creationtoolversion property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtoolversion(String value) { + this.creationtoolversion = value; + } + + /** + * Gets the value of the datatype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDatatype() { + return datatype; + } + + /** + * Sets the value of the datatype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDatatype(String value) { + this.datatype = value; + } + + /** + * Gets the value of the lastusagedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLastusagedate() { + return lastusagedate; + } + + /** + * Sets the value of the lastusagedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLastusagedate(String value) { + this.lastusagedate = value; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the oTmf property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOTmf() { + return oTmf; + } + + /** + * Sets the value of the oTmf property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOTmf(String value) { + this.oTmf = value; + } + + /** + * Gets the value of the segtype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSegtype() { + return segtype; + } + + /** + * Sets the value of the segtype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSegtype(String value) { + this.segtype = value; + } + + /** + * Gets the value of the srclang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSrclang() { + return srclang; + } + + /** + * Sets the value of the srclang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSrclang(String value) { + this.srclang = value; + } + + /** + * Gets the value of the tuid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTuid() { + return tuid; + } + + /** + * Sets the value of the tuid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTuid(String value) { + this.tuid = value; + } + + /** + * Gets the value of the usagecount property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUsagecount() { + return usagecount; + } + + /** + * Sets the value of the usagecount property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUsagecount(String value) { + this.usagecount = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tuv.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tuv.java.svn-base new file mode 100755 index 0000000..84cc7cc --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Tuv.java.svn-base @@ -0,0 +1,440 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <choice maxOccurs="unbounded" minOccurs="0">
+ *           <element ref="{}note"/>
+ *           <element ref="{}prop"/>
+ *         </choice>
+ *         <element ref="{}seg"/>
+ *       </sequence>
+ *       <attribute name="changedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="changeid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationdate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtool" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtoolversion" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="datatype" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="lastusagedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-tmf" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="usagecount" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute ref="{http://www.w3.org/XML/1998/namespace}lang use="required""/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "noteOrProp", + "seg" +}) +@XmlRootElement(name = "tuv") +public class Tuv { + + @XmlElements({ + @XmlElement(name = "prop", type = Prop.class), + @XmlElement(name = "note", type = Note.class) + }) + protected List noteOrProp; + @XmlElement(required = true) + protected Seg seg; + @XmlAttribute + protected String changedate; + @XmlAttribute + protected String changeid; + @XmlAttribute + protected String creationdate; + @XmlAttribute + protected String creationid; + @XmlAttribute + protected String creationtool; + @XmlAttribute + protected String creationtoolversion; + @XmlAttribute + protected String datatype; + @XmlAttribute + protected String lastusagedate; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(name = "o-tmf") + protected String oTmf; + @XmlAttribute + protected String usagecount; + @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace", required = true) + protected String lang; + + /** + * Gets the value of the noteOrProp property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the noteOrProp property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getNoteOrProp().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Prop } + * {@link Note } + * + * + */ + public List getNoteOrProp() { + if (noteOrProp == null) { + noteOrProp = new ArrayList(); + } + return this.noteOrProp; + } + + /** + * Gets the value of the seg property. + * + * @return + * possible object is + * {@link Seg } + * + */ + public Seg getSeg() { + return seg; + } + + /** + * Sets the value of the seg property. + * + * @param value + * allowed object is + * {@link Seg } + * + */ + public void setSeg(Seg value) { + this.seg = value; + } + + /** + * Gets the value of the changedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangedate() { + return changedate; + } + + /** + * Sets the value of the changedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangedate(String value) { + this.changedate = value; + } + + /** + * Gets the value of the changeid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangeid() { + return changeid; + } + + /** + * Sets the value of the changeid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangeid(String value) { + this.changeid = value; + } + + /** + * Gets the value of the creationdate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationdate() { + return creationdate; + } + + /** + * Sets the value of the creationdate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationdate(String value) { + this.creationdate = value; + } + + /** + * Gets the value of the creationid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationid() { + return creationid; + } + + /** + * Sets the value of the creationid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationid(String value) { + this.creationid = value; + } + + /** + * Gets the value of the creationtool property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtool() { + return creationtool; + } + + /** + * Sets the value of the creationtool property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtool(String value) { + this.creationtool = value; + } + + /** + * Gets the value of the creationtoolversion property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtoolversion() { + return creationtoolversion; + } + + /** + * Sets the value of the creationtoolversion property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtoolversion(String value) { + this.creationtoolversion = value; + } + + /** + * Gets the value of the datatype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDatatype() { + return datatype; + } + + /** + * Sets the value of the datatype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDatatype(String value) { + this.datatype = value; + } + + /** + * Gets the value of the lastusagedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLastusagedate() { + return lastusagedate; + } + + /** + * Sets the value of the lastusagedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLastusagedate(String value) { + this.lastusagedate = value; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the oTmf property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOTmf() { + return oTmf; + } + + /** + * Sets the value of the oTmf property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOTmf(String value) { + this.oTmf = value; + } + + /** + * Gets the value of the usagecount property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUsagecount() { + return usagecount; + } + + /** + * Sets the value of the usagecount property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUsagecount(String value) { + this.usagecount = value; + } + + /** + * Gets the value of the lang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLang() { + return lang; + } + + /** + * Sets the value of the lang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLang(String value) { + this.lang = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ude.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ude.java.svn-base new file mode 100755 index 0000000..dd29f42 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ude.java.svn-base @@ -0,0 +1,134 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}map" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="base" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "map" +}) +@XmlRootElement(name = "ude") +public class Ude { + + @XmlElement(required = true) + protected List map; + @XmlAttribute + protected String base; + @XmlAttribute(required = true) + protected String name; + + /** + * Gets the value of the map property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the map property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getMap().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Map } + * + * + */ + public List getMap() { + if (map == null) { + map = new ArrayList(); + } + return this.map; + } + + /** + * Gets the value of the base property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getBase() { + return base; + } + + /** + * Sets the value of the base property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setBase(String value) { + this.base = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ut.java.svn-base b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ut.java.svn-base new file mode 100755 index 0000000..8f08295 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/.svn/text-base/Ut.java.svn-base @@ -0,0 +1,110 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "ut") +public class Ut { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Body.java b/src/net/sourceforge/align/util/bind/tmx/Body.java new file mode 100755 index 0000000..e796f50 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Body.java @@ -0,0 +1,77 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}tu" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "tu" +}) +@XmlRootElement(name = "body") +public class Body { + + protected List tu; + + /** + * Gets the value of the tu property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the tu property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getTu().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Tu } + * + * + */ + public List getTu() { + if (tu == null) { + tu = new ArrayList(); + } + return this.tu; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Bpt.java b/src/net/sourceforge/align/util/bind/tmx/Bpt.java new file mode 100755 index 0000000..18e5d46 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Bpt.java @@ -0,0 +1,164 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="i" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "bpt") +public class Bpt { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute(required = true) + protected String i; + @XmlAttribute + protected String type; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the i property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getI() { + return i; + } + + /** + * Sets the value of the i property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setI(String value) { + this.i = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Ept.java b/src/net/sourceforge/align/util/bind/tmx/Ept.java new file mode 100755 index 0000000..5e1ad0f --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Ept.java @@ -0,0 +1,110 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="i" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "ept") +public class Ept { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute(required = true) + protected String i; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the i property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getI() { + return i; + } + + /** + * Sets the value of the i property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setI(String value) { + this.i = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Header.java b/src/net/sourceforge/align/util/bind/tmx/Header.java new file mode 100755 index 0000000..220e316 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Header.java @@ -0,0 +1,425 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}note"/>
+ *         <element ref="{}prop"/>
+ *         <element ref="{}ude"/>
+ *       </choice>
+ *       <attribute name="adminlang" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="changedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="changeid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationdate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtool" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtoolversion" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="datatype" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-tmf" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="segtype" use="required">
+ *         <simpleType>
+ *           <restriction base="{http://www.w3.org/2001/XMLSchema}NMTOKEN">
+ *             <enumeration value="block"/>
+ *             <enumeration value="paragraph"/>
+ *             <enumeration value="sentence"/>
+ *             <enumeration value="phrase"/>
+ *           </restriction>
+ *         </simpleType>
+ *       </attribute>
+ *       <attribute name="srclang" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "noteOrPropOrUde" +}) +@XmlRootElement(name = "header") +public class Header { + + @XmlElements({ + @XmlElement(name = "note", type = Note.class), + @XmlElement(name = "prop", type = Prop.class), + @XmlElement(name = "ude", type = Ude.class) + }) + protected List noteOrPropOrUde; + @XmlAttribute(required = true) + protected String adminlang; + @XmlAttribute + protected String changedate; + @XmlAttribute + protected String changeid; + @XmlAttribute + protected String creationdate; + @XmlAttribute + protected String creationid; + @XmlAttribute(required = true) + protected String creationtool; + @XmlAttribute(required = true) + protected String creationtoolversion; + @XmlAttribute(required = true) + protected String datatype; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(name = "o-tmf", required = true) + protected String oTmf; + @XmlAttribute(required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String segtype; + @XmlAttribute(required = true) + protected String srclang; + + /** + * Gets the value of the noteOrPropOrUde property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the noteOrPropOrUde property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getNoteOrPropOrUde().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Note } + * {@link Prop } + * {@link Ude } + * + * + */ + public List getNoteOrPropOrUde() { + if (noteOrPropOrUde == null) { + noteOrPropOrUde = new ArrayList(); + } + return this.noteOrPropOrUde; + } + + /** + * Gets the value of the adminlang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAdminlang() { + return adminlang; + } + + /** + * Sets the value of the adminlang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAdminlang(String value) { + this.adminlang = value; + } + + /** + * Gets the value of the changedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangedate() { + return changedate; + } + + /** + * Sets the value of the changedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangedate(String value) { + this.changedate = value; + } + + /** + * Gets the value of the changeid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangeid() { + return changeid; + } + + /** + * Sets the value of the changeid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangeid(String value) { + this.changeid = value; + } + + /** + * Gets the value of the creationdate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationdate() { + return creationdate; + } + + /** + * Sets the value of the creationdate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationdate(String value) { + this.creationdate = value; + } + + /** + * Gets the value of the creationid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationid() { + return creationid; + } + + /** + * Sets the value of the creationid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationid(String value) { + this.creationid = value; + } + + /** + * Gets the value of the creationtool property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtool() { + return creationtool; + } + + /** + * Sets the value of the creationtool property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtool(String value) { + this.creationtool = value; + } + + /** + * Gets the value of the creationtoolversion property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtoolversion() { + return creationtoolversion; + } + + /** + * Sets the value of the creationtoolversion property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtoolversion(String value) { + this.creationtoolversion = value; + } + + /** + * Gets the value of the datatype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDatatype() { + return datatype; + } + + /** + * Sets the value of the datatype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDatatype(String value) { + this.datatype = value; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the oTmf property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOTmf() { + return oTmf; + } + + /** + * Sets the value of the oTmf property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOTmf(String value) { + this.oTmf = value; + } + + /** + * Gets the value of the segtype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSegtype() { + return segtype; + } + + /** + * Sets the value of the segtype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSegtype(String value) { + this.segtype = value; + } + + /** + * Gets the value of the srclang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSrclang() { + return srclang; + } + + /** + * Sets the value of the srclang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSrclang(String value) { + this.srclang = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Hi.java b/src/net/sourceforge/align/util/bind/tmx/Hi.java new file mode 100755 index 0000000..d5b9596 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Hi.java @@ -0,0 +1,155 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}hi"/>
+ *         <element ref="{}ut"/>
+ *         <element ref="{}it"/>
+ *         <element ref="{}ept"/>
+ *         <element ref="{}bpt"/>
+ *         <element ref="{}ph"/>
+ *       </choice>
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "hi") +public class Hi { + + @XmlElementRefs({ + @XmlElementRef(name = "ept", type = Ept.class), + @XmlElementRef(name = "ut", type = Ut.class), + @XmlElementRef(name = "it", type = It.class), + @XmlElementRef(name = "bpt", type = Bpt.class), + @XmlElementRef(name = "hi", type = Hi.class), + @XmlElementRef(name = "ph", type = Ph.class) + }) + @XmlMixed + protected List content; + @XmlAttribute + protected String type; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Ept } + * {@link Ut } + * {@link String } + * {@link It } + * {@link Bpt } + * {@link Hi } + * {@link Ph } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/It.java b/src/net/sourceforge/align/util/bind/tmx/It.java new file mode 100755 index 0000000..3eddd7d --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/It.java @@ -0,0 +1,174 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="pos" use="required">
+ *         <simpleType>
+ *           <restriction base="{http://www.w3.org/2001/XMLSchema}NMTOKEN">
+ *             <enumeration value="begin"/>
+ *             <enumeration value="end"/>
+ *           </restriction>
+ *         </simpleType>
+ *       </attribute>
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "it") +public class It { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute(required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String pos; + @XmlAttribute + protected String type; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the pos property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getPos() { + return pos; + } + + /** + * Sets the value of the pos property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setPos(String value) { + this.pos = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Map.java b/src/net/sourceforge/align/util/bind/tmx/Map.java new file mode 100755 index 0000000..2e8bd4a --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Map.java @@ -0,0 +1,148 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="code" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="ent" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="subst" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="unicode" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "") +@XmlRootElement(name = "map") +public class Map { + + @XmlAttribute + protected String code; + @XmlAttribute + protected String ent; + @XmlAttribute + protected String subst; + @XmlAttribute(required = true) + protected String unicode; + + /** + * Gets the value of the code property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCode() { + return code; + } + + /** + * Sets the value of the code property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCode(String value) { + this.code = value; + } + + /** + * Gets the value of the ent property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getEnt() { + return ent; + } + + /** + * Sets the value of the ent property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEnt(String value) { + this.ent = value; + } + + /** + * Gets the value of the subst property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSubst() { + return subst; + } + + /** + * Sets the value of the subst property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSubst(String value) { + this.subst = value; + } + + /** + * Gets the value of the unicode property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUnicode() { + return unicode; + } + + /** + * Sets the value of the unicode property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUnicode(String value) { + this.unicode = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Note.java b/src/net/sourceforge/align/util/bind/tmx/Note.java new file mode 100755 index 0000000..7e47935 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Note.java @@ -0,0 +1,133 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *       </sequence>
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "note") +public class Note { + + @XmlMixed + protected List content; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") + protected String lang; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the lang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLang() { + return lang; + } + + /** + * Sets the value of the lang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLang(String value) { + this.lang = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/ObjectFactory.java b/src/net/sourceforge/align/util/bind/tmx/ObjectFactory.java new file mode 100755 index 0000000..353a5b8 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/ObjectFactory.java @@ -0,0 +1,175 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import javax.xml.bind.annotation.XmlRegistry; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the align.util.bind.tmx package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: align.util.bind.tmx + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Seg } + * + */ + public Seg createSeg() { + return new Seg(); + } + + /** + * Create an instance of {@link Ept } + * + */ + public Ept createEpt() { + return new Ept(); + } + + /** + * Create an instance of {@link Ut } + * + */ + public Ut createUt() { + return new Ut(); + } + + /** + * Create an instance of {@link Prop } + * + */ + public Prop createProp() { + return new Prop(); + } + + /** + * Create an instance of {@link Ude } + * + */ + public Ude createUde() { + return new Ude(); + } + + /** + * Create an instance of {@link Tu } + * + */ + public Tu createTu() { + return new Tu(); + } + + /** + * Create an instance of {@link Tmx } + * + */ + public Tmx createTmx() { + return new Tmx(); + } + + /** + * Create an instance of {@link Body } + * + */ + public Body createBody() { + return new Body(); + } + + /** + * Create an instance of {@link Header } + * + */ + public Header createHeader() { + return new Header(); + } + + /** + * Create an instance of {@link Note } + * + */ + public Note createNote() { + return new Note(); + } + + /** + * Create an instance of {@link Tuv } + * + */ + public Tuv createTuv() { + return new Tuv(); + } + + /** + * Create an instance of {@link Map } + * + */ + public Map createMap() { + return new Map(); + } + + /** + * Create an instance of {@link Sub } + * + */ + public Sub createSub() { + return new Sub(); + } + + /** + * Create an instance of {@link It } + * + */ + public It createIt() { + return new It(); + } + + /** + * Create an instance of {@link Hi } + * + */ + public Hi createHi() { + return new Hi(); + } + + /** + * Create an instance of {@link Bpt } + * + */ + public Bpt createBpt() { + return new Bpt(); + } + + /** + * Create an instance of {@link Ph } + * + */ + public Ph createPh() { + return new Ph(); + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Ph.java b/src/net/sourceforge/align/util/bind/tmx/Ph.java new file mode 100755 index 0000000..730db1a --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Ph.java @@ -0,0 +1,164 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="assoc" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "ph") +public class Ph { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute + protected String assoc; + @XmlAttribute + protected String type; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the assoc property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAssoc() { + return assoc; + } + + /** + * Sets the value of the assoc property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAssoc(String value) { + this.assoc = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Prop.java b/src/net/sourceforge/align/util/bind/tmx/Prop.java new file mode 100755 index 0000000..39527fe --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Prop.java @@ -0,0 +1,160 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *       </sequence>
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "prop") +public class Prop { + + @XmlMixed + protected List content; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(required = true) + protected String type; + @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") + protected String lang; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the lang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLang() { + return lang; + } + + /** + * Sets the value of the lang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLang(String value) { + this.lang = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Seg.java b/src/net/sourceforge/align/util/bind/tmx/Seg.java new file mode 100755 index 0000000..ffe3c68 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Seg.java @@ -0,0 +1,100 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}hi"/>
+ *         <element ref="{}ut"/>
+ *         <element ref="{}ph"/>
+ *         <element ref="{}ept"/>
+ *         <element ref="{}bpt"/>
+ *         <element ref="{}it"/>
+ *       </choice>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "seg") +public class Seg { + + @XmlElementRefs({ + @XmlElementRef(name = "ept", type = Ept.class), + @XmlElementRef(name = "ut", type = Ut.class), + @XmlElementRef(name = "it", type = It.class), + @XmlElementRef(name = "hi", type = Hi.class), + @XmlElementRef(name = "bpt", type = Bpt.class), + @XmlElementRef(name = "ph", type = Ph.class) + }) + @XmlMixed + protected List content; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Ept } + * {@link Ut } + * {@link String } + * {@link It } + * {@link Hi } + * {@link Bpt } + * {@link Ph } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Sub.java b/src/net/sourceforge/align/util/bind/tmx/Sub.java new file mode 100755 index 0000000..eb04622 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Sub.java @@ -0,0 +1,155 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}hi"/>
+ *         <element ref="{}ut"/>
+ *         <element ref="{}it"/>
+ *         <element ref="{}ept"/>
+ *         <element ref="{}bpt"/>
+ *         <element ref="{}ph"/>
+ *       </choice>
+ *       <attribute name="datatype" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "sub") +public class Sub { + + @XmlElementRefs({ + @XmlElementRef(name = "ept", type = Ept.class), + @XmlElementRef(name = "ut", type = Ut.class), + @XmlElementRef(name = "it", type = It.class), + @XmlElementRef(name = "hi", type = Hi.class), + @XmlElementRef(name = "bpt", type = Bpt.class), + @XmlElementRef(name = "ph", type = Ph.class) + }) + @XmlMixed + protected List content; + @XmlAttribute + protected String datatype; + @XmlAttribute + protected String type; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Ept } + * {@link Ut } + * {@link String } + * {@link It } + * {@link Hi } + * {@link Bpt } + * {@link Ph } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the datatype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDatatype() { + return datatype; + } + + /** + * Sets the value of the datatype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDatatype(String value) { + this.datatype = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Tmx.java b/src/net/sourceforge/align/util/bind/tmx/Tmx.java new file mode 100755 index 0000000..5cbc5b2 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Tmx.java @@ -0,0 +1,127 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}header"/>
+ *         <element ref="{}body"/>
+ *       </sequence>
+ *       <attribute name="version" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "header", + "body" +}) +@XmlRootElement(name = "tmx") +public class Tmx { + + @XmlElement(required = true) + protected Header header; + @XmlElement(required = true) + protected Body body; + @XmlAttribute + protected String version; + + /** + * Gets the value of the header property. + * + * @return + * possible object is + * {@link Header } + * + */ + public Header getHeader() { + return header; + } + + /** + * Sets the value of the header property. + * + * @param value + * allowed object is + * {@link Header } + * + */ + public void setHeader(Header value) { + this.header = value; + } + + /** + * Gets the value of the body property. + * + * @return + * possible object is + * {@link Body } + * + */ + public Body getBody() { + return body; + } + + /** + * Sets the value of the body property. + * + * @param value + * allowed object is + * {@link Body } + * + */ + public void setBody(Body value) { + this.body = value; + } + + /** + * Gets the value of the version property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getVersion() { + return version; + } + + /** + * Sets the value of the version property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setVersion(String value) { + this.version = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Tu.java b/src/net/sourceforge/align/util/bind/tmx/Tu.java new file mode 100755 index 0000000..e577c7c --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Tu.java @@ -0,0 +1,511 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <choice maxOccurs="unbounded" minOccurs="0">
+ *           <element ref="{}note"/>
+ *           <element ref="{}prop"/>
+ *         </choice>
+ *         <element ref="{}tuv" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="changedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="changeid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationdate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtool" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtoolversion" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="datatype" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="lastusagedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-tmf" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="segtype">
+ *         <simpleType>
+ *           <restriction base="{http://www.w3.org/2001/XMLSchema}NMTOKEN">
+ *             <enumeration value="block"/>
+ *             <enumeration value="paragraph"/>
+ *             <enumeration value="sentence"/>
+ *             <enumeration value="phrase"/>
+ *           </restriction>
+ *         </simpleType>
+ *       </attribute>
+ *       <attribute name="srclang" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="tuid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="usagecount" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "noteOrProp", + "tuv" +}) +@XmlRootElement(name = "tu") +public class Tu { + + @XmlElements({ + @XmlElement(name = "prop", type = Prop.class), + @XmlElement(name = "note", type = Note.class) + }) + protected List noteOrProp; + @XmlElement(required = true) + protected List tuv; + @XmlAttribute + protected String changedate; + @XmlAttribute + protected String changeid; + @XmlAttribute + protected String creationdate; + @XmlAttribute + protected String creationid; + @XmlAttribute + protected String creationtool; + @XmlAttribute + protected String creationtoolversion; + @XmlAttribute + protected String datatype; + @XmlAttribute + protected String lastusagedate; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(name = "o-tmf") + protected String oTmf; + @XmlAttribute + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String segtype; + @XmlAttribute + protected String srclang; + @XmlAttribute + protected String tuid; + @XmlAttribute + protected String usagecount; + + /** + * Gets the value of the noteOrProp property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the noteOrProp property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getNoteOrProp().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Prop } + * {@link Note } + * + * + */ + public List getNoteOrProp() { + if (noteOrProp == null) { + noteOrProp = new ArrayList(); + } + return this.noteOrProp; + } + + /** + * Gets the value of the tuv property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the tuv property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getTuv().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Tuv } + * + * + */ + public List getTuv() { + if (tuv == null) { + tuv = new ArrayList(); + } + return this.tuv; + } + + /** + * Gets the value of the changedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangedate() { + return changedate; + } + + /** + * Sets the value of the changedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangedate(String value) { + this.changedate = value; + } + + /** + * Gets the value of the changeid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangeid() { + return changeid; + } + + /** + * Sets the value of the changeid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangeid(String value) { + this.changeid = value; + } + + /** + * Gets the value of the creationdate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationdate() { + return creationdate; + } + + /** + * Sets the value of the creationdate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationdate(String value) { + this.creationdate = value; + } + + /** + * Gets the value of the creationid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationid() { + return creationid; + } + + /** + * Sets the value of the creationid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationid(String value) { + this.creationid = value; + } + + /** + * Gets the value of the creationtool property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtool() { + return creationtool; + } + + /** + * Sets the value of the creationtool property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtool(String value) { + this.creationtool = value; + } + + /** + * Gets the value of the creationtoolversion property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtoolversion() { + return creationtoolversion; + } + + /** + * Sets the value of the creationtoolversion property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtoolversion(String value) { + this.creationtoolversion = value; + } + + /** + * Gets the value of the datatype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDatatype() { + return datatype; + } + + /** + * Sets the value of the datatype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDatatype(String value) { + this.datatype = value; + } + + /** + * Gets the value of the lastusagedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLastusagedate() { + return lastusagedate; + } + + /** + * Sets the value of the lastusagedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLastusagedate(String value) { + this.lastusagedate = value; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the oTmf property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOTmf() { + return oTmf; + } + + /** + * Sets the value of the oTmf property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOTmf(String value) { + this.oTmf = value; + } + + /** + * Gets the value of the segtype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSegtype() { + return segtype; + } + + /** + * Sets the value of the segtype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSegtype(String value) { + this.segtype = value; + } + + /** + * Gets the value of the srclang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSrclang() { + return srclang; + } + + /** + * Sets the value of the srclang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSrclang(String value) { + this.srclang = value; + } + + /** + * Gets the value of the tuid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTuid() { + return tuid; + } + + /** + * Sets the value of the tuid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTuid(String value) { + this.tuid = value; + } + + /** + * Gets the value of the usagecount property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUsagecount() { + return usagecount; + } + + /** + * Sets the value of the usagecount property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUsagecount(String value) { + this.usagecount = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Tuv.java b/src/net/sourceforge/align/util/bind/tmx/Tuv.java new file mode 100755 index 0000000..84cc7cc --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Tuv.java @@ -0,0 +1,440 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <choice maxOccurs="unbounded" minOccurs="0">
+ *           <element ref="{}note"/>
+ *           <element ref="{}prop"/>
+ *         </choice>
+ *         <element ref="{}seg"/>
+ *       </sequence>
+ *       <attribute name="changedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="changeid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationdate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtool" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="creationtoolversion" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="datatype" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="lastusagedate" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-encoding" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="o-tmf" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="usagecount" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute ref="{http://www.w3.org/XML/1998/namespace}lang use="required""/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "noteOrProp", + "seg" +}) +@XmlRootElement(name = "tuv") +public class Tuv { + + @XmlElements({ + @XmlElement(name = "prop", type = Prop.class), + @XmlElement(name = "note", type = Note.class) + }) + protected List noteOrProp; + @XmlElement(required = true) + protected Seg seg; + @XmlAttribute + protected String changedate; + @XmlAttribute + protected String changeid; + @XmlAttribute + protected String creationdate; + @XmlAttribute + protected String creationid; + @XmlAttribute + protected String creationtool; + @XmlAttribute + protected String creationtoolversion; + @XmlAttribute + protected String datatype; + @XmlAttribute + protected String lastusagedate; + @XmlAttribute(name = "o-encoding") + protected String oEncoding; + @XmlAttribute(name = "o-tmf") + protected String oTmf; + @XmlAttribute + protected String usagecount; + @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace", required = true) + protected String lang; + + /** + * Gets the value of the noteOrProp property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the noteOrProp property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getNoteOrProp().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Prop } + * {@link Note } + * + * + */ + public List getNoteOrProp() { + if (noteOrProp == null) { + noteOrProp = new ArrayList(); + } + return this.noteOrProp; + } + + /** + * Gets the value of the seg property. + * + * @return + * possible object is + * {@link Seg } + * + */ + public Seg getSeg() { + return seg; + } + + /** + * Sets the value of the seg property. + * + * @param value + * allowed object is + * {@link Seg } + * + */ + public void setSeg(Seg value) { + this.seg = value; + } + + /** + * Gets the value of the changedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangedate() { + return changedate; + } + + /** + * Sets the value of the changedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangedate(String value) { + this.changedate = value; + } + + /** + * Gets the value of the changeid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChangeid() { + return changeid; + } + + /** + * Sets the value of the changeid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChangeid(String value) { + this.changeid = value; + } + + /** + * Gets the value of the creationdate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationdate() { + return creationdate; + } + + /** + * Sets the value of the creationdate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationdate(String value) { + this.creationdate = value; + } + + /** + * Gets the value of the creationid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationid() { + return creationid; + } + + /** + * Sets the value of the creationid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationid(String value) { + this.creationid = value; + } + + /** + * Gets the value of the creationtool property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtool() { + return creationtool; + } + + /** + * Sets the value of the creationtool property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtool(String value) { + this.creationtool = value; + } + + /** + * Gets the value of the creationtoolversion property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCreationtoolversion() { + return creationtoolversion; + } + + /** + * Sets the value of the creationtoolversion property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreationtoolversion(String value) { + this.creationtoolversion = value; + } + + /** + * Gets the value of the datatype property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDatatype() { + return datatype; + } + + /** + * Sets the value of the datatype property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDatatype(String value) { + this.datatype = value; + } + + /** + * Gets the value of the lastusagedate property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLastusagedate() { + return lastusagedate; + } + + /** + * Sets the value of the lastusagedate property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLastusagedate(String value) { + this.lastusagedate = value; + } + + /** + * Gets the value of the oEncoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOEncoding() { + return oEncoding; + } + + /** + * Sets the value of the oEncoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOEncoding(String value) { + this.oEncoding = value; + } + + /** + * Gets the value of the oTmf property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOTmf() { + return oTmf; + } + + /** + * Sets the value of the oTmf property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOTmf(String value) { + this.oTmf = value; + } + + /** + * Gets the value of the usagecount property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUsagecount() { + return usagecount; + } + + /** + * Sets the value of the usagecount property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUsagecount(String value) { + this.usagecount = value; + } + + /** + * Gets the value of the lang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLang() { + return lang; + } + + /** + * Sets the value of the lang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLang(String value) { + this.lang = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Ude.java b/src/net/sourceforge/align/util/bind/tmx/Ude.java new file mode 100755 index 0000000..dd29f42 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Ude.java @@ -0,0 +1,134 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{}map" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="base" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "map" +}) +@XmlRootElement(name = "ude") +public class Ude { + + @XmlElement(required = true) + protected List map; + @XmlAttribute + protected String base; + @XmlAttribute(required = true) + protected String name; + + /** + * Gets the value of the map property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the map property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getMap().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Map } + * + * + */ + public List getMap() { + if (map == null) { + map = new ArrayList(); + } + return this.map; + } + + /** + * Gets the value of the base property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getBase() { + return base; + } + + /** + * Sets the value of the base property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setBase(String value) { + this.base = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + +} diff --git a/src/net/sourceforge/align/util/bind/tmx/Ut.java b/src/net/sourceforge/align/util/bind/tmx/Ut.java new file mode 100755 index 0000000..8f08295 --- /dev/null +++ b/src/net/sourceforge/align/util/bind/tmx/Ut.java @@ -0,0 +1,110 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.0 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2007.04.17 at 02:12:59 PM CEST +// + + +package net.sourceforge.align.util.bind.tmx; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element ref="{}sub"/>
+ *       </choice>
+ *       <attribute name="x" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "content" +}) +@XmlRootElement(name = "ut") +public class Ut { + + @XmlElementRef(name = "sub", type = Sub.class) + @XmlMixed + protected List content; + @XmlAttribute + protected String x; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Sub } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + +} diff --git a/src/net/sourceforge/align/util/date/.svn/all-wcprops b/src/net/sourceforge/align/util/date/.svn/all-wcprops new file mode 100644 index 0000000..67f92f9 --- /dev/null +++ b/src/net/sourceforge/align/util/date/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 76 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/date +END +DateParser.java +K 25 +svn:wc:ra_dav:version-url +V 92 +/svnroot/align/!svn/ver/40/trunk/maligna/src/net/sourceforge/align/util/date/DateParser.java +END +InvalidDateException.java +K 25 +svn:wc:ra_dav:version-url +V 102 +/svnroot/align/!svn/ver/42/trunk/maligna/src/net/sourceforge/align/util/date/InvalidDateException.java +END diff --git a/src/net/sourceforge/align/util/date/.svn/entries b/src/net/sourceforge/align/util/date/.svn/entries new file mode 100644 index 0000000..4adcfcd --- /dev/null +++ b/src/net/sourceforge/align/util/date/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/src/net/sourceforge/align/util/date +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-02T23:37:42.328942Z +42 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +DateParser.java +file + + + + +2009-09-01T17:50:15.000000Z +776bee4a4746669773d25fa60f204862 +2009-09-01T19:06:52.277402Z +40 +jarekl + + + + + + + + + + + + + + + + + + + + + +9041 + +InvalidDateException.java +file + + + + +2010-10-19T19:37:52.000000Z +97c569a37cac07c6e06467411640fada +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +366 + diff --git a/src/net/sourceforge/align/util/date/.svn/text-base/DateParser.java.svn-base b/src/net/sourceforge/align/util/date/.svn/text-base/DateParser.java.svn-base new file mode 100755 index 0000000..1b23ec9 --- /dev/null +++ b/src/net/sourceforge/align/util/date/.svn/text-base/DateParser.java.svn-base @@ -0,0 +1,309 @@ +// DateParser.java +// $Id: DateParser.java,v 1.5 2005/05/16 10:19:19 ylafon Exp $ +// (c) COPYRIGHT MIT, INRIA and Keio, 2000. +// Please first read the full copyright statement in file COPYRIGHT.html +package net.sourceforge.align.util.date; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.NoSuchElementException; +import java.util.StringTokenizer; +import java.util.TimeZone; + +/** + * Date parser for ISO 8601 format + * http://www.w3.org/TR/1998/NOTE-datetime-19980827 + * @version $Revision: 1.5 $ + * @author Benoit Mahe (bmahe@w3.org) + * @author Yves Lafon (ylafon@w3.org) + */ +public class DateParser { + + private static boolean check(StringTokenizer st, String token) + throws InvalidDateException + { + try { + if (st.nextToken().equals(token)) { + return true; + } else { + throw new InvalidDateException("Missing ["+token+"]"); + } + } catch (NoSuchElementException ex) { + return false; + } + } + + private static Calendar getCalendar(String isodate) + throws InvalidDateException + { + // YYYY-MM-DDThh:mm:ss.sTZD + StringTokenizer st = new StringTokenizer(isodate, "-T:.+Z", true); + + Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + calendar.clear(); + try { + // Year + if (st.hasMoreTokens()) { + int year = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.YEAR, year); + } else { + return calendar; + } + // Month + if (check(st, "-") && (st.hasMoreTokens())) { + int month = Integer.parseInt(st.nextToken()) -1; + calendar.set(Calendar.MONTH, month); + } else { + return calendar; + } + // Day + if (check(st, "-") && (st.hasMoreTokens())) { + int day = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.DAY_OF_MONTH, day); + } else { + return calendar; + } + // Hour + if (check(st, "T") && (st.hasMoreTokens())) { + int hour = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.HOUR_OF_DAY, hour); + } else { + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar; + } + // Minutes + if (check(st, ":") && (st.hasMoreTokens())) { + int minutes = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.MINUTE, minutes); + } else { + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar; + } + + // + // Not mandatory now + // + + // Secondes + if (! st.hasMoreTokens()) { + return calendar; + } + String tok = st.nextToken(); + if (tok.equals(":")) { // secondes + if (st.hasMoreTokens()) { + int secondes = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.SECOND, secondes); + if (! st.hasMoreTokens()) { + return calendar; + } + // frac sec + tok = st.nextToken(); + if (tok.equals(".")) { + // bug fixed, thx to Martin Bottcher + StringBuilder nt = new StringBuilder(st.nextToken()); + while(nt.length() < 3) { + nt.append('0'); + } + int millisec = Integer.parseInt(nt.substring( 0, 3 )); + //int millisec = Integer.parseInt(st.nextToken()) * 10; + calendar.set(Calendar.MILLISECOND, millisec); + if (! st.hasMoreTokens()) { + return calendar; + } + tok = st.nextToken(); + } else { + calendar.set(Calendar.MILLISECOND, 0); + } + } else { + throw new InvalidDateException("No secondes specified"); + } + } else { + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + } + // Timezone + if (! tok.equals("Z")) { // UTC + if (! (tok.equals("+") || tok.equals("-"))) { + throw new InvalidDateException("only Z, + or - allowed"); + } + boolean plus = tok.equals("+"); + if (! st.hasMoreTokens()) { + throw new InvalidDateException("Missing hour field"); + } + int tzhour = Integer.parseInt(st.nextToken()); + int tzmin = 0; + if (check(st, ":") && (st.hasMoreTokens())) { + tzmin = Integer.parseInt(st.nextToken()); + } else { + throw new InvalidDateException("Missing minute field"); + } + if (plus) { + calendar.add(Calendar.HOUR, -tzhour); + calendar.add(Calendar.MINUTE, -tzmin); + } else { + calendar.add(Calendar.HOUR, tzhour); + calendar.add(Calendar.MINUTE, tzmin); + } + } + } catch (NumberFormatException ex) { + throw new InvalidDateException("["+ex.getMessage()+ + "] is not an integer"); + } + return calendar; + } + + /** + * Parse the given string in ISO 8601 format and build a Date object. + * @param isodate the date in ISO 8601 format + * @return a Date instance + * @exception InvalidDateException if the date is not valid + */ + public static Date parse(String isodate) + throws InvalidDateException + { + Calendar calendar = getCalendar(isodate); + return calendar.getTime(); + } + + private static String twoDigit(int i) { + if (i >=0 && i < 10) { + return "0"+String.valueOf(i); + } + return String.valueOf(i); + } + + /** + * Generate a ISO 8601 date + * @param date a Date instance + * @return a string representing the date in the ISO 8601 format + */ + public static String getIsoDate(Date date) { + TimeZone timeZone = TimeZone.getDefault(); + Calendar calendar = new GregorianCalendar(timeZone); + calendar.setTime(date); + StringBuffer buffer = new StringBuffer(); + buffer.append(calendar.get(Calendar.YEAR)); + buffer.append("-"); + buffer.append(twoDigit(calendar.get(Calendar.MONTH) + 1)); + buffer.append("-"); + buffer.append(twoDigit(calendar.get(Calendar.DAY_OF_MONTH))); + buffer.append("T"); + buffer.append(twoDigit(calendar.get(Calendar.HOUR_OF_DAY))); + buffer.append(":"); + buffer.append(twoDigit(calendar.get(Calendar.MINUTE))); + buffer.append(":"); + buffer.append(twoDigit(calendar.get(Calendar.SECOND))); + buffer.append("."); + buffer.append(twoDigit(calendar.get(Calendar.MILLISECOND) / 10)); + int offset = timeZone.getOffset(date.getTime()); + if (offset >= 0) { + buffer.append('+'); + } else { + buffer.append('-'); + offset = -offset; + } + int hours = offset / (60 * 60 * 1000); + int minutes = (offset - hours * (60 * 60 * 1000)) / (60 * 1000); + if (hours < 10) { + buffer.append('0'); + } + buffer.append(hours); + buffer.append(':'); + if (hours < 10) { + buffer.append('0'); + } + buffer.append(minutes); + return buffer.toString(); + } + + /** + * Generate a ISO 8601 date + * @param date a Date instance + * @return a string representing the date in the ISO 8601 format + */ + public static String getIsoDateNoMillis(Date date) { + TimeZone timeZone = TimeZone.getDefault(); + Calendar calendar = new GregorianCalendar(timeZone); + calendar.setTime(date); + StringBuffer buffer = new StringBuffer(); + buffer.append(calendar.get(Calendar.YEAR)); + buffer.append("-"); + buffer.append(twoDigit(calendar.get(Calendar.MONTH) + 1)); + buffer.append("-"); + buffer.append(twoDigit(calendar.get(Calendar.DAY_OF_MONTH))); + buffer.append("T"); + buffer.append(twoDigit(calendar.get(Calendar.HOUR_OF_DAY))); + buffer.append(":"); + buffer.append(twoDigit(calendar.get(Calendar.MINUTE))); + buffer.append(":"); + buffer.append(twoDigit(calendar.get(Calendar.SECOND))); + int offset = timeZone.getOffset(date.getTime()); + if (offset >= 0) { + buffer.append('+'); + } else { + buffer.append('-'); + offset = -offset; + } + int hours = offset / (60 * 60 * 1000); + int minutes = (offset - hours * (60 * 60 * 1000)) / (60 * 1000); + if (hours < 10) { + buffer.append('0'); + } + buffer.append(hours); + buffer.append(':'); + if (hours < 10) { + buffer.append('0'); + } + buffer.append(minutes); + return buffer.toString(); + } + + public static void test(String isodate) { + System.out.println("----------------------------------"); + try { + Date date = parse(isodate); + System.out.println(">> "+isodate); + System.out.println(">> "+date.toString()+" ["+date.getTime()+"]"); + System.out.println(">> "+getIsoDate(date)); + } catch (InvalidDateException ex) { + System.err.println(isodate+" is invalid"); + System.err.println(ex.getMessage()); + } + System.out.println("----------------------------------"); + } + + public static void test(Date date) { + String isodate = null; + System.out.println("----------------------------------"); + try { + System.out.println(">> "+date.toString()+" ["+date.getTime()+"]"); + isodate = getIsoDate(date); + System.out.println(">> "+isodate); + date = parse(isodate); + System.out.println(">> "+date.toString()+" ["+date.getTime()+"]"); + } catch (InvalidDateException ex) { + System.err.println(isodate+" is invalid"); + System.err.println(ex.getMessage()); + } + System.out.println("----------------------------------"); + } + + public static void main(String args[]) { + test("1997-07-16T19:20:30.45-02:00"); + test("1997-07-16T19:20:30+01:00"); + test("1997-07-16T19:20:30+01:00"); + test("1997-07-16T12:20:30-06:00"); + test("1997-07-16T19:20"); + test("1997-07-16"); + test("1997-07"); + test("1997"); + test(new Date()); + } + +} diff --git a/src/net/sourceforge/align/util/date/.svn/text-base/InvalidDateException.java.svn-base b/src/net/sourceforge/align/util/date/.svn/text-base/InvalidDateException.java.svn-base new file mode 100644 index 0000000..c27e7ba --- /dev/null +++ b/src/net/sourceforge/align/util/date/.svn/text-base/InvalidDateException.java.svn-base @@ -0,0 +1,17 @@ +package net.sourceforge.align.util.date; + +/** + * This exception is thrown by {@link DateParser} when it encounters an + * invalid date. + * + * @author loomchild + */ +public class InvalidDateException extends RuntimeException { + + private static final long serialVersionUID = 7608394842578468135L; + + public InvalidDateException(String message) { + super(message); + } + +} diff --git a/src/net/sourceforge/align/util/date/DateParser.java b/src/net/sourceforge/align/util/date/DateParser.java new file mode 100755 index 0000000..1b23ec9 --- /dev/null +++ b/src/net/sourceforge/align/util/date/DateParser.java @@ -0,0 +1,309 @@ +// DateParser.java +// $Id: DateParser.java,v 1.5 2005/05/16 10:19:19 ylafon Exp $ +// (c) COPYRIGHT MIT, INRIA and Keio, 2000. +// Please first read the full copyright statement in file COPYRIGHT.html +package net.sourceforge.align.util.date; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.NoSuchElementException; +import java.util.StringTokenizer; +import java.util.TimeZone; + +/** + * Date parser for ISO 8601 format + * http://www.w3.org/TR/1998/NOTE-datetime-19980827 + * @version $Revision: 1.5 $ + * @author Benoit Mahe (bmahe@w3.org) + * @author Yves Lafon (ylafon@w3.org) + */ +public class DateParser { + + private static boolean check(StringTokenizer st, String token) + throws InvalidDateException + { + try { + if (st.nextToken().equals(token)) { + return true; + } else { + throw new InvalidDateException("Missing ["+token+"]"); + } + } catch (NoSuchElementException ex) { + return false; + } + } + + private static Calendar getCalendar(String isodate) + throws InvalidDateException + { + // YYYY-MM-DDThh:mm:ss.sTZD + StringTokenizer st = new StringTokenizer(isodate, "-T:.+Z", true); + + Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + calendar.clear(); + try { + // Year + if (st.hasMoreTokens()) { + int year = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.YEAR, year); + } else { + return calendar; + } + // Month + if (check(st, "-") && (st.hasMoreTokens())) { + int month = Integer.parseInt(st.nextToken()) -1; + calendar.set(Calendar.MONTH, month); + } else { + return calendar; + } + // Day + if (check(st, "-") && (st.hasMoreTokens())) { + int day = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.DAY_OF_MONTH, day); + } else { + return calendar; + } + // Hour + if (check(st, "T") && (st.hasMoreTokens())) { + int hour = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.HOUR_OF_DAY, hour); + } else { + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar; + } + // Minutes + if (check(st, ":") && (st.hasMoreTokens())) { + int minutes = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.MINUTE, minutes); + } else { + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar; + } + + // + // Not mandatory now + // + + // Secondes + if (! st.hasMoreTokens()) { + return calendar; + } + String tok = st.nextToken(); + if (tok.equals(":")) { // secondes + if (st.hasMoreTokens()) { + int secondes = Integer.parseInt(st.nextToken()); + calendar.set(Calendar.SECOND, secondes); + if (! st.hasMoreTokens()) { + return calendar; + } + // frac sec + tok = st.nextToken(); + if (tok.equals(".")) { + // bug fixed, thx to Martin Bottcher + StringBuilder nt = new StringBuilder(st.nextToken()); + while(nt.length() < 3) { + nt.append('0'); + } + int millisec = Integer.parseInt(nt.substring( 0, 3 )); + //int millisec = Integer.parseInt(st.nextToken()) * 10; + calendar.set(Calendar.MILLISECOND, millisec); + if (! st.hasMoreTokens()) { + return calendar; + } + tok = st.nextToken(); + } else { + calendar.set(Calendar.MILLISECOND, 0); + } + } else { + throw new InvalidDateException("No secondes specified"); + } + } else { + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + } + // Timezone + if (! tok.equals("Z")) { // UTC + if (! (tok.equals("+") || tok.equals("-"))) { + throw new InvalidDateException("only Z, + or - allowed"); + } + boolean plus = tok.equals("+"); + if (! st.hasMoreTokens()) { + throw new InvalidDateException("Missing hour field"); + } + int tzhour = Integer.parseInt(st.nextToken()); + int tzmin = 0; + if (check(st, ":") && (st.hasMoreTokens())) { + tzmin = Integer.parseInt(st.nextToken()); + } else { + throw new InvalidDateException("Missing minute field"); + } + if (plus) { + calendar.add(Calendar.HOUR, -tzhour); + calendar.add(Calendar.MINUTE, -tzmin); + } else { + calendar.add(Calendar.HOUR, tzhour); + calendar.add(Calendar.MINUTE, tzmin); + } + } + } catch (NumberFormatException ex) { + throw new InvalidDateException("["+ex.getMessage()+ + "] is not an integer"); + } + return calendar; + } + + /** + * Parse the given string in ISO 8601 format and build a Date object. + * @param isodate the date in ISO 8601 format + * @return a Date instance + * @exception InvalidDateException if the date is not valid + */ + public static Date parse(String isodate) + throws InvalidDateException + { + Calendar calendar = getCalendar(isodate); + return calendar.getTime(); + } + + private static String twoDigit(int i) { + if (i >=0 && i < 10) { + return "0"+String.valueOf(i); + } + return String.valueOf(i); + } + + /** + * Generate a ISO 8601 date + * @param date a Date instance + * @return a string representing the date in the ISO 8601 format + */ + public static String getIsoDate(Date date) { + TimeZone timeZone = TimeZone.getDefault(); + Calendar calendar = new GregorianCalendar(timeZone); + calendar.setTime(date); + StringBuffer buffer = new StringBuffer(); + buffer.append(calendar.get(Calendar.YEAR)); + buffer.append("-"); + buffer.append(twoDigit(calendar.get(Calendar.MONTH) + 1)); + buffer.append("-"); + buffer.append(twoDigit(calendar.get(Calendar.DAY_OF_MONTH))); + buffer.append("T"); + buffer.append(twoDigit(calendar.get(Calendar.HOUR_OF_DAY))); + buffer.append(":"); + buffer.append(twoDigit(calendar.get(Calendar.MINUTE))); + buffer.append(":"); + buffer.append(twoDigit(calendar.get(Calendar.SECOND))); + buffer.append("."); + buffer.append(twoDigit(calendar.get(Calendar.MILLISECOND) / 10)); + int offset = timeZone.getOffset(date.getTime()); + if (offset >= 0) { + buffer.append('+'); + } else { + buffer.append('-'); + offset = -offset; + } + int hours = offset / (60 * 60 * 1000); + int minutes = (offset - hours * (60 * 60 * 1000)) / (60 * 1000); + if (hours < 10) { + buffer.append('0'); + } + buffer.append(hours); + buffer.append(':'); + if (hours < 10) { + buffer.append('0'); + } + buffer.append(minutes); + return buffer.toString(); + } + + /** + * Generate a ISO 8601 date + * @param date a Date instance + * @return a string representing the date in the ISO 8601 format + */ + public static String getIsoDateNoMillis(Date date) { + TimeZone timeZone = TimeZone.getDefault(); + Calendar calendar = new GregorianCalendar(timeZone); + calendar.setTime(date); + StringBuffer buffer = new StringBuffer(); + buffer.append(calendar.get(Calendar.YEAR)); + buffer.append("-"); + buffer.append(twoDigit(calendar.get(Calendar.MONTH) + 1)); + buffer.append("-"); + buffer.append(twoDigit(calendar.get(Calendar.DAY_OF_MONTH))); + buffer.append("T"); + buffer.append(twoDigit(calendar.get(Calendar.HOUR_OF_DAY))); + buffer.append(":"); + buffer.append(twoDigit(calendar.get(Calendar.MINUTE))); + buffer.append(":"); + buffer.append(twoDigit(calendar.get(Calendar.SECOND))); + int offset = timeZone.getOffset(date.getTime()); + if (offset >= 0) { + buffer.append('+'); + } else { + buffer.append('-'); + offset = -offset; + } + int hours = offset / (60 * 60 * 1000); + int minutes = (offset - hours * (60 * 60 * 1000)) / (60 * 1000); + if (hours < 10) { + buffer.append('0'); + } + buffer.append(hours); + buffer.append(':'); + if (hours < 10) { + buffer.append('0'); + } + buffer.append(minutes); + return buffer.toString(); + } + + public static void test(String isodate) { + System.out.println("----------------------------------"); + try { + Date date = parse(isodate); + System.out.println(">> "+isodate); + System.out.println(">> "+date.toString()+" ["+date.getTime()+"]"); + System.out.println(">> "+getIsoDate(date)); + } catch (InvalidDateException ex) { + System.err.println(isodate+" is invalid"); + System.err.println(ex.getMessage()); + } + System.out.println("----------------------------------"); + } + + public static void test(Date date) { + String isodate = null; + System.out.println("----------------------------------"); + try { + System.out.println(">> "+date.toString()+" ["+date.getTime()+"]"); + isodate = getIsoDate(date); + System.out.println(">> "+isodate); + date = parse(isodate); + System.out.println(">> "+date.toString()+" ["+date.getTime()+"]"); + } catch (InvalidDateException ex) { + System.err.println(isodate+" is invalid"); + System.err.println(ex.getMessage()); + } + System.out.println("----------------------------------"); + } + + public static void main(String args[]) { + test("1997-07-16T19:20:30.45-02:00"); + test("1997-07-16T19:20:30+01:00"); + test("1997-07-16T19:20:30+01:00"); + test("1997-07-16T12:20:30-06:00"); + test("1997-07-16T19:20"); + test("1997-07-16"); + test("1997-07"); + test("1997"); + test(new Date()); + } + +} diff --git a/src/net/sourceforge/align/util/date/InvalidDateException.java b/src/net/sourceforge/align/util/date/InvalidDateException.java new file mode 100755 index 0000000..c27e7ba --- /dev/null +++ b/src/net/sourceforge/align/util/date/InvalidDateException.java @@ -0,0 +1,17 @@ +package net.sourceforge.align.util.date; + +/** + * This exception is thrown by {@link DateParser} when it encounters an + * invalid date. + * + * @author loomchild + */ +public class InvalidDateException extends RuntimeException { + + private static final long serialVersionUID = 7608394842578468135L; + + public InvalidDateException(String message) { + super(message); + } + +} diff --git a/trash/.svn/all-wcprops b/trash/.svn/all-wcprops new file mode 100644 index 0000000..f8b5421 --- /dev/null +++ b/trash/.svn/all-wcprops @@ -0,0 +1,287 @@ +K 25 +svn:wc:ra_dav:version-url +V 46 +/svnroot/align/!svn/ver/44/trunk/maligna/trash +END +moore2.txt +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/align/!svn/ver/40/trunk/maligna/trash/moore2.txt +END +LexiconAligner.java +K 25 +svn:wc:ra_dav:version-url +V 66 +/svnroot/align/!svn/ver/42/trunk/maligna/trash/LexiconAligner.java +END +Trainer.java +K 25 +svn:wc:ra_dav:version-url +V 58 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/Trainer.java +END +readme_jimmy.htm +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/44/trunk/maligna/trash/readme_jimmy.htm +END +LanguageRule.java +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/LanguageRule.java +END +SimpleTaskTest.java +K 25 +svn:wc:ra_dav:version-url +V 65 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/SimpleTaskTest.java +END +SentenceSegmentator.java +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/SentenceSegmentator.java +END +AlignmentTest.java +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/AlignmentTest.java +END +moore.txt +K 25 +svn:wc:ra_dav:version-url +V 56 +/svnroot/align/!svn/ver/40/trunk/maligna/trash/moore.txt +END +trash.txt +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/trash.txt +END +SrxSplitAlgorithmImpl.java +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/SrxSplitAlgorithmImpl.java +END +documentx.xml +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/32/trunk/maligna/trash/documentx.xml +END +loomchild-util-1.3.9.jar +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/align/!svn/ver/58/trunk/maligna/trash/loomchild-util-1.3.9.jar +END +ChildRegion.java +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/ChildRegion.java +END +LengthBasedAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 75 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/LengthBasedAlgorithmTest.java +END +Segamentator.java +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/Segamentator.java +END +ParentRegion.java +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/ParentRegion.java +END +XmlHandler.java +K 25 +svn:wc:ra_dav:version-url +V 61 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/XmlHandler.java +END +Translation.java +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/Translation.java +END +CommonAlgorithmTest.java +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/CommonAlgorithmTest.java +END +SrxSplitAlgorithm.java +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/SrxSplitAlgorithm.java +END +Entry.java +K 25 +svn:wc:ra_dav:version-url +V 56 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/Entry.java +END +AbstractAligner.java +K 25 +svn:wc:ra_dav:version-url +V 66 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/AbstractAligner.java +END +WordNotFoundException.java +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/WordNotFoundException.java +END +simpleinput.txt +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/align/!svn/ver/32/trunk/maligna/trash/simpleinput.txt +END +XmlErrorHandler.java +K 25 +svn:wc:ra_dav:version-url +V 66 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/XmlErrorHandler.java +END +SrxSplitAlgorithmMock.java +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/SrxSplitAlgorithmMock.java +END +SeparatorSegmentator.java +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/SeparatorSegmentator.java +END +MooreCategoryList.java +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/align/!svn/ver/42/trunk/maligna/trash/MooreCategoryList.java +END +ParserException.java +K 25 +svn:wc:ra_dav:version-url +V 66 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/ParserException.java +END +XmlParser.java +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/XmlParser.java +END +XmlParserTest.java +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/XmlParserTest.java +END +DOMXmlParser.java +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/DOMXmlParser.java +END +align.tar.gz +K 25 +svn:wc:ra_dav:version-url +V 59 +/svnroot/align/!svn/ver/56/trunk/maligna/trash/align.tar.gz +END +align.bat +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/align.bat +END +FormatterException.java +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/FormatterException.java +END +RegionOld.java +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/RegionOld.java +END +Region.java +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/Region.java +END +PlaintextParserOldTest.java +K 25 +svn:wc:ra_dav:version-url +V 73 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/PlaintextParserOldTest.java +END +Main.java +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/Main.java +END +PlaintextParserOld.java +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/PlaintextParserOld.java +END +PlaintextParserTest.java +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/PlaintextParserTest.java +END +AlignJob.java +K 25 +svn:wc:ra_dav:version-url +V 59 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/AlignJob.java +END +PlaintextParser.java +K 25 +svn:wc:ra_dav:version-url +V 66 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/PlaintextParser.java +END +Parser.java +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/Parser.java +END +RegionInt.java +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/RegionInt.java +END +IgnoreDTDEntityResolver.java +K 25 +svn:wc:ra_dav:version-url +V 74 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/IgnoreDTDEntityResolver.java +END diff --git a/trash/.svn/entries b/trash/.svn/entries new file mode 100644 index 0000000..4be9e16 --- /dev/null +++ b/trash/.svn/entries @@ -0,0 +1,976 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/trash +https://align.svn.sourceforge.net/svnroot/align + + + +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +comparatornew +dir + +moore2.txt +file + + + + +2008-07-28T17:39:05.000000Z +1eb1764e76a972514773ecef0fa4571c +2009-09-01T19:06:52.277402Z +40 +jarekl + + + + + + + + + + + + + + + + + + + + + +2827 + +LexiconAligner.java +file + + + + +2010-10-20T07:38:50.000000Z +1f6e1c1b559f3b72d12b5bc1fbf58087 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +1285 + +Trainer.java +file + + + + +2008-08-20T21:14:47.000000Z +2cecb617ac0fd551bbcc89e051f881cb +2008-01-14T15:11:50.564431Z +6 +jarekl + +Splitter.java +file +54 + + + + + + + + + + + + + + + + + + + +deleted + +readme_jimmy.htm +file + + + + +2010-11-10T09:20:03.000000Z +28c6b2a47ddc831abd5362c90bc3b5be +2010-11-11T11:07:59.278997Z +44 +jarekl + + + + + + + + + + + + + + + + + + + + + +10107 + +LanguageRule.java +file + + + + +2008-08-20T21:14:47.000000Z +957b09429734a0c6650e6773934a2d3b +2008-01-14T15:11:50.564431Z +6 +jarekl + +example +dir + +SimpleTaskTest.java +file + + + + +2008-08-20T21:14:47.000000Z +0a68fe8c6433bdc728e00d9334589e61 +2008-01-14T15:11:50.564431Z +6 +jarekl + +SentenceSegmentator.java +file + + + + +2008-08-20T21:14:48.000000Z +80d66f42f50b42079fca8d61d7b46d0c +2008-01-14T15:11:50.564431Z +6 +jarekl + +AlignmentTest.java +file + + + + +2008-08-20T21:14:48.000000Z +8625c2db1c7c5d30efc3aec23b87f930 +2008-01-14T15:11:50.564431Z +6 +jarekl + +moore.txt +file + + + + +2008-07-25T06:39:00.000000Z +54f67692501ce142af5f2c8d3cf9c725 +2009-09-01T19:06:52.277402Z +40 +jarekl + + + + + + + + + + + + + + + + + + + + + +488 + +trash.txt +file + + + + +2008-08-20T21:14:48.000000Z +e9e61e7e4c1478b697d14cdfb5bdc8b3 +2008-01-14T15:11:50.564431Z +6 +jarekl + +SrxSplitAlgorithmImpl.java +file + + + + +2008-08-20T21:14:48.000000Z +376e903ac1e3f21d3ca52963182a0b65 +2008-01-14T15:11:50.564431Z +6 +jarekl + +task +dir + +documentx.xml +file + + + + +2009-04-15T07:12:23.000000Z +7a10aa9ae79ea983e428437bdd7668f3 +2009-04-15T07:14:58.474012Z +32 +jarekl + + + + + + + + + + + + + + + + + + + + + +146 + +loomchild-util-1.3.9.jar +file +58 + + + +2009-05-28T12:10:18.000000Z +fbc19d331784e942bf9f5c83c39d609b +2011-10-24T12:02:57.921746Z +58 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +75616 + +comparatorold +dir + +vocabulary +dir + +LengthBasedAlgorithmTest.java +file + + + + +2008-08-20T21:14:48.000000Z +eb3f6f583b583d7e43209dc3c40697e8 +2008-01-14T15:11:50.564431Z +6 +jarekl + +ChildRegion.java +file + + + + +2008-08-20T21:14:48.000000Z +af9283650ece63f939ee333a244f8485 +2008-01-14T15:11:50.564431Z +6 +jarekl + +Segamentator.java +file + + + + +2008-08-20T21:14:48.000000Z +05b087c265ad9dedf6a20822149e8070 +2008-01-14T15:11:50.564431Z +6 +jarekl + +srx +dir + + + + + + + + + + + + + + + + + + + + +deleted + +ParentRegion.java +file + + + + +2008-08-20T21:14:49.000000Z +b291f2e1ac5f766a5048b26109b24377 +2008-01-14T15:11:50.564431Z +6 +jarekl + +XmlHandler.java +file + + + + +2008-08-20T21:14:49.000000Z +17a208175ff964ac5b156820229fa0da +2008-01-14T15:11:50.564431Z +6 +jarekl + +Translation.java +file + + + + +2008-08-20T21:14:49.000000Z +254ef7319321b60026311196984a8092 +2008-01-14T15:11:50.564431Z +6 +jarekl + +SrxSplitAlgorithm.java +file + + + + +2008-08-20T21:14:49.000000Z +0edfefb13d0b6677c4553dfee7c22b5d +2008-01-14T15:11:50.564431Z +6 +jarekl + +CommonAlgorithmTest.java +file + + + + +2008-08-20T21:14:49.000000Z +5cb4404d85765060c1d7e77779c2c867 +2008-01-14T15:11:50.564431Z +6 +jarekl + +Entry.java +file + + + + +2008-08-20T21:14:49.000000Z +7e0509df74976786addb3aad26191790 +2008-01-14T15:11:50.564431Z +6 +jarekl + +xpath +dir + +AbstractAligner.java +file + + + + +2008-08-20T21:14:50.000000Z +11ba4e8ea6ebd476092afc86d02b5bee +2008-01-14T15:11:50.564431Z +6 +jarekl + +WordNotFoundException.java +file + + + + +2008-08-20T21:14:50.000000Z +5906cb08fd2accc2b0f390cd8c33c664 +2008-01-14T15:11:50.564431Z +6 +jarekl + +simpleinput.txt +file + + + + +2008-08-20T21:15:18.000000Z +f5d0211053693ef131a3430e0519f814 +2009-04-15T07:14:58.474012Z +32 +jarekl + + + + + + + + + + + + + + + + + + + + + +64 + +XmlErrorHandler.java +file + + + + +2008-08-20T21:14:50.000000Z +bce4d530adefabd17d4fbe5125a120ff +2008-01-14T15:11:50.564431Z +6 +jarekl + +SeparatorSegmentator.java +file + + + + +2008-08-20T21:14:50.000000Z +d20e838a873296494f4694ae113d90eb +2008-01-14T15:11:50.564431Z +6 +jarekl + +SrxSplitAlgorithmMock.java +file + + + + +2008-08-20T21:14:50.000000Z +e1b8f60ca21649d15bcd341be541feac +2008-01-14T15:11:50.564431Z +6 +jarekl + +ParserException.java +file + + + + +2008-08-20T21:14:50.000000Z +2c559fcd86ac91449af606fa40697653 +2008-01-14T15:11:50.564431Z +6 +jarekl + +MooreCategoryList.java +file + + + + +2010-10-17T22:18:16.000000Z +157ce563abaa82b20b9cd1fd49695183 +2010-11-02T23:37:42.328942Z +42 +jarekl + + + + + + + + + + + + + + + + + + + + + +590 + +DOMXmlParser.java +file + + + + +2008-08-20T21:14:50.000000Z +f69bdec1b43883ec9df132748676c08f +2008-01-14T15:11:50.564431Z +6 +jarekl + +XmlParser.java +file + + + + +2008-08-20T21:14:50.000000Z +0680db57c3346c7f2ef313922d858e76 +2008-01-14T15:11:50.564431Z +6 +jarekl + +XmlParserTest.java +file + + + + +2008-08-20T21:14:50.000000Z +69a9b5af8a33f642179ebfa5958fb326 +2008-01-14T15:11:50.564431Z +6 +jarekl + +emo.txt +file +54 + + + + + + + + + + + + + + + + + + + +deleted + +align.tar.gz +file +56 + + + +2011-04-13T20:10:28.000000Z +5346da6534264cef9ac24a4848638d1b +2011-10-21T11:38:21.267762Z +56 +jarekl +has-props + + + + + + + + + + + + + + + + + + + + +198660 + +align.bat +file + + + + +2008-08-20T21:14:51.000000Z +8986919d7ceeb44ccf3292839b15c5c8 +2008-01-14T15:11:50.564431Z +6 +jarekl + +RegionOld.java +file + + + + +2008-08-20T21:14:51.000000Z +5eda6f5e09ef7c6d9dc3d79ae54d7e29 +2008-01-14T15:11:50.564431Z +6 +jarekl + +FormatterException.java +file + + + + +2008-08-20T21:14:51.000000Z +05fbc918b3bb20ecbb87058cb38b41b0 +2008-01-14T15:11:50.564431Z +6 +jarekl + +reader +dir + + + + + + + + + + + + + + + + + + + + +deleted + +Region.java +file + + + + +2008-08-20T21:14:52.000000Z +266ce72e96fb6f542cbc8bd2834a8ed5 +2008-01-14T15:11:50.564431Z +6 +jarekl + +PlaintextParserOldTest.java +file + + + + +2008-08-20T21:14:52.000000Z +8c2399bf643359cf55124381dbc27597 +2008-01-14T15:11:50.564431Z +6 +jarekl + +PlaintextParserOld.java +file + + + + +2008-08-20T21:14:52.000000Z +52dcc64ba5ad0dbc094f54119fed1566 +2008-01-14T15:11:50.564431Z +6 +jarekl + +Main.java +file + + + + +2008-08-20T21:14:52.000000Z +de2cd217f39874b46faa7a4d15809e72 +2008-01-14T15:11:50.564431Z +6 +jarekl + +SplitterException.java +file +54 + + + + + + + + + + + + + + + + + + + +deleted + +PlaintextParserTest.java +file + + + + +2008-08-20T21:14:52.000000Z +3f1425756dff170ee37904f6118d5458 +2008-01-14T15:11:50.564431Z +6 +jarekl + +PlaintextParser.java +file + + + + +2008-08-20T21:14:53.000000Z +73dd0272e46ca5f101b4eeba993e7b71 +2008-01-14T15:11:50.564431Z +6 +jarekl + +AlignJob.java +file + + + + +2008-08-20T21:14:52.000000Z +0c3813c8da83331f41f9d460eff97333 +2008-01-14T15:11:50.564431Z +6 +jarekl + +BestCategoryList.java +file +54 + + + + + + + + + + + + + + + + + + + +deleted + +SplittersTest.java +file +54 + + + + + + + + + + + + + + + + + + + +deleted + +Parser.java +file + + + + +2008-08-20T21:14:53.000000Z +4b7640fa48d3791279cff60dc04ffc1f +2008-01-14T15:11:50.564431Z +6 +jarekl + +RegionInt.java +file + + + + +2008-08-20T21:14:53.000000Z +7f039841e766d2cd93fe116f5dfaa4af +2008-01-14T15:11:50.564431Z +6 +jarekl + +IgnoreDTDEntityResolver.java +file + + + + +2008-08-20T21:14:53.000000Z +5686376d188de97954c1863c12f85a36 +2008-01-14T15:11:50.564431Z +6 +jarekl + diff --git a/trash/.svn/prop-base/align.tar.gz.svn-base b/trash/.svn/prop-base/align.tar.gz.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/trash/.svn/prop-base/align.tar.gz.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/trash/.svn/prop-base/loomchild-util-1.3.9.jar.svn-base b/trash/.svn/prop-base/loomchild-util-1.3.9.jar.svn-base new file mode 100644 index 0000000..dbc918b --- /dev/null +++ b/trash/.svn/prop-base/loomchild-util-1.3.9.jar.svn-base @@ -0,0 +1,9 @@ +K 14 +svn:executable +V 1 +* +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/trash/.svn/text-base/AbstractAligner.java.svn-base b/trash/.svn/text-base/AbstractAligner.java.svn-base new file mode 100755 index 0000000..d4136f4 --- /dev/null +++ b/trash/.svn/text-base/AbstractAligner.java.svn-base @@ -0,0 +1,56 @@ +package align.aligner; + +import java.util.Collections; +import java.util.List; + +import align.data.Alignment; + +/** + * Reprezentuje abstakcyjny aligner sprawdzający wejście i w razie możliwości + * zwracający od razu wynik albo przekazujący sterowanie do konkretnej + * implementacji. + * + * @author Jarek Lipski (loomchild) + */ +public abstract class AbstractAligner implements Aligner { + + /** + * Dopasowywuje do siebie listy segmentów. Jeśli obie listy są puste + * zwraca pustą liste. Jeśli jedna z list jest pusta zwraca jedno + * dopasowanie wiele do zera. W przeciwnym wypadku wywołuje metode + * klasy potomnej dokonującą właściwego dopasowania. + * @param sourceSegmentList Lista segmentów tekstu źródłowego. + * @param targetSegmentList Lista segmentów tekstu docelowego. + * @return Zwraca listę dopasowań która obejmuje wszystkie segmenty obu tekstów. + * @throws AlignmentImpossibleException Zgłaszany przez klase pochodną gdy nie da się dopasować tekstów. + */ + public List align(List sourceSegmentList, + List targetSegmentList) throws AlignmentImpossibleException { + List alignmentList; + if (sourceSegmentList.size() == 0 && targetSegmentList.size() == 0) { + alignmentList = Collections.emptyList(); + } else if (sourceSegmentList.size() == 0) { + alignmentList = align.aligner.Utils.alignZeroToSegmentList( + targetSegmentList); + } else if (targetSegmentList.size() == 0) { + alignmentList = align.aligner.Utils.alignSegmentListToZero( + sourceSegmentList); + } else { + //Zastosowanie właściwego algorytmu gdy listy niepuste. + alignmentList = alignNotEmpty(sourceSegmentList, targetSegmentList); + } + return alignmentList; + } + + /** + * Właściwa implementacja algorytmu dopasowywania niepustych list segmentów. + * @param sourceSegmentList Lista segmentów tekstu źródłowego. + * @param targetSegmentList Lista segmentów tekstu docelowego. + * @return Zwraca listę dopasowań która obejmuje wszystkie segmenty obu tekstów. + * @throws AlignmentImpossibleException Zgłaszany gdy nie da się dopasować tekstów. + */ + protected abstract List alignNotEmpty( + List sourceSegmentList, List targetSegmentList) + throws AlignmentImpossibleException; + +} diff --git a/trash/.svn/text-base/AlignJob.java.svn-base b/trash/.svn/text-base/AlignJob.java.svn-base new file mode 100755 index 0000000..3dd6273 --- /dev/null +++ b/trash/.svn/text-base/AlignJob.java.svn-base @@ -0,0 +1,29 @@ +package align.job; + +import java.util.List; + +import align.Alignment; +import align.formatter.Formatter; +import align.loader.Loader; +import align.task.Task; + +public class AlignJob implements Job { + + private Loader loader; + private Formatter formatter; + private Task task; + + public AlignJob(Loader loader, Task task, Formatter formatter) { + this.loader = loader; + this.formatter = formatter; + this.task = task; + } + + public void run() { + String sourceString = loader.loadSourceString(); + String targetString = loader.loadTargetString(); + List alignment = task.run(sourceString, targetString); + formatter.format(alignment); + } + +} diff --git a/trash/.svn/text-base/AlignmentTest.java.svn-base b/trash/.svn/text-base/AlignmentTest.java.svn-base new file mode 100755 index 0000000..672befb --- /dev/null +++ b/trash/.svn/text-base/AlignmentTest.java.svn-base @@ -0,0 +1,63 @@ +package align; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import junit.framework.TestCase; + +public class AlignmentTest extends TestCase { + + private List sourceSegmentList; + + private List targetSegmentList; + + public void setUp() { + sourceSegmentList = new LinkedList(); + targetSegmentList = new LinkedList(); + } + + /** + * Testuje czy po utworzeniu dopasowania listy są niezależne od argumentów. + */ + public void testContructorListCopying() { + Alignment alignment = new Alignment(sourceSegmentList, + targetSegmentList, 2.0f); + checkAlignment(alignment); + } + + /** + * Testuje czy po dodaniu list do dopasowania są one niezależne od + * argumentów. + */ + public void testMethodListCopying() { + Alignment alignment = new Alignment(); + alignment.addSourceSegmentList(sourceSegmentList); + alignment.addTargetSegmentList(targetSegmentList); + alignment.setScore(2.0f); + checkAlignment(alignment); + } + + private void checkAlignment(Alignment alignment) { + assertEquals(0, alignment.getSourceSegmentList().size()); + sourceSegmentList.add("a"); + assertEquals(0, alignment.getSourceSegmentList().size()); + assertEquals(0, alignment.getTargetSegmentList().size()); + targetSegmentList.add("c"); + assertEquals(0, alignment.getTargetSegmentList().size()); + assertEquals(2.0f, alignment.getScore(), 0.000000001f); + } + + public void testMerge() { + Alignment alignment = new Alignment(); + alignment.addSourceSegmentList( + Arrays.asList(new String[]{"aa", "", "bbb"})); + alignment.addTargetSegmentList(Arrays.asList(new String[]{})); + String merged = alignment.getMergedSourceSegment(); + assertEquals("aabbb", merged); + merged = alignment.getMergedTargetSegment(); + assertEquals("", merged); + } + + +} diff --git a/trash/.svn/text-base/ChildRegion.java.svn-base b/trash/.svn/text-base/ChildRegion.java.svn-base new file mode 100755 index 0000000..4f968ed --- /dev/null +++ b/trash/.svn/text-base/ChildRegion.java.svn-base @@ -0,0 +1,33 @@ +package regions; + +import java.util.Collections; +import java.util.List; + + +/** + * Represents leaf region in document (is plain text), has no children + * and no name. . + * @author loomchild + */ +public class ChildRegion extends Region { + + public ChildRegion(ParentRegion parent, String content) { + super(parent); + this.content = content; + } + + public String getContent() { + return content; + } + + public int getLength() { + return content.length(); + } + + public List getChildren() { + return Collections.emptyList(); + } + + private String content; + +} diff --git a/trash/.svn/text-base/CommonAlgorithmTest.java.svn-base b/trash/.svn/text-base/CommonAlgorithmTest.java.svn-base new file mode 100755 index 0000000..54298d8 --- /dev/null +++ b/trash/.svn/text-base/CommonAlgorithmTest.java.svn-base @@ -0,0 +1,89 @@ +package align.filter.aligner.align; + +import static loomchild.util.testing.Utils.assertListEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import align.Alignment; +import align.filter.aligner.align.algorithm.galechurch.GaleChurchAlignAlgorithm; +import align.filter.aligner.align.algorithm.moore.MooreAlignAlgorithm; +import align.filter.aligner.align.onetoone.OneToOneAlgorithm; + +/** + * Test wykonywany dla wszystkich alignerów, testujący ich wspólne cechy. + * Nowe alignery trzeba dodać w odpowidniej metodzie inicjalizującej. + * + * @author Jarek Lipski (loomchild) + */ +public class CommonAlgorithmTest { + + private List alignerList; + + @Before + public void setUp() { + this.alignerList = createAlignerList(); + } + + /** + * Testuje czy próba dopasowania pustych list zwraca pustą liste dopasowań. + */ + @Test + public void alignZeroToZeroReturnsEmptyList() { + for (AlignAlgorithm aligner : alignerList) { + checkAlignZeroToZeroReturnsEmptyList(aligner); + } + } + + public void checkAlignZeroToZeroReturnsEmptyList(AlignAlgorithm aligner) { + List alignmentList = aligner.align( + Arrays.asList(new String[]{}), Arrays.asList(new String[]{})); + assertEquals(0, alignmentList.size()); + } + + @Test + public void noOmissions() { + for (AlignAlgorithm aligner : alignerList) { + try { + checkNoOmissions(aligner); + } catch (AlignmentImpossibleException e) { + //ignoruje alignery które nie mogą dopasowywać danych testowych + //może zrobić oddzielną grupę alignerów albo zmienić test + } + } + } + + public void checkNoOmissions(AlignAlgorithm aligner) { + String[] sourceArray = new String[]{"a", "b", "c", "d", "ee"}; + String[] targetArray = new String[]{"1", "2", ""}; + List alignmentList = aligner.align( + Arrays.asList(sourceArray), Arrays.asList(targetArray)); + List alignedSourceList = new LinkedList(); + List alignedTargetList = new LinkedList(); + for (Alignment alignment : alignmentList) { + alignedSourceList.addAll(alignment.getSourceSegmentList()); + alignedTargetList.addAll(alignment.getTargetSegmentList()); + } + assertListEquals(sourceArray, alignedSourceList); + assertListEquals(targetArray, alignedTargetList); + } + + /** + * Miejsce do umieszczania wszystkich alignerów do przetestowania. + */ + private List createAlignerList() { + List alignerList = new LinkedList(); + + alignerList.add(new OneToOneAlgorithm()); + alignerList.add(new GaleChurchAlignAlgorithm()); + alignerList.add(new MooreAlignAlgorithm()); + + return alignerList; + } + +} diff --git a/trash/.svn/text-base/DOMXmlParser.java.svn-base b/trash/.svn/text-base/DOMXmlParser.java.svn-base new file mode 100755 index 0000000..b29c6a4 --- /dev/null +++ b/trash/.svn/text-base/DOMXmlParser.java.svn-base @@ -0,0 +1,106 @@ +package parsers; + +import java.io.IOException; +import java.io.Reader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import regions.ChildRegion; +import regions.ParentRegion; +import regions.Region; +import exceptions.InitializationException; + +public class XmlParser implements Parser { + + { + builderFactory = DocumentBuilderFactory.newInstance(); + builderFactory.setNamespaceAware(false); //We are not using namespaces + builderFactory.setValidating(false); //Disable DTD + builderFactory.setIgnoringComments(true); //Ignore comments + builderFactory.setIgnoringElementContentWhitespace(false); //We don't ignore whitespaces because parser must be in validating mode to do this + } + + public static XmlParser getInstance() { + return instance; + } + + public Region parse(Reader input) throws ParserException { + Document document = parseOnly(input); + Element element = document.getDocumentElement(); + return parseElement(null, element); + } + + /** + * Creates nonvalidating parser. + */ + private XmlParser() { + initializeBuilder(); + } + + /** + * Parse given file and return DOM document. + */ + private Document parseOnly(Reader input) throws ParserException { + try { + Document document = builder.parse(new InputSource(input)); + return document; + } catch (SAXException e) { + throw new ParserException("Parsing error", e); + } catch (IOException e) { + throw new ParserException("IO error", e); + } + } + + private Region parseElement(ParentRegion parent, Element node) { + NodeList nodeList = node.getChildNodes(); + if ((nodeList.getLength() == 1) && (nodeList.item(0) instanceof Text)) { + return new ChildRegion(parent, node.getNodeValue()); + } else if (node instanceof Element) { + Element element = (Element)node; + ParentRegion region = new ParentRegion(parent, + element.getNodeName()); + for (int i = 0; i < nodeList.getLength(); ++i) { + Node domNode = nodeList.item(i); + if (domNode instanceof Element) { + Region child = parseElement(region, (Element)domNode); + if (child != null) { + region.addChild(child); + } + } + } + return region; + } else { + return null; + } + } + + /** + * Initialize document builder - parser. + */ + private void initializeBuilder() { + try { + builder = builderFactory.newDocumentBuilder(); + //Handle normal errors the same as fatal errors + builder.setErrorHandler(new XmlErrorHandler()); + } catch (ParserConfigurationException e) { + throw new InitializationException("Could not create XML parser: " + e.getMessage()); + } + } + + private static XmlParser instance = new XmlParser(); + + private static DocumentBuilderFactory builderFactory; + + private DocumentBuilder builder; + +} diff --git a/trash/.svn/text-base/Entry.java.svn-base b/trash/.svn/text-base/Entry.java.svn-base new file mode 100755 index 0000000..dee6f09 --- /dev/null +++ b/trash/.svn/text-base/Entry.java.svn-base @@ -0,0 +1,37 @@ +package align.aligner.aligners.moore.models; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +public class Entry { + + private List translationList; + + public Entry() { + this.translationList = new ArrayList(); + } + + public List getTranslationList() { + return Collections.unmodifiableList(translationList); + } + + public void addTranslation(Translation translation) { + translationList.add(translation); + } + + public void removeTranslation(Translation translation) { + translationList.remove(translation); + } + + public float getProbability(String word) { + int index = translationList.indexOf(word); + if (index != -1) { + return translationList.get(index).getProbability(); + } else { + return 0.0f; + } + } + +} diff --git a/trash/.svn/text-base/FormatterException.java.svn-base b/trash/.svn/text-base/FormatterException.java.svn-base new file mode 100755 index 0000000..69f9acf --- /dev/null +++ b/trash/.svn/text-base/FormatterException.java.svn-base @@ -0,0 +1,30 @@ +package align.formatter; + +/** + * Reprezentuje wyjątek który wystąpił podczas formatowania listy dopasowań. + * + * @author Jarek Lipski (loomchild) + */ +public class FormatterException extends Exception { + + private static final long serialVersionUID = 102L; + + /** + * Tworzy wyjątek. + * @param message Wiadomość. + */ + public FormatterException(String message) { + this(message, null); + } + + /** + * Tworzy wyjątek spowodowany przez inny wyjątek. + * @param message Wiadomość. + * @param cause Przyczyna. + */ + public FormatterException(String message, Throwable cause) { + super(message, cause); + } + + +} diff --git a/trash/.svn/text-base/IgnoreDTDEntityResolver.java.svn-base b/trash/.svn/text-base/IgnoreDTDEntityResolver.java.svn-base new file mode 100755 index 0000000..2d5b9bc --- /dev/null +++ b/trash/.svn/text-base/IgnoreDTDEntityResolver.java.svn-base @@ -0,0 +1,20 @@ +package align.util.bind; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +public class IgnoreDTDEntityResolver implements EntityResolver { + + public IgnoreDTDEntityResolver() { + } + + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + return new InputSource(new ByteArrayInputStream(new byte[0])); + } + +} diff --git a/trash/.svn/text-base/LanguageRule.java.svn-base b/trash/.svn/text-base/LanguageRule.java.svn-base new file mode 100755 index 0000000..74dd541 --- /dev/null +++ b/trash/.svn/text-base/LanguageRule.java.svn-base @@ -0,0 +1,77 @@ +package split.srx; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.PriorityQueue; + +import common.Region; + +public class LanguageRule { + + + public LanguageRule() { + ruleList = new LinkedList(); + } + + public List split(String text, Settings settings) { + // TODO zaimplemetnwoać brakujące sytuacje jeśli to konieczne + assert settings.isSegmentSubflows() == false; + assert settings.isIncludeIsolated() == true; + // To byłoby bez sensu (chyba?) + assert !(settings.isIncludeEnd() && !settings.isIncludeStart()); + + List segmentList = new LinkedList(); + + PriorityQueue queue = + new PriorityQueue(ruleList.size(), + RuleMatcherComparator.getInstance()); + + for (Rule rule : ruleList) { + RuleMatcher matcher = rule.getMatcher(text); + matcher.find(); + queue.add(matcher); + } + + int start = 0; + int position = 0; + while (queue.size() > 0) { + RuleMatcher matcher = queue.peek(); + if (matcher.getRule().isBreaking()) { + String segment = text.substring(start, + matcher.getBreakPosition()); + segmentList.add(segment); + if (settings.isIncludeStart()) { + start = matcher.getStartPosition(); + } else if (settings.isIncludeEnd()) { + start = matcher.getBreakPosition(); + } else { + start = matcher.getEndPosition(); + } + position = start; + } else { + position = matcher.getBreakPosition() + 1; + } + while((queue.size() > 0) && (matcher.getBreakPosition() + < position)) { + queue.remove(); + matcher.find(position); + if (!matcher.hitEnd()) { + queue.add(matcher); + } + matcher = queue.peek(); + } + } + String segment = text.substring(start); + segmentList.add(segment); + return segmentList; + + } + + public void addRule(Rule rule) { + ruleList.add(rule); + } + + private List ruleList; + +} diff --git a/trash/.svn/text-base/LengthBasedAlgorithmTest.java.svn-base b/trash/.svn/text-base/LengthBasedAlgorithmTest.java.svn-base new file mode 100755 index 0000000..b9fab77 --- /dev/null +++ b/trash/.svn/text-base/LengthBasedAlgorithmTest.java.svn-base @@ -0,0 +1,40 @@ +package align.filter.aligner.align; + +import static align.util.Util.assertAlignmentEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +import align.Alignment; + +public class LengthBasedAlgorithmTest { + + @Test + public void testAlign() { + String sourceSegment1 = "very long sentence indeed"; + String sourceSegment2 = "medium sentemce"; + String targetSegment1 = "short 1"; + String targetSegment2 = "short 2"; + String targetSegment3 = "another medium"; + List sourceSegmentList = Arrays.asList(new String[]{ + sourceSegment1, sourceSegment2}); + List targetSegmentList = Arrays.asList(new String[]{ + targetSegment1, targetSegment2, targetSegment3}); + GaleChurchAlignAlgorithm aligner = new GaleChurchAlignAlgorithm(); + List alignmentList = aligner.align(sourceSegmentList, + targetSegmentList); + Alignment alignment; + assertEquals(2, alignmentList.size()); + alignment = alignmentList.get(0); + assertAlignmentEquals(new String[]{sourceSegment1}, + new String[]{targetSegment1, targetSegment2}, alignment); + alignment = alignmentList.get(1); + assertAlignmentEquals(new String[]{sourceSegment2}, + new String[]{targetSegment3}, alignment); + + } + +} diff --git a/trash/.svn/text-base/LexiconAligner.java.svn-base b/trash/.svn/text-base/LexiconAligner.java.svn-base new file mode 100644 index 0000000..7ea1898 --- /dev/null +++ b/trash/.svn/text-base/LexiconAligner.java.svn-base @@ -0,0 +1,51 @@ +package net.sourceforge.align.filter.aligner; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.alignment.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Hard to test if lexicon alignment occurs more than once, + * impossible to have n-0 alignments in lexicon. + * + * @author loomchild + */ +public class LexiconAligner implements Filter { + + private Map> sourceLexiconMap; + + private Map> targetLexiconMap; + + + public LexiconAligner(List lexiconAlignmentList) { + // check that lexicon contains no alignments with zero source or + // target segments + } + + public List apply(List alignmentList) { + // set all matched alignments in result list to have -Inf score. + // make rest of the program ignore such alignments. + List resultList = new ArrayList(); + + /*for (Alignment alignment : alignmentList) { + Iterator sourceIterator = + alignment.getSourceSegmentList().iterator(); + Iterator targetIterator = + alignment.getTargetSegmentList().iterator(); + + Alignment reference + + targetIterator. + + }*/ + + // set marked + + return resultList; + } + +} diff --git a/trash/.svn/text-base/Main.java.svn-base b/trash/.svn/text-base/Main.java.svn-base new file mode 100755 index 0000000..c5a47ee --- /dev/null +++ b/trash/.svn/text-base/Main.java.svn-base @@ -0,0 +1,25 @@ +import java.io.IOException; +import java.util.List; + +import split.srx.Document; +import split.srx.Parser; + +public class Main { + + /** + * @param args + */ + public static void main(String[] args) { + try { + String text = "Przesyłam wam wersje jaką wysłałem. Jako że nikt nie zgłaszał poprawek (poza Grzegorzem z którym godzinkę pogadałem) poszło prawie identyczne jak w niedziele. Jeśli w waszym fragmencie (albo ogólnie) diagram wydaje wam się bezsensowny to będziemy musieli go jeszcze dalej w toku prac zmieniać, bo i tak musimy dobrze pojąć dziedzine jeśli mamy stworzyć porządny projekt. Miejmy nadzieje że nam to zaliczą (bo rysowanie modeli dziedziny to jeszcze nie nauka ścisła, można to zrobić na mnóśtwo sposobów poprawnie, ważne żeby nam to się przydało), ale jeśli dalej nasza współpraca będzie tak wyglądać to projekt będzie beznadziejny. Pamiętajcie że było nie było jesteśmy jednym zespołem i robimy projekt wspólnie więc wszelka dyskusja jest jak najbardziej wskazana. Licze na to że w dalszych częsciach uda nam się problem jasno między nas rozdzielić i ewentualnie dogadywać miejsca w których nasze podzadania będą się łączyć (pewnie niestety będzie ich dużo jak zwykle), bo taka forma pracy widać zawodzi. Dla mnie ten porzedmiot jest trochę nudny i też mi się nie chce nim zajmować (bo to w sumie \"ładne rysunki\", nie wiadmo jak to się sprawdzi w praktyce), ale myśle że teraz będzie już coraz lepiej bo zaczniemy się zajmować nauką bardziej ścisłą od analizy - projektowaniem, gdzie będą czasem jasne wzorce jak coś zrobić a nie tylko domysły."; + Document document = Parser.getInstance().parse("data/test/polsplit.srx"); + List list = document.split(text, "PL_pl", "Default"); + System.out.println(list); + } catch (IOException e) { + e.printStackTrace(); + } catch (XmlException e) { + e.printStackTrace(); + } + } + +} diff --git a/trash/.svn/text-base/MooreCategoryList.java.svn-base b/trash/.svn/text-base/MooreCategoryList.java.svn-base new file mode 100644 index 0000000..edaab4e --- /dev/null +++ b/trash/.svn/text-base/MooreCategoryList.java.svn-base @@ -0,0 +1,28 @@ +package net.sourceforge.align.category.list; + +import java.util.AbstractList; + +import net.sourceforge.align.category.Category; + +/** + * Represents list of categories described in Moore's paper. + * + * @author loomchild + */ +public class MooreCategoryList extends AbstractList { + + private static final Category[] ARRAY = { + new Category(1, 1, 0.94f), + new Category(1, 0, 0.01f), new Category(0, 1, 0.01f), + new Category(2, 1, 0.02f), new Category(1, 2, 0.02f), + }; + + public Category get(int index) { + return ARRAY[index]; + } + + public int size() { + return ARRAY.length; + } + +} diff --git a/trash/.svn/text-base/ParentRegion.java.svn-base b/trash/.svn/text-base/ParentRegion.java.svn-base new file mode 100755 index 0000000..936846d --- /dev/null +++ b/trash/.svn/text-base/ParentRegion.java.svn-base @@ -0,0 +1,68 @@ +package regions; + +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + + +public class ParentRegion extends Region { + + public ParentRegion(ParentRegion parent) { + super(parent); + this.children = new LinkedList(); + } + + public String getContent() { + Iterator i = getChildren().iterator(); + if (i.hasNext()) { + StringBuilder content = new StringBuilder(); + content.append(i.next().getContent()); + while (i.hasNext()) { + content.append(" " + i.next().getContent()); + } + return content.toString(); + } else { + return ""; + } + } + + public int getLength() { + int length = 0; + for (Region child : getChildren()) { + length += child.getLength(); + } + return length; + } + + public List getChildren() { + return Collections.unmodifiableList(children); + } + + /** + * Adds child. + * @param child + */ + public void addChild(Region child) { + children.add(child); + } + + /** + * Removes child. + * @param child + * @return Returns true if child was removed. + */ + public boolean removeChild(Region child) { + return children.remove(child); + } + + /** + * Remove all children from this node. + */ + public void removeAllChildren() { + children.clear(); + } + + private List children; + +} diff --git a/trash/.svn/text-base/Parser.java.svn-base b/trash/.svn/text-base/Parser.java.svn-base new file mode 100755 index 0000000..e526602 --- /dev/null +++ b/trash/.svn/text-base/Parser.java.svn-base @@ -0,0 +1,11 @@ +package parsers; + +import java.io.BufferedReader; + +import regions.Region; + +public interface Parser { + + Region parse(BufferedReader input) throws ParserException; + +} diff --git a/trash/.svn/text-base/ParserException.java.svn-base b/trash/.svn/text-base/ParserException.java.svn-base new file mode 100755 index 0000000..58e8167 --- /dev/null +++ b/trash/.svn/text-base/ParserException.java.svn-base @@ -0,0 +1,15 @@ +package parsers; + +public class ParserException extends Exception { + + public ParserException(String message) { + this(message, null); + } + + public ParserException(String message, Throwable cause) { + super(message, cause); + } + + private static final long serialVersionUID = 100L; + +} diff --git a/trash/.svn/text-base/PlaintextParser.java.svn-base b/trash/.svn/text-base/PlaintextParser.java.svn-base new file mode 100755 index 0000000..2e761de --- /dev/null +++ b/trash/.svn/text-base/PlaintextParser.java.svn-base @@ -0,0 +1,69 @@ +package parsers; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import regions.Region; + +public class PlaintextParser implements Parser { + + public PlaintextParser() { + this.separatorList = new ArrayList(); + } + + public Region parse(BufferedReader input) throws ParserException { + StringBuilder content = new StringBuilder(); + try { + String line = input.readLine(); + while(line != null) { + content.append(line); + line = input.readLine(); + if (line != null) { + content.append('\n'); + } + } + } catch (IOException e) { + throw new ParserException("IO error", e); + } + Region region = new Region(null, content.toString()); + split(region, 0); + return region; + } + + public List getSeparatorList() { + return separatorList; + } + + public void addSeparator(String separator) { + this.separatorList.add(separator); + } + + public void removeSeparator(int nr) { + this.separatorList.remove(nr); + } + + /** + * Splits region using separator with given number from separatorList. + * Recursively calls itself until separatorNr is greater than number of + * separators. + * @param region Region to be splitted, is modified! + * @param separatorNr separator number in separatorList. + */ + private void split(Region region, int separatorNr) { + if (separatorNr < separatorList.size()) { + String content = region.getContent(); + String separator = separatorList.get(separatorNr); + String[] childContentList = content.split(separator); + for(String childContent : childContentList) { + Region child = new Region(region, childContent); + split(child, separatorNr + 1); + region.addChild(child); + } + } + } + + private List separatorList; + +} diff --git a/trash/.svn/text-base/PlaintextParserOld.java.svn-base b/trash/.svn/text-base/PlaintextParserOld.java.svn-base new file mode 100755 index 0000000..e3b9d1c --- /dev/null +++ b/trash/.svn/text-base/PlaintextParserOld.java.svn-base @@ -0,0 +1,66 @@ +package parsers; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import regions.Region; + +public class PlaintextParser implements Parser { + + public PlaintextParser() { + this.separatorList = new ArrayList(); + } + + public Region parse(BufferedReader input) throws ParserException { + StringBuilder content = new StringBuilder(); + String line; + try { + while((line = input.readLine()) != null) { + content.append(line); + content.append('\n'); + } + } catch (IOException e) { + throw new ParserException("IO error", e); + } + Region region = new Region(null, content.toString()); + split(region, 0); + return region; + } + + public List getSeparatorList() { + return separatorList; + } + + public void addSeparator(String separator) { + this.separatorList.add(separator); + } + + public void removeSeparator(int nr) { + this.separatorList.remove(nr); + } + + /** + * Splits region using separator with given number from separatorList. + * Recursively calls itself until separatorNr is greater than number of + * separators. + * @param region Region to be splitted, is modified! + * @param separatorNr separator number in separatorList. + */ + private void split(Region region, int separatorNr) { + if (separatorNr < separatorList.size()) { + String content = region.getContent(); + String separator = separatorList.get(separatorNr); + String[] childContentList = content.split(separator); + for(String childContent : childContentList) { + Region child = new Region(region, childContent); + split(child, separatorNr + 1); + region.addChild(child); + } + } + } + + private List separatorList; + +} diff --git a/trash/.svn/text-base/PlaintextParserOldTest.java.svn-base b/trash/.svn/text-base/PlaintextParserOldTest.java.svn-base new file mode 100755 index 0000000..a6c8707 --- /dev/null +++ b/trash/.svn/text-base/PlaintextParserOldTest.java.svn-base @@ -0,0 +1,31 @@ +package parsers; + +import junit.framework.TestCase; + +public class PlaintextParserTest extends TestCase { + + public PlaintextParserTest() { + this.parser = new PlaintextParser(); + parser.addSeparator("\n\n"); + parser.addSeparator("\n"); + } + + public void testParse() { + + } + + public void testSeparators() { + PlaintextParser testParser = new PlaintextParser(); + assertEquals(0, testParser.getSeparatorList().size()); + testParser.addSeparator("aaa"); + assertEquals(1, testParser.getSeparatorList().size()); + testParser.addSeparator("bbb"); + assertEquals(2, testParser.getSeparatorList().size()); + testParser.removeSeparator(0); + assertEquals(1, testParser.getSeparatorList().size()); + assertEquals("bbb", testParser.getSeparatorList().get(0)); + } + + private PlaintextParser parser; + +} diff --git a/trash/.svn/text-base/PlaintextParserTest.java.svn-base b/trash/.svn/text-base/PlaintextParserTest.java.svn-base new file mode 100755 index 0000000..4075c9f --- /dev/null +++ b/trash/.svn/text-base/PlaintextParserTest.java.svn-base @@ -0,0 +1,62 @@ +package parsers; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; + +import regions.Region; + +import junit.framework.TestCase; + +public class PlaintextParserTest extends TestCase { + + public static final String FILE_NAME = "data/test/simpleinput.txt"; + + public PlaintextParserTest() { + this.parser = new PlaintextParser(); + parser.addSeparator("\n\n"); + parser.addSeparator("\n"); + } + + public void testParse() { + Region region = null; + BufferedReader reader; + try { + reader = new BufferedReader(new FileReader(FILE_NAME)); + region = parser.parse(reader); + } catch (FileNotFoundException e) { + fail("Test file not found: " + e); + } catch (ParserException e) { + fail("Parser exception: " + e); + } + + assertEquals("dokument1, paragraf1\n\ndokument2, paragraf1\n" + + "dokument2, paragraf2", region.getContent()); + assertEquals(2, region.getChildren().size()); + region = region.getChildren().get(1); + + assertEquals("dokument2, paragraf1\ndokument2, paragraf2", + region.getContent()); + assertEquals(2, region.getChildren().size()); + region = region.getChildren().get(1); + + assertEquals("dokument2, paragraf2", + region.getContent()); + assertEquals(0, region.getChildren().size()); + } + + public void testSeparators() { + PlaintextParser testParser = new PlaintextParser(); + assertEquals(0, testParser.getSeparatorList().size()); + testParser.addSeparator("aaa"); + assertEquals(1, testParser.getSeparatorList().size()); + testParser.addSeparator("bbb"); + assertEquals(2, testParser.getSeparatorList().size()); + testParser.removeSeparator(0); + assertEquals(1, testParser.getSeparatorList().size()); + assertEquals("bbb", testParser.getSeparatorList().get(0)); + } + + private PlaintextParser parser; + +} diff --git a/trash/.svn/text-base/Region.java.svn-base b/trash/.svn/text-base/Region.java.svn-base new file mode 100755 index 0000000..2f30539 --- /dev/null +++ b/trash/.svn/text-base/Region.java.svn-base @@ -0,0 +1,66 @@ +package regions; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class Region { + + public Region(Region parent, String content) { + this.parent = parent; + this.content = content; + this.children = new LinkedList(); + } + + public Region getParent() { + return parent; + } + + public void setParent(Region parent) { + this.parent = parent; + } + + public String getContent() { + return content; + } + + public int getLength() { + return content.length(); + } + + public List getChildren() { + return Collections.unmodifiableList(children); + } + + /** + * Adds child. + * @param child + */ + public void addChild(Region child) { + children.add(child); + } + + /** + * Removes child. + * @param child + * @return Returns true if child was removed. + */ + public boolean removeChild(Region child) { + return children.remove(child); + } + + /** + * Remove all children from this node. + */ + public void removeAllChildren() { + children.clear(); + } + + private Region parent; + + private List children; + + //Performance optimization, addtional memory cost + private String content; + +} diff --git a/trash/.svn/text-base/RegionInt.java.svn-base b/trash/.svn/text-base/RegionInt.java.svn-base new file mode 100755 index 0000000..a951038 --- /dev/null +++ b/trash/.svn/text-base/RegionInt.java.svn-base @@ -0,0 +1,32 @@ +package regions; + +import java.util.List; + +/** + * Represents text region in document. Contains InternalRegions + * or is ChildRegion. + * @author loomchild + */ +public interface Region { + + /** + * @return Returns region's parent (null if region is root) + */ + ParentRegion getParent(); + + /** + * @return Returns const list of region children. + */ + List getChildren(); + + /** + * @return Returns region's content. + */ + String getContent(); + + /** + * *@return Returns content lenght (== getContent.lenght()), but more efficient. + */ + int getLength(); + +} diff --git a/trash/.svn/text-base/RegionOld.java.svn-base b/trash/.svn/text-base/RegionOld.java.svn-base new file mode 100755 index 0000000..e892f7e --- /dev/null +++ b/trash/.svn/text-base/RegionOld.java.svn-base @@ -0,0 +1,43 @@ +package regions; + +import java.util.List; + +/** + * Represents text region in document. Contains InternalRegions + * or is ChildRegion. + * @author loomchild + */ +public abstract class Region { + + public Region(ParentRegion parent) { + this.parent = parent; + if (parent != null) { + parent.addChild(this); + } + } + + /** + * @return Returns region's parent (null if region is root) + */ + public ParentRegion getParent() { + return parent; + } + + /** + * @return Returns const list of region children. + */ + public abstract List getChildren(); + + /** + * @return Returns region's content. + */ + public abstract String getContent(); + + /** + * *@return Returns content lenght (== getContent.lenght()), but more efficient. + */ + public abstract int getLength(); + + private ParentRegion parent; + +} diff --git a/trash/.svn/text-base/Segamentator.java.svn-base b/trash/.svn/text-base/Segamentator.java.svn-base new file mode 100755 index 0000000..04019a0 --- /dev/null +++ b/trash/.svn/text-base/Segamentator.java.svn-base @@ -0,0 +1,20 @@ +package segmentators; + +import java.util.List; + +import regions.Region; + +public abstract class Segamentator { + + public void split(Region region) { + String content = region.getContent(); + List childContentList = split(content); + for(String childContent : childContentList) { + Region child = new Region(region, childContent); + region.addChild(child); + } + } + + protected abstract List split(String text); + +} diff --git a/trash/.svn/text-base/SentenceSegmentator.java.svn-base b/trash/.svn/text-base/SentenceSegmentator.java.svn-base new file mode 100755 index 0000000..0ee107f --- /dev/null +++ b/trash/.svn/text-base/SentenceSegmentator.java.svn-base @@ -0,0 +1,25 @@ +package segmentators; + +import java.text.BreakIterator; +import java.util.ArrayList; +import java.util.List; + +import regions.Region; + +public class SentenceSegmentator extends Segamentator { + + protected List split(String text) { + int start, end; + ArrayList sentenceList = new ArrayList(); + //Uses default locale, change... + BreakIterator breakIterator = BreakIterator.getSentenceInstance(); + breakIterator.setText(text); + start = breakIterator.first(); + for (end = breakIterator.next(); end != BreakIterator.DONE; + start = end, end = breakIterator.next()){ + sentenceList.add(text.substring(start, end)); + } + return sentenceList; + } + +} diff --git a/trash/.svn/text-base/SeparatorSegmentator.java.svn-base b/trash/.svn/text-base/SeparatorSegmentator.java.svn-base new file mode 100755 index 0000000..21f00b7 --- /dev/null +++ b/trash/.svn/text-base/SeparatorSegmentator.java.svn-base @@ -0,0 +1,25 @@ +package segmentators; + +import java.util.ArrayList; +import java.util.List; + +import regions.Region; + +public class SeparatorSegmentator extends Segamentator { + + public SeparatorSegmentator(String separator) { + this.separator = separator; + } + + protected List split(String text) { + String[] childContentList = text.split(separator); + List list = new ArrayList(childContentList.length); + for(String childContent : childContentList) { + list.add(childContent); + } + return list; + } + + private String separator; + +} diff --git a/trash/.svn/text-base/SimpleTaskTest.java.svn-base b/trash/.svn/text-base/SimpleTaskTest.java.svn-base new file mode 100755 index 0000000..63bf886 --- /dev/null +++ b/trash/.svn/text-base/SimpleTaskTest.java.svn-base @@ -0,0 +1,103 @@ +package align.task; + +import static loomchild.util.Utils.readAll; +import static loomchild.util.testing.Utils.assertListEquals; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.LinkedList; +import java.util.List; + +import align.aligner.Aligner; +import align.aligner.AlignerMock; +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; +import align.splitter.Splitter; +import align.splitter.SplitterMock; + +import junit.framework.TestCase; + +public class SimpleTaskTest extends TestCase { + + private SimpleTask task; + + public void setUp() { + Splitter sourceSplitter = new SplitterMock(1); + Splitter targetSplitter = new SplitterMock(2); + Aligner aligner = new AlignerMock(); + task = new SimpleTask(sourceSplitter, targetSplitter, aligner); + } + + public void testUseDifferentSplitters() throws AlignmentImpossibleException { + List alignmentList = task.run("abcd", "efgh"); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + assertListEquals(new String[]{"a", "b", "c", "d",}, + alignment.getSourceSegmentList()); + assertListEquals(new String[]{"ef", "gh",}, + alignment.getTargetSegmentList()); + } + + public void testAlignManyToZero() + throws AlignmentImpossibleException, IOException { + String sourceText = "abcd"; + String targetText = ""; + checkManyToZero(runTask(sourceText, targetText)); + checkManyToZero(runTaskFromReaders(sourceText, targetText)); + } + + private void checkManyToZero(List alignmentList) { + Alignment alignment = getOnlyElement(alignmentList); + assertListEquals(new String[]{"a", "b", "c", "d",}, + alignment.getSourceSegmentList()); + assertListEquals(new String[]{}, alignment.getTargetSegmentList()); + } + + public void testAlignZeroToMany() + throws AlignmentImpossibleException, IOException { + String sourceText = ""; + String targetText = "efgh"; + checkZeroToMany(runTask(sourceText, targetText)); + checkZeroToMany(runTaskFromReaders(sourceText, targetText)); + } + + private void checkZeroToMany(List alignmentList) { + Alignment alignment = getOnlyElement(alignmentList); + assertListEquals(new String[]{}, alignment.getSourceSegmentList()); + assertListEquals(new String[]{"ef", "gh",}, + alignment.getTargetSegmentList()); + } + + public void testAlignZeroToZero() + throws AlignmentImpossibleException, IOException { + String sourceText = ""; + String targetText = ""; + checkZeroToZero(runTask(sourceText, targetText)); + checkZeroToZero(runTaskFromReaders(sourceText, targetText)); + } + + private void checkZeroToZero(List alignmentList) { + assertEquals(0, alignmentList.size()); + } + + private List runTask(String sourceString, String targetString) + throws AlignmentImpossibleException { + return task.run(sourceString, targetString); + } + + private List runTaskFromReaders(String sourceString, + String targetString) + throws AlignmentImpossibleException, IOException { + Reader sourceReader = new StringReader(sourceString); + Reader targetReader = new StringReader(targetString); + return task.run(sourceReader, targetReader); + } + + private T getOnlyElement(List list) { + assertEquals(1, list.size()); + return list.get(0); + } + +} + diff --git a/trash/.svn/text-base/SrxSplitAlgorithm.java.svn-base b/trash/.svn/text-base/SrxSplitAlgorithm.java.svn-base new file mode 100755 index 0000000..695b7a2 --- /dev/null +++ b/trash/.svn/text-base/SrxSplitAlgorithm.java.svn-base @@ -0,0 +1,44 @@ +package align.filter.modifier.modify.split; + + +import java.io.Reader; +import java.util.List; + +/** + * Reprezentuje splitter dzielący tekst za pomocą reguł zapisanych w formacie + * SRX. + * + * @author Jarek Lipski (loomchild) + */ +public class SrxSplitAlgorithm extends SplitAlgorithm { + + { + isSplitPresent = isSplitPresent(); + } + + private static boolean isSplitPresent; + + private SplitAlgorithm algorithm; + + public SrxSplitAlgorithm(Reader reader, String languageCode) { + if (isSplitPresent) { + this.algorithm = new SrxSplitAlgorithmImpl(reader, languageCode); + } else { + this.algorithm = new SrxSplitAlgorithmMock(); + } + } + + private static boolean isSplitPresent() { + try { + Class.forName("split.srx.SrxSplitter"); + } catch (ClassNotFoundException e) { + return false; + } + return true; + } + + public List split(String string) { + return algorithm.split(string); + } + +} diff --git a/trash/.svn/text-base/SrxSplitAlgorithmImpl.java.svn-base b/trash/.svn/text-base/SrxSplitAlgorithmImpl.java.svn-base new file mode 100755 index 0000000..181f3a5 --- /dev/null +++ b/trash/.svn/text-base/SrxSplitAlgorithmImpl.java.svn-base @@ -0,0 +1,44 @@ +package align.filter.modifier.modify.split; + + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import split.srx.Document; +import split.srx.LanguageRule; +import split.srx.MapRule; +import split.srx.Parser; + +/** + * Reprezentuje splitter dzielący tekst za pomocą reguł zapisanych w formacie + * SRX. + * + * @author Jarek Lipski (loomchild) + */ +public class SrxSplitAlgorithmImpl extends SplitAlgorithm { + + private LanguageRule languageRule; + + private split.srx.SrxSplitter splitter; + + public SrxSplitAlgorithmImpl(Reader reader, String languageCode) { + Document srxDocument = Parser.getInstance().parse(reader); + MapRule mapRule = srxDocument.getSingletonMapRule(); + languageRule = mapRule.getLanguageMap(languageCode).getLanguageRule(); + } + + /** + * @inheritDoc + */ + public List split(String string) { + splitter = new split.srx.SrxSplitter(languageRule, string); + List segmentList = new ArrayList(); + while(splitter.hasNext()) { + String segment = splitter.next(); + segmentList.add(segment); + } + return segmentList; + } + +} diff --git a/trash/.svn/text-base/SrxSplitAlgorithmMock.java.svn-base b/trash/.svn/text-base/SrxSplitAlgorithmMock.java.svn-base new file mode 100755 index 0000000..1f13621 --- /dev/null +++ b/trash/.svn/text-base/SrxSplitAlgorithmMock.java.svn-base @@ -0,0 +1,17 @@ +package align.filter.modifier.modify.split; + + +import java.util.List; + +/** + * Reprezentuje atrape splittera SRX. + * + * @author Jarek Lipski (loomchild) + */ +public class SrxSplitAlgorithmMock extends SplitAlgorithm { + + public List split(String string) { + throw new UnsupportedOperationException("SRX splitter is not installed"); + } + +} diff --git a/trash/.svn/text-base/Trainer.java.svn-base b/trash/.svn/text-base/Trainer.java.svn-base new file mode 100755 index 0000000..239d7cd --- /dev/null +++ b/trash/.svn/text-base/Trainer.java.svn-base @@ -0,0 +1,35 @@ +package align.aligner.aligners.moore.translationmodel; + +import java.util.LinkedList; +import java.util.List; + +import align.splitter.WordSplitter; + +public class Trainer { + + public Trainer() { + } + + public TranslationModel train(int iterationCount, + List sourceSegmentList, List targetSegmentList) { + assert sourceSegmentList.size() == targetSegmentList.size(); + assert iterationCount >= 1; + + + return null; + } + + /* + * Optymalizacja + private List< List > splitIntoWords(List sentenceList) { + WordSplitter splitter = new WordSplitter(); + List< List > list = new LinkedList< List >(); + for (String sentence : sentenceList) { + List wordList = splitter.split(sentence); + list.add(wordList); + } + return list; + } + */ + +} diff --git a/trash/.svn/text-base/Translation.java.svn-base b/trash/.svn/text-base/Translation.java.svn-base new file mode 100755 index 0000000..3fcebc8 --- /dev/null +++ b/trash/.svn/text-base/Translation.java.svn-base @@ -0,0 +1,23 @@ +package align.aligner.aligners.moore.models; + +public class Translation { + + private String word; + + private float probability; + + public Translation(String word, float probability) { + this.word = word; + this.probability = probability; + } + + public float getProbability() { + return probability; + } + + public String getWord() { + return word; + } + + +} diff --git a/trash/.svn/text-base/WordNotFoundException.java.svn-base b/trash/.svn/text-base/WordNotFoundException.java.svn-base new file mode 100755 index 0000000..b6fea6d --- /dev/null +++ b/trash/.svn/text-base/WordNotFoundException.java.svn-base @@ -0,0 +1,13 @@ +package align.aligner.aligners.moore.models; + +import loomchild.util.exceptions.LogicException; + +public class WordNotFoundException extends LogicException { + + private static final long serialVersionUID = 1474443021847245849L; + + public WordNotFoundException(String word) { + super("No such word: " + word); + } + +} diff --git a/trash/.svn/text-base/XmlErrorHandler.java.svn-base b/trash/.svn/text-base/XmlErrorHandler.java.svn-base new file mode 100755 index 0000000..1b10c79 --- /dev/null +++ b/trash/.svn/text-base/XmlErrorHandler.java.svn-base @@ -0,0 +1,34 @@ +package parsers; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +/** + * Represents strict error handler. Used to report validation errors. + * @author loomchild + */ +public class XmlErrorHandler implements ErrorHandler { + + /** + * Ignores warnings. + */ + public void warning(SAXParseException exception) throws SAXException { + //Ignore warnings or log them? + } + + /** + * Throws errors. + */ + public void error(SAXParseException exception) throws SAXException { + throw exception; + } + + /** + * Throws fatal errors. + */ + public void fatalError(SAXParseException exception) throws SAXException { + throw exception; + } + +} diff --git a/trash/.svn/text-base/XmlHandler.java.svn-base b/trash/.svn/text-base/XmlHandler.java.svn-base new file mode 100755 index 0000000..7e371ee --- /dev/null +++ b/trash/.svn/text-base/XmlHandler.java.svn-base @@ -0,0 +1,82 @@ +package parsers; + +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; + +import regions.ChildRegion; +import regions.ParentRegion; +import regions.Region; + +public class XmlHandler implements ContentHandler { + + public XmlHandler() { + } + + public void setDocumentLocator(Locator locator) { + } + + public void startDocument() throws SAXException { + parent = null; + region = null; + content = ""; + } + + public void endDocument() throws SAXException { + } + + public void startPrefixMapping(String prefix, String uri) + throws SAXException { + } + + public void endPrefixMapping(String prefix) throws SAXException { + } + + public void startElement(String uri, String localName, String qName, + Attributes atts) throws SAXException { + if (region ) + parent = new ParentRegion(parent); + region = null; + content = ""; + } + + public void endElement(String uri, String localName, String qName) + throws SAXException { + if (region == null) { + new ChildRegion(parent, content); + content = ""; + } + region = parent; + parent = parent.getParent(); + } + + public void characters(char[] ch, int start, int length) + throws SAXException { + if (region == null) { + content += new String(ch, start, length); + } + } + + public void ignorableWhitespace(char[] ch, int start, int length) + throws SAXException { + } + + public void processingInstruction(String target, String data) + throws SAXException { + } + + public void skippedEntity(String name) throws SAXException { + } + + public Region getRegion() { + return region; + } + + private Region region; + + private ParentRegion parent; + + String content; + +} diff --git a/trash/.svn/text-base/XmlParser.java.svn-base b/trash/.svn/text-base/XmlParser.java.svn-base new file mode 100755 index 0000000..c35c0c2 --- /dev/null +++ b/trash/.svn/text-base/XmlParser.java.svn-base @@ -0,0 +1,49 @@ +package parsers; + +import java.io.IOException; +import java.io.Reader; + +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; + +import regions.Region; + +import exceptions.InitializationException; + +public class XmlParser implements Parser { + + + public static XmlParser getInstance() { + return instance; + } + + public Region parse(Reader reader) throws ParserException { + parser.setContentHandler(handler); + try { + parser.parse(new InputSource(reader)); + } catch (IOException e) { + throw new ParserException("IO error during parsing",e); + } catch (SAXException e) { + throw new ParserException("SAX error during parsing",e); + } + return handler.getRegion(); + } + + private XmlParser() { + try { + parser = XMLReaderFactory.createXMLReader(); + handler = new XmlHandler(); + } catch (SAXException e) { + throw new InitializationException("Cannot crete XML parser: " + + e.getMessage()); + } + } + + private static XmlParser instance = new XmlParser(); + + private XMLReader parser; + private XmlHandler handler; + +} diff --git a/trash/.svn/text-base/XmlParserTest.java.svn-base b/trash/.svn/text-base/XmlParserTest.java.svn-base new file mode 100755 index 0000000..6fd9789 --- /dev/null +++ b/trash/.svn/text-base/XmlParserTest.java.svn-base @@ -0,0 +1,40 @@ +package parsers; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; + +import regions.Region; +import junit.framework.TestCase; + +public class XmlParserTest extends TestCase { + + public static final String DOCUMENT = "test/documentx.xml"; + + public XmlParserTest() { + parser = XmlParser.getInstance(); + } + + public void testParse() { + Region document = null; + try { + BufferedReader file = new BufferedReader(new FileReader(DOCUMENT)); + document = parser.parse(file); + } catch (ParserException e) { + fail("Parser error parsing correct document: " + e.getMessage()); + } catch (FileNotFoundException e) { + fail("File not found: " + e.getMessage()); + } + assertEquals("To zdanie to drugie jeszcze",document.getContent()); + assertEquals(2, document.getChildren().size()); + Region region = document.getChildren().get(0); + assertEquals(2, region.getChildren().size()); + region = region.getChildren().get(1); + System.out.println(region.getContent()); + assertEquals(0, region.getChildren().size()); + assertEquals("to drugie", region.getContent()); + } + + private Parser parser; + +} diff --git a/trash/.svn/text-base/align.bat.svn-base b/trash/.svn/text-base/align.bat.svn-base new file mode 100755 index 0000000..6f2db84 --- /dev/null +++ b/trash/.svn/text-base/align.bat.svn-base @@ -0,0 +1,3 @@ +@echo off +set SCRIPT_DIR=%~p0 +java -cp "%CLASSPATH%;%SCRIPT_DIR%\..\res;%SCRIPT_DIR%\..\lib\align.jar;%SCRIPT_DIR%\..\lib\split.jar;%SCRIPT_DIR%\..\lib\loomchild.jar" ui.swing.Align \ No newline at end of file diff --git a/trash/.svn/text-base/align.tar.gz.svn-base b/trash/.svn/text-base/align.tar.gz.svn-base new file mode 100644 index 0000000000000000000000000000000000000000..c9506c43ad1c166289d6f755b3d868e00acb70f7 GIT binary patch literal 198660 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
T-rc0`R;=Or^-)?{sZcVeSbs% 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

Qxs{1vO5Ad7n96>QI|AAiwOOv(`# zkp*k0%JEz9ii+QWEfFr|@M52sH)(PX2up*Q{(8j4{4SzCFK@FK5|nknrAj$hx>FvK zftXr4Hfb%Ooo|`I90AYO4&xjesYW(}eu{=JT(_y<%-vJH!`OXUVMvBCFXtWYQaI& z+_&!8D)emF6#ykIuG?1F8(T^uHMmx&z^ALYn`e0!qq_}>73#&tzC^Qy?PW<>9Iu%? zfka(aOuGtfdrwkF;w`fX5?HZ~GqWQVDImd%cFvj=+n{RdA8Dj)gB&XOP^@# zrTCtX0jjzTBJp@lrQ?5b-rHN9-Y^%o#Fe}%%*|er_Y0WpRo*M+rEY1|_BNfwatvce z5G`Wukb;A=ReXC*5!tKR#Bk^P$lf(ie41sCe_FJQ&hnmKo5q`pwWT!86 zgGf|NTTVn-D=W{;ao6_kMWf`dE*K|m53S9yYV}>k_liVR?iO64ipP~>Y>M8)U{}cf zWM_7yd7v;G@i_?dBGYNYBELp+5 z7J){jGWgKO{PacPz=0U=7^Rz;K_;Go-EpOior^3m^-YdmCO zBE|mT-JDr)ou#e{(f4Z2UzHjWoZ{&w>Vvt&tO7b!D@W~g(8sQPofEMYfTMz!i+f))DL$H37GJgZLQ?|KYU=0e1yl^URXL9;mF84bov45`p;C3vrud zL!{D!k0C0iHH3i0?RJKIuekKV2{Zk8Fytzic18=dlhs#+`GUuck`XAQv?97DY3w^u zeV5~O+TBr}Mqai0x|p9dy?0a0i7*#86XO-rDRs&^GV!3qxn_6~?e=8G`ewdr66}

(7qj&Vaob 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

  • EGdO$UR>MCd|Q-tI|PT|L)twG$ImX2pPt2VGhI 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 + + + To zdanieto drugie + + + jeszcze + + diff --git a/trash/.svn/text-base/loomchild-util-1.3.9.jar.svn-base b/trash/.svn/text-base/loomchild-util-1.3.9.jar.svn-base new file mode 100644 index 0000000000000000000000000000000000000000..d44fc84ec99b24b2e88770ee133a1b4c2836b2ee GIT binary patch literal 75616 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 E1M8^n5&!@I literal 0 HcmV?d00001 diff --git a/trash/.svn/text-base/moore.txt.svn-base b/trash/.svn/text-base/moore.txt.svn-base new file mode 100755 index 0000000..90fc589 --- /dev/null +++ b/trash/.svn/text-base/moore.txt.svn-base @@ -0,0 +1,26 @@ +(1-1) + +$word_seq_score_pos_1_minus_1 + + +$length_neg_log_prob_pos_1_minus_1 + + +&length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1); + + + +(2-1) + +$word_seq_score_pos_1_minus_2 + + +$length_neg_log_prob_pos_1_minus_2 + + +&length_neg_log_cond_prob_2($length_pair_1,$length_pos_2_minus_1); + + + +(1-2) + +&word_seq_trans_score($words_pos_1_minus_1,[@$words_pos_2_minus_2,@$words_pos_2_minus_1]) + + +$target_pair_2_neg_log_prob{$length_pos_2_minus_2}{$length_pos_2_minus_1}; + diff --git a/trash/.svn/text-base/moore2.txt.svn-base b/trash/.svn/text-base/moore2.txt.svn-base new file mode 100755 index 0000000..02ebbf4 --- /dev/null +++ b/trash/.svn/text-base/moore2.txt.svn-base @@ -0,0 +1,93 @@ + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'delete'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1; + + $bead_score{$pos_1}{$pos_2}{'delete'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'insert'})) { + $new_bead_score = + + // Target language score + &word_seq_score_2(@$words_pos_2_minus_1) + + + // Target length score + $length_neg_log_prob_2{$length_pos_2_minus_1}; + + $bead_score{$pos_1}{$pos_2}{'insert'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'match'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1 + + + // Translation score + &word_seq_trans_score($words_pos_1_minus_1,$words_pos_2_minus_1) + + + // Length translation score + &length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1); + + $bead_score{$pos_1}{$pos_2}{'match'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'contract'})) { + $new_bead_score = + + // Source language score (2nd sentence) + $word_seq_score_pos_1_minus_1 + + + // Source length score (2nd sentence) + $length_neg_log_prob_pos_1_minus_1 + + + // Source language score (1st sentence) + $word_seq_score_pos_1_minus_2 + + + // Source length score (1st sentence) + $length_neg_log_prob_pos_1_minus_2 + + + // Translation score, source sentences sum, to target sentence: + ... $words_pair_1 = [@$words_pos_1_minus_2,@$words_pos_1_minus_1];, ). + &word_seq_trans_score($words_pair_1,$words_pos_2_minus_1) + + + // Length translation score source, sentences sum, to target sentence: + ... $length_pair_1 = $length_pos_1 + $length_pos_1_plus_1 + &length_neg_log_cond_prob_2($length_pair_1,$length_pos_2_minus_1); + + $bead_score{$pos_1}{$pos_2}{'contract'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'expand'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1 + + + // Translation score, source sentence, to target sentence sum + &word_seq_trans_score($words_pos_1_minus_1,[@$words_pos_2_minus_2,@$words_pos_2_minus_1]) + + + // Length translation score, source sentence, to target sentence sum + &length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1 + $length_pos_2_minus_2) + + + // + $target_pair_2_neg_log_prob{$length_pos_2_minus_2}{$length_pos_2_minus_1}; + + $bead_score{$pos_1}{$pos_2}{'expand'} = $new_bead_score; + } + diff --git a/trash/.svn/text-base/readme_jimmy.htm.svn-base b/trash/.svn/text-base/readme_jimmy.htm.svn-base new file mode 100644 index 0000000..5ad33fe --- /dev/null +++ b/trash/.svn/text-base/readme_jimmy.htm.svn-base @@ -0,0 +1,126 @@ + + +Read Me + +

    mALIGNa

    + +

    Version @project.fullversion@, Date @build.date@

    +
    + +

    Table of Contents

    +
      +
    1. Introduction
    2. +
    3. Requirements
    4. +
    5. Running
    6. +
    7. Formats
    8. +
    9. Algorithms
    10. +
    11. Sources
    12. +
    13. Tools
    14. +
    + +
    + +

    1. Introduction

    +

    mALIGNa is a program for aligning documents on the sentence level. It contains implementations of a few groups of alignment algorithms - algorithms based exclusively on the sentence length (Gale and Church, Brown), algorithms based on the connections between words (Moore's algorithm), as well as any variation and intersection of these algorithms. The aim of alignment is to obtain a bilingual corpus. It can be used for creating translation memories, translation by analogy, modelling probabilistic dictionaries and other applications.

    + +

    2. Requirements

    +

    JVM 1.6 is required to run the program. To build the program both JDK 1.6 and Ant are required. Theoretically, the program is platform independent (like Java), it was tested on Linux and Windows.

    + +

    3. Running

    +

    Aligning documents consists of several stages, which may be performed in different ways. Therefore, the text interface of the program is divided into several independent commands. A common feature of the commands is that they read from standard input and write the results to standard output, always using the native format .al. Therefore these programs act as filters and may be combined in a pipe using |. Below is a brief description of each command, you can get more information about their exact parameters using the option --help. At the end, there is a complete example of text alignment using several commands connected in a pipeline.

    +

    + +

    3.1 The 'parse' command

    +

    The parse option is used to convert an external format to the native format .al. It also allows you to combine several documents into one, by giving a list of files as arguments. It accepts input files as aguments and writes the result to standard output. This can only occur at the beginning of the pipeline.

    + +

    3.2 The 'format' command

    +

    The 'format' option is used to convert the native format .al to an external format. It reads data from standard input and writes the result to the files given as arguments. This can only occur at the end of the pipeline.

    + +

    3.3 The 'align' command

    +

    Alignment commands. Segments of each of the input alignments are aligned independently, thanks to which alignments can be performed at different levels of accuracy (document, paragraph, sentence), performing consecutive alignments, and then dividing the results into smaller and smaller segments. Filter; may be used at any point of the pipeline.

    + +

    3.4 The 'modify' command

    +

    This option performs modifications on every alignment, replacing source and target lists of segments with other lists of segments, in addition both the size of the segments and their contents may be changed (e.g. connect segments in one, divide them into more segments or remove unnecessary whitespace). Filter; may be used at any point of the pipeline.

    + +

    3.5 The 'select' command

    +

    On the basis of certain criteria, chooses from the input lists of alignments only a few and writes them to output. Eg. using this you can choose only the most probable alignments or only 1 - 1 alignments. Filter; may be used at any point of the pipeline.

    + +

    3.6 The 'compare' command

    +

    This is used for comparing two files of alignments with each other, provided as arguments, returning the degree of their similarity and the differences occurring. Used for test targets.

    + +

    3.7 The 'test' command

    +

    Runs the program's automatic tests.

    + +

    3.6 Examples of running

    +

    Below I have given examples of pipelines of commands that that should be used to join together two documents in .txt files, and also write the results as two .txt files, also the input documents should contain the same number of sentences, one per line, and sentences of corresponding numbers should be mutual translations. The commands given below will do everything, however it is worth remembering that sometimes it's better to preserve the intermediate results of the operations of each command in temporary files instead of redirecting them directly to the next command. The following command writes the string in one line; it has been split into several lines in order to enhance readability. They are being carried out in the main directory of the project. Ready to run scripts containing these commands can be found in the directory examples/scripts,

    +

    +bin/maligna parse -c txt example/txt/poznan-pl.txt example/txt/poznan-de.txt |
    +bin/maligna modify -c sentencesplit |
    +bin/maligna modify -c trim |
    +bin/maligna align -c viterbi -a poisson -n word -s iterband |
    +bin/maligna select -c onetoone |
    +bin/maligna format -c txt poznan-pl-align.txt poznan-de-align.txt +

    +

    Another case worth attention is alignment using Moore's algorithm, which requires a properly aligned corpus to build a translation model. To do this you must perform several commands.

    +

    +bin/maligna parse -c txt example/txt/poznan-pl.txt example/txt/poznan-de.txt |
    +bin/maligna modify -c sentencesplit |
    +bin/maligna modify -c trim >
    +poznan-split.al +

    +

    +cat poznan-split.al |
    +bin/maligna align -c viterbi -a poisson -n word -s iterband |
    +bin/maligna select -c onetoone |
    +bin/maligna select -c fraction -f 0.85 >
    +poznan-align-length.al +

    +

    +cat poznan-split.al |
    +bin/maligna align -c viterbi -a poisson-translation -n word -s iterband -t poznan-align-length.al >
    +poznan-align.al +

    + +

    4. Formats

    +

    Most commands expect input and output in the native format .al. To use a different format, you must parse the input (using the parse command). To get the result in another format, you need to format it (using the format command).

    + +

    4.1 The .al format

    +

    This is the native format for files of alignment lists. Contains all necessary information for alignment: lists of source and target segments and result (probability) of alignment.

    + +

    4.2 The .tmx format

    +

    The standard format for translation memories, supported by many tools. Both an input and output format. For the full specification, see: http://www.lisa.org/standards/tmx/tmx.html.

    + +

    4.3 The .txt format

    +

    Plain text, in the form of two files in two languages. On input the whole file is treated as one segment. On output, successive lines of files correspond by alignment and are mutual translations (their quantity is equal).

    + +

    4.4 The presentation format

    +

    An output format which allows the presentation of an alignment in a human readable manner. It is written to a text file in two columns.

    + +

    5. Algorithms

    +

    In the program a few alignment algorithms were applied, and thanks to the flexibility of the code it is possible to modify them and join them together.

    + +

    5.1 Gale and Church algorithm

    +

    This is a fast bilingual text alignment algorithm. The algorithm counts the probability of each possible alignment, which depends on the length of sentences in each language, the length of the whole texts in each language (with no loss of accuracy averaged to 1:1) and some constants. Next it finds alignments for the whole text, maximalising the total probability of alignment. Details can be found in the Gale and Church article, referenced in the sources.

    + +

    5.1 Moore's algorithm

    +

    This is a modern algorithm based not only on the length of sentences but also on the relationships between words. The first phase of operation of this algorithm is alignment based on length (similarly to the Gale and Church algorithm; moreover, it can be used as the first phase of that algorithm). Next, from this alignment only 1 - 1 alignments are selected, and from them only the best part (e.g. 80%). In this manner a relatively well aligned corpus is yielded. Later a translation model (IBM Model 1) and unigram language models are built based on this corpus. In the final alignment not only is the probability of alignment of sentences of determined length taken into consideration, but also the probability of the translation of the source sentence to the target sentence (counted on the basis of the translation model and the language models, in the standard way). Details can be found in the Moore article, referenced in the sources.

    + +

    6. Sources

    +

    +

      +
    1. A Program for Aligning Sentences in Bilingual Corpora, William A. Gale, Kenneth Ward Church
    2. +
    3. Fast and Accurate Sentence Alignment of Bilingual Corpora, Robert C. Moore
    4. +
    +

    + +

    7. Tools

    +

    I wrote this program using the Eclipse IDE. For the automation of various tasks, I used the program Ant.

    + +
    + +

    I wrote this program as part of my studies in Machine Translation, and later I expanded it as part of a master's thesis. Happy aligning!

    +

       -- Jarek Lipski

    + + + + diff --git a/trash/.svn/text-base/simpleinput.txt.svn-base b/trash/.svn/text-base/simpleinput.txt.svn-base new file mode 100755 index 0000000..9e45b87 --- /dev/null +++ b/trash/.svn/text-base/simpleinput.txt.svn-base @@ -0,0 +1,4 @@ +dokument1, paragraf1 + +dokument2, paragraf1 +dokument2, paragraf2 diff --git a/trash/.svn/text-base/trash.txt.svn-base b/trash/.svn/text-base/trash.txt.svn-base new file mode 100755 index 0000000..5e9d6a4 --- /dev/null +++ b/trash/.svn/text-base/trash.txt.svn-base @@ -0,0 +1,35 @@ + +/* + private TranslationModel performTrainingIteration1( + List< List > sourceSegmentList, + List< List > targetSegmentList) { + TrainedTranslationModel newModel = new TrainedTranslationModel(); + Iterator< List > sourceSegmentIterator = + sourceSegmentList.iterator(); + Iterator< List > targetSegmentIterator = + targetSegmentList.iterator(); + + while(sourceSegmentIterator.hasNext() + && targetSegmentIterator.hasNext()) { + List sourceSegment = sourceSegmentIterator.next(); + List targetSegment = targetSegmentIterator.next(); + + for (int targetWid : targetSegment) { + float probability = 1.0f / sourceSegment.size(); + + for (int sourceWid : sourceSegment) { + TranslationData newModelData = newModel.get(sourceWid); + float newModelProbability = + newModelData.getTranslationProbability(targetWid); + float newProbability = newModelProbability + probability; + + newModelData.setTranslationProbability(targetWid, + newProbability); + } + } + } + + return newModel; + + } +*/ diff --git a/trash/AbstractAligner.java b/trash/AbstractAligner.java new file mode 100755 index 0000000..d4136f4 --- /dev/null +++ b/trash/AbstractAligner.java @@ -0,0 +1,56 @@ +package align.aligner; + +import java.util.Collections; +import java.util.List; + +import align.data.Alignment; + +/** + * Reprezentuje abstakcyjny aligner sprawdzający wejście i w razie możliwości + * zwracający od razu wynik albo przekazujący sterowanie do konkretnej + * implementacji. + * + * @author Jarek Lipski (loomchild) + */ +public abstract class AbstractAligner implements Aligner { + + /** + * Dopasowywuje do siebie listy segmentów. Jeśli obie listy są puste + * zwraca pustą liste. Jeśli jedna z list jest pusta zwraca jedno + * dopasowanie wiele do zera. W przeciwnym wypadku wywołuje metode + * klasy potomnej dokonującą właściwego dopasowania. + * @param sourceSegmentList Lista segmentów tekstu źródłowego. + * @param targetSegmentList Lista segmentów tekstu docelowego. + * @return Zwraca listę dopasowań która obejmuje wszystkie segmenty obu tekstów. + * @throws AlignmentImpossibleException Zgłaszany przez klase pochodną gdy nie da się dopasować tekstów. + */ + public List align(List sourceSegmentList, + List targetSegmentList) throws AlignmentImpossibleException { + List alignmentList; + if (sourceSegmentList.size() == 0 && targetSegmentList.size() == 0) { + alignmentList = Collections.emptyList(); + } else if (sourceSegmentList.size() == 0) { + alignmentList = align.aligner.Utils.alignZeroToSegmentList( + targetSegmentList); + } else if (targetSegmentList.size() == 0) { + alignmentList = align.aligner.Utils.alignSegmentListToZero( + sourceSegmentList); + } else { + //Zastosowanie właściwego algorytmu gdy listy niepuste. + alignmentList = alignNotEmpty(sourceSegmentList, targetSegmentList); + } + return alignmentList; + } + + /** + * Właściwa implementacja algorytmu dopasowywania niepustych list segmentów. + * @param sourceSegmentList Lista segmentów tekstu źródłowego. + * @param targetSegmentList Lista segmentów tekstu docelowego. + * @return Zwraca listę dopasowań która obejmuje wszystkie segmenty obu tekstów. + * @throws AlignmentImpossibleException Zgłaszany gdy nie da się dopasować tekstów. + */ + protected abstract List alignNotEmpty( + List sourceSegmentList, List targetSegmentList) + throws AlignmentImpossibleException; + +} diff --git a/trash/AlignJob.java b/trash/AlignJob.java new file mode 100755 index 0000000..3dd6273 --- /dev/null +++ b/trash/AlignJob.java @@ -0,0 +1,29 @@ +package align.job; + +import java.util.List; + +import align.Alignment; +import align.formatter.Formatter; +import align.loader.Loader; +import align.task.Task; + +public class AlignJob implements Job { + + private Loader loader; + private Formatter formatter; + private Task task; + + public AlignJob(Loader loader, Task task, Formatter formatter) { + this.loader = loader; + this.formatter = formatter; + this.task = task; + } + + public void run() { + String sourceString = loader.loadSourceString(); + String targetString = loader.loadTargetString(); + List alignment = task.run(sourceString, targetString); + formatter.format(alignment); + } + +} diff --git a/trash/AlignmentTest.java b/trash/AlignmentTest.java new file mode 100755 index 0000000..672befb --- /dev/null +++ b/trash/AlignmentTest.java @@ -0,0 +1,63 @@ +package align; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import junit.framework.TestCase; + +public class AlignmentTest extends TestCase { + + private List sourceSegmentList; + + private List targetSegmentList; + + public void setUp() { + sourceSegmentList = new LinkedList(); + targetSegmentList = new LinkedList(); + } + + /** + * Testuje czy po utworzeniu dopasowania listy są niezależne od argumentów. + */ + public void testContructorListCopying() { + Alignment alignment = new Alignment(sourceSegmentList, + targetSegmentList, 2.0f); + checkAlignment(alignment); + } + + /** + * Testuje czy po dodaniu list do dopasowania są one niezależne od + * argumentów. + */ + public void testMethodListCopying() { + Alignment alignment = new Alignment(); + alignment.addSourceSegmentList(sourceSegmentList); + alignment.addTargetSegmentList(targetSegmentList); + alignment.setScore(2.0f); + checkAlignment(alignment); + } + + private void checkAlignment(Alignment alignment) { + assertEquals(0, alignment.getSourceSegmentList().size()); + sourceSegmentList.add("a"); + assertEquals(0, alignment.getSourceSegmentList().size()); + assertEquals(0, alignment.getTargetSegmentList().size()); + targetSegmentList.add("c"); + assertEquals(0, alignment.getTargetSegmentList().size()); + assertEquals(2.0f, alignment.getScore(), 0.000000001f); + } + + public void testMerge() { + Alignment alignment = new Alignment(); + alignment.addSourceSegmentList( + Arrays.asList(new String[]{"aa", "", "bbb"})); + alignment.addTargetSegmentList(Arrays.asList(new String[]{})); + String merged = alignment.getMergedSourceSegment(); + assertEquals("aabbb", merged); + merged = alignment.getMergedTargetSegment(); + assertEquals("", merged); + } + + +} diff --git a/trash/ChildRegion.java b/trash/ChildRegion.java new file mode 100755 index 0000000..4f968ed --- /dev/null +++ b/trash/ChildRegion.java @@ -0,0 +1,33 @@ +package regions; + +import java.util.Collections; +import java.util.List; + + +/** + * Represents leaf region in document (is plain text), has no children + * and no name. . + * @author loomchild + */ +public class ChildRegion extends Region { + + public ChildRegion(ParentRegion parent, String content) { + super(parent); + this.content = content; + } + + public String getContent() { + return content; + } + + public int getLength() { + return content.length(); + } + + public List getChildren() { + return Collections.emptyList(); + } + + private String content; + +} diff --git a/trash/CommonAlgorithmTest.java b/trash/CommonAlgorithmTest.java new file mode 100755 index 0000000..54298d8 --- /dev/null +++ b/trash/CommonAlgorithmTest.java @@ -0,0 +1,89 @@ +package align.filter.aligner.align; + +import static loomchild.util.testing.Utils.assertListEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import align.Alignment; +import align.filter.aligner.align.algorithm.galechurch.GaleChurchAlignAlgorithm; +import align.filter.aligner.align.algorithm.moore.MooreAlignAlgorithm; +import align.filter.aligner.align.onetoone.OneToOneAlgorithm; + +/** + * Test wykonywany dla wszystkich alignerów, testujący ich wspólne cechy. + * Nowe alignery trzeba dodać w odpowidniej metodzie inicjalizującej. + * + * @author Jarek Lipski (loomchild) + */ +public class CommonAlgorithmTest { + + private List alignerList; + + @Before + public void setUp() { + this.alignerList = createAlignerList(); + } + + /** + * Testuje czy próba dopasowania pustych list zwraca pustą liste dopasowań. + */ + @Test + public void alignZeroToZeroReturnsEmptyList() { + for (AlignAlgorithm aligner : alignerList) { + checkAlignZeroToZeroReturnsEmptyList(aligner); + } + } + + public void checkAlignZeroToZeroReturnsEmptyList(AlignAlgorithm aligner) { + List alignmentList = aligner.align( + Arrays.asList(new String[]{}), Arrays.asList(new String[]{})); + assertEquals(0, alignmentList.size()); + } + + @Test + public void noOmissions() { + for (AlignAlgorithm aligner : alignerList) { + try { + checkNoOmissions(aligner); + } catch (AlignmentImpossibleException e) { + //ignoruje alignery które nie mogą dopasowywać danych testowych + //może zrobić oddzielną grupę alignerów albo zmienić test + } + } + } + + public void checkNoOmissions(AlignAlgorithm aligner) { + String[] sourceArray = new String[]{"a", "b", "c", "d", "ee"}; + String[] targetArray = new String[]{"1", "2", ""}; + List alignmentList = aligner.align( + Arrays.asList(sourceArray), Arrays.asList(targetArray)); + List alignedSourceList = new LinkedList(); + List alignedTargetList = new LinkedList(); + for (Alignment alignment : alignmentList) { + alignedSourceList.addAll(alignment.getSourceSegmentList()); + alignedTargetList.addAll(alignment.getTargetSegmentList()); + } + assertListEquals(sourceArray, alignedSourceList); + assertListEquals(targetArray, alignedTargetList); + } + + /** + * Miejsce do umieszczania wszystkich alignerów do przetestowania. + */ + private List createAlignerList() { + List alignerList = new LinkedList(); + + alignerList.add(new OneToOneAlgorithm()); + alignerList.add(new GaleChurchAlignAlgorithm()); + alignerList.add(new MooreAlignAlgorithm()); + + return alignerList; + } + +} diff --git a/trash/DOMXmlParser.java b/trash/DOMXmlParser.java new file mode 100755 index 0000000..b29c6a4 --- /dev/null +++ b/trash/DOMXmlParser.java @@ -0,0 +1,106 @@ +package parsers; + +import java.io.IOException; +import java.io.Reader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import regions.ChildRegion; +import regions.ParentRegion; +import regions.Region; +import exceptions.InitializationException; + +public class XmlParser implements Parser { + + { + builderFactory = DocumentBuilderFactory.newInstance(); + builderFactory.setNamespaceAware(false); //We are not using namespaces + builderFactory.setValidating(false); //Disable DTD + builderFactory.setIgnoringComments(true); //Ignore comments + builderFactory.setIgnoringElementContentWhitespace(false); //We don't ignore whitespaces because parser must be in validating mode to do this + } + + public static XmlParser getInstance() { + return instance; + } + + public Region parse(Reader input) throws ParserException { + Document document = parseOnly(input); + Element element = document.getDocumentElement(); + return parseElement(null, element); + } + + /** + * Creates nonvalidating parser. + */ + private XmlParser() { + initializeBuilder(); + } + + /** + * Parse given file and return DOM document. + */ + private Document parseOnly(Reader input) throws ParserException { + try { + Document document = builder.parse(new InputSource(input)); + return document; + } catch (SAXException e) { + throw new ParserException("Parsing error", e); + } catch (IOException e) { + throw new ParserException("IO error", e); + } + } + + private Region parseElement(ParentRegion parent, Element node) { + NodeList nodeList = node.getChildNodes(); + if ((nodeList.getLength() == 1) && (nodeList.item(0) instanceof Text)) { + return new ChildRegion(parent, node.getNodeValue()); + } else if (node instanceof Element) { + Element element = (Element)node; + ParentRegion region = new ParentRegion(parent, + element.getNodeName()); + for (int i = 0; i < nodeList.getLength(); ++i) { + Node domNode = nodeList.item(i); + if (domNode instanceof Element) { + Region child = parseElement(region, (Element)domNode); + if (child != null) { + region.addChild(child); + } + } + } + return region; + } else { + return null; + } + } + + /** + * Initialize document builder - parser. + */ + private void initializeBuilder() { + try { + builder = builderFactory.newDocumentBuilder(); + //Handle normal errors the same as fatal errors + builder.setErrorHandler(new XmlErrorHandler()); + } catch (ParserConfigurationException e) { + throw new InitializationException("Could not create XML parser: " + e.getMessage()); + } + } + + private static XmlParser instance = new XmlParser(); + + private static DocumentBuilderFactory builderFactory; + + private DocumentBuilder builder; + +} diff --git a/trash/Entry.java b/trash/Entry.java new file mode 100755 index 0000000..dee6f09 --- /dev/null +++ b/trash/Entry.java @@ -0,0 +1,37 @@ +package align.aligner.aligners.moore.models; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +public class Entry { + + private List translationList; + + public Entry() { + this.translationList = new ArrayList(); + } + + public List getTranslationList() { + return Collections.unmodifiableList(translationList); + } + + public void addTranslation(Translation translation) { + translationList.add(translation); + } + + public void removeTranslation(Translation translation) { + translationList.remove(translation); + } + + public float getProbability(String word) { + int index = translationList.indexOf(word); + if (index != -1) { + return translationList.get(index).getProbability(); + } else { + return 0.0f; + } + } + +} diff --git a/trash/FormatterException.java b/trash/FormatterException.java new file mode 100755 index 0000000..69f9acf --- /dev/null +++ b/trash/FormatterException.java @@ -0,0 +1,30 @@ +package align.formatter; + +/** + * Reprezentuje wyjątek który wystąpił podczas formatowania listy dopasowań. + * + * @author Jarek Lipski (loomchild) + */ +public class FormatterException extends Exception { + + private static final long serialVersionUID = 102L; + + /** + * Tworzy wyjątek. + * @param message Wiadomość. + */ + public FormatterException(String message) { + this(message, null); + } + + /** + * Tworzy wyjątek spowodowany przez inny wyjątek. + * @param message Wiadomość. + * @param cause Przyczyna. + */ + public FormatterException(String message, Throwable cause) { + super(message, cause); + } + + +} diff --git a/trash/IgnoreDTDEntityResolver.java b/trash/IgnoreDTDEntityResolver.java new file mode 100755 index 0000000..2d5b9bc --- /dev/null +++ b/trash/IgnoreDTDEntityResolver.java @@ -0,0 +1,20 @@ +package align.util.bind; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +public class IgnoreDTDEntityResolver implements EntityResolver { + + public IgnoreDTDEntityResolver() { + } + + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + return new InputSource(new ByteArrayInputStream(new byte[0])); + } + +} diff --git a/trash/LanguageRule.java b/trash/LanguageRule.java new file mode 100755 index 0000000..74dd541 --- /dev/null +++ b/trash/LanguageRule.java @@ -0,0 +1,77 @@ +package split.srx; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.PriorityQueue; + +import common.Region; + +public class LanguageRule { + + + public LanguageRule() { + ruleList = new LinkedList(); + } + + public List split(String text, Settings settings) { + // TODO zaimplemetnwoać brakujące sytuacje jeśli to konieczne + assert settings.isSegmentSubflows() == false; + assert settings.isIncludeIsolated() == true; + // To byłoby bez sensu (chyba?) + assert !(settings.isIncludeEnd() && !settings.isIncludeStart()); + + List segmentList = new LinkedList(); + + PriorityQueue queue = + new PriorityQueue(ruleList.size(), + RuleMatcherComparator.getInstance()); + + for (Rule rule : ruleList) { + RuleMatcher matcher = rule.getMatcher(text); + matcher.find(); + queue.add(matcher); + } + + int start = 0; + int position = 0; + while (queue.size() > 0) { + RuleMatcher matcher = queue.peek(); + if (matcher.getRule().isBreaking()) { + String segment = text.substring(start, + matcher.getBreakPosition()); + segmentList.add(segment); + if (settings.isIncludeStart()) { + start = matcher.getStartPosition(); + } else if (settings.isIncludeEnd()) { + start = matcher.getBreakPosition(); + } else { + start = matcher.getEndPosition(); + } + position = start; + } else { + position = matcher.getBreakPosition() + 1; + } + while((queue.size() > 0) && (matcher.getBreakPosition() + < position)) { + queue.remove(); + matcher.find(position); + if (!matcher.hitEnd()) { + queue.add(matcher); + } + matcher = queue.peek(); + } + } + String segment = text.substring(start); + segmentList.add(segment); + return segmentList; + + } + + public void addRule(Rule rule) { + ruleList.add(rule); + } + + private List ruleList; + +} diff --git a/trash/LengthBasedAlgorithmTest.java b/trash/LengthBasedAlgorithmTest.java new file mode 100755 index 0000000..b9fab77 --- /dev/null +++ b/trash/LengthBasedAlgorithmTest.java @@ -0,0 +1,40 @@ +package align.filter.aligner.align; + +import static align.util.Util.assertAlignmentEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +import align.Alignment; + +public class LengthBasedAlgorithmTest { + + @Test + public void testAlign() { + String sourceSegment1 = "very long sentence indeed"; + String sourceSegment2 = "medium sentemce"; + String targetSegment1 = "short 1"; + String targetSegment2 = "short 2"; + String targetSegment3 = "another medium"; + List sourceSegmentList = Arrays.asList(new String[]{ + sourceSegment1, sourceSegment2}); + List targetSegmentList = Arrays.asList(new String[]{ + targetSegment1, targetSegment2, targetSegment3}); + GaleChurchAlignAlgorithm aligner = new GaleChurchAlignAlgorithm(); + List alignmentList = aligner.align(sourceSegmentList, + targetSegmentList); + Alignment alignment; + assertEquals(2, alignmentList.size()); + alignment = alignmentList.get(0); + assertAlignmentEquals(new String[]{sourceSegment1}, + new String[]{targetSegment1, targetSegment2}, alignment); + alignment = alignmentList.get(1); + assertAlignmentEquals(new String[]{sourceSegment2}, + new String[]{targetSegment3}, alignment); + + } + +} diff --git a/trash/LexiconAligner.java b/trash/LexiconAligner.java new file mode 100644 index 0000000..7ea1898 --- /dev/null +++ b/trash/LexiconAligner.java @@ -0,0 +1,51 @@ +package net.sourceforge.align.filter.aligner; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import net.sourceforge.align.alignment.Alignment; +import net.sourceforge.align.filter.Filter; + +/** + * Hard to test if lexicon alignment occurs more than once, + * impossible to have n-0 alignments in lexicon. + * + * @author loomchild + */ +public class LexiconAligner implements Filter { + + private Map> sourceLexiconMap; + + private Map> targetLexiconMap; + + + public LexiconAligner(List lexiconAlignmentList) { + // check that lexicon contains no alignments with zero source or + // target segments + } + + public List apply(List alignmentList) { + // set all matched alignments in result list to have -Inf score. + // make rest of the program ignore such alignments. + List resultList = new ArrayList(); + + /*for (Alignment alignment : alignmentList) { + Iterator sourceIterator = + alignment.getSourceSegmentList().iterator(); + Iterator targetIterator = + alignment.getTargetSegmentList().iterator(); + + Alignment reference + + targetIterator. + + }*/ + + // set marked + + return resultList; + } + +} diff --git a/trash/Main.java b/trash/Main.java new file mode 100755 index 0000000..c5a47ee --- /dev/null +++ b/trash/Main.java @@ -0,0 +1,25 @@ +import java.io.IOException; +import java.util.List; + +import split.srx.Document; +import split.srx.Parser; + +public class Main { + + /** + * @param args + */ + public static void main(String[] args) { + try { + String text = "Przesyłam wam wersje jaką wysłałem. Jako że nikt nie zgłaszał poprawek (poza Grzegorzem z którym godzinkę pogadałem) poszło prawie identyczne jak w niedziele. Jeśli w waszym fragmencie (albo ogólnie) diagram wydaje wam się bezsensowny to będziemy musieli go jeszcze dalej w toku prac zmieniać, bo i tak musimy dobrze pojąć dziedzine jeśli mamy stworzyć porządny projekt. Miejmy nadzieje że nam to zaliczą (bo rysowanie modeli dziedziny to jeszcze nie nauka ścisła, można to zrobić na mnóśtwo sposobów poprawnie, ważne żeby nam to się przydało), ale jeśli dalej nasza współpraca będzie tak wyglądać to projekt będzie beznadziejny. Pamiętajcie że było nie było jesteśmy jednym zespołem i robimy projekt wspólnie więc wszelka dyskusja jest jak najbardziej wskazana. Licze na to że w dalszych częsciach uda nam się problem jasno między nas rozdzielić i ewentualnie dogadywać miejsca w których nasze podzadania będą się łączyć (pewnie niestety będzie ich dużo jak zwykle), bo taka forma pracy widać zawodzi. Dla mnie ten porzedmiot jest trochę nudny i też mi się nie chce nim zajmować (bo to w sumie \"ładne rysunki\", nie wiadmo jak to się sprawdzi w praktyce), ale myśle że teraz będzie już coraz lepiej bo zaczniemy się zajmować nauką bardziej ścisłą od analizy - projektowaniem, gdzie będą czasem jasne wzorce jak coś zrobić a nie tylko domysły."; + Document document = Parser.getInstance().parse("data/test/polsplit.srx"); + List list = document.split(text, "PL_pl", "Default"); + System.out.println(list); + } catch (IOException e) { + e.printStackTrace(); + } catch (XmlException e) { + e.printStackTrace(); + } + } + +} diff --git a/trash/MooreCategoryList.java b/trash/MooreCategoryList.java new file mode 100755 index 0000000..edaab4e --- /dev/null +++ b/trash/MooreCategoryList.java @@ -0,0 +1,28 @@ +package net.sourceforge.align.category.list; + +import java.util.AbstractList; + +import net.sourceforge.align.category.Category; + +/** + * Represents list of categories described in Moore's paper. + * + * @author loomchild + */ +public class MooreCategoryList extends AbstractList { + + private static final Category[] ARRAY = { + new Category(1, 1, 0.94f), + new Category(1, 0, 0.01f), new Category(0, 1, 0.01f), + new Category(2, 1, 0.02f), new Category(1, 2, 0.02f), + }; + + public Category get(int index) { + return ARRAY[index]; + } + + public int size() { + return ARRAY.length; + } + +} diff --git a/trash/ParentRegion.java b/trash/ParentRegion.java new file mode 100755 index 0000000..936846d --- /dev/null +++ b/trash/ParentRegion.java @@ -0,0 +1,68 @@ +package regions; + +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + + +public class ParentRegion extends Region { + + public ParentRegion(ParentRegion parent) { + super(parent); + this.children = new LinkedList(); + } + + public String getContent() { + Iterator i = getChildren().iterator(); + if (i.hasNext()) { + StringBuilder content = new StringBuilder(); + content.append(i.next().getContent()); + while (i.hasNext()) { + content.append(" " + i.next().getContent()); + } + return content.toString(); + } else { + return ""; + } + } + + public int getLength() { + int length = 0; + for (Region child : getChildren()) { + length += child.getLength(); + } + return length; + } + + public List getChildren() { + return Collections.unmodifiableList(children); + } + + /** + * Adds child. + * @param child + */ + public void addChild(Region child) { + children.add(child); + } + + /** + * Removes child. + * @param child + * @return Returns true if child was removed. + */ + public boolean removeChild(Region child) { + return children.remove(child); + } + + /** + * Remove all children from this node. + */ + public void removeAllChildren() { + children.clear(); + } + + private List children; + +} diff --git a/trash/Parser.java b/trash/Parser.java new file mode 100755 index 0000000..e526602 --- /dev/null +++ b/trash/Parser.java @@ -0,0 +1,11 @@ +package parsers; + +import java.io.BufferedReader; + +import regions.Region; + +public interface Parser { + + Region parse(BufferedReader input) throws ParserException; + +} diff --git a/trash/ParserException.java b/trash/ParserException.java new file mode 100755 index 0000000..58e8167 --- /dev/null +++ b/trash/ParserException.java @@ -0,0 +1,15 @@ +package parsers; + +public class ParserException extends Exception { + + public ParserException(String message) { + this(message, null); + } + + public ParserException(String message, Throwable cause) { + super(message, cause); + } + + private static final long serialVersionUID = 100L; + +} diff --git a/trash/PlaintextParser.java b/trash/PlaintextParser.java new file mode 100755 index 0000000..2e761de --- /dev/null +++ b/trash/PlaintextParser.java @@ -0,0 +1,69 @@ +package parsers; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import regions.Region; + +public class PlaintextParser implements Parser { + + public PlaintextParser() { + this.separatorList = new ArrayList(); + } + + public Region parse(BufferedReader input) throws ParserException { + StringBuilder content = new StringBuilder(); + try { + String line = input.readLine(); + while(line != null) { + content.append(line); + line = input.readLine(); + if (line != null) { + content.append('\n'); + } + } + } catch (IOException e) { + throw new ParserException("IO error", e); + } + Region region = new Region(null, content.toString()); + split(region, 0); + return region; + } + + public List getSeparatorList() { + return separatorList; + } + + public void addSeparator(String separator) { + this.separatorList.add(separator); + } + + public void removeSeparator(int nr) { + this.separatorList.remove(nr); + } + + /** + * Splits region using separator with given number from separatorList. + * Recursively calls itself until separatorNr is greater than number of + * separators. + * @param region Region to be splitted, is modified! + * @param separatorNr separator number in separatorList. + */ + private void split(Region region, int separatorNr) { + if (separatorNr < separatorList.size()) { + String content = region.getContent(); + String separator = separatorList.get(separatorNr); + String[] childContentList = content.split(separator); + for(String childContent : childContentList) { + Region child = new Region(region, childContent); + split(child, separatorNr + 1); + region.addChild(child); + } + } + } + + private List separatorList; + +} diff --git a/trash/PlaintextParserOld.java b/trash/PlaintextParserOld.java new file mode 100755 index 0000000..e3b9d1c --- /dev/null +++ b/trash/PlaintextParserOld.java @@ -0,0 +1,66 @@ +package parsers; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import regions.Region; + +public class PlaintextParser implements Parser { + + public PlaintextParser() { + this.separatorList = new ArrayList(); + } + + public Region parse(BufferedReader input) throws ParserException { + StringBuilder content = new StringBuilder(); + String line; + try { + while((line = input.readLine()) != null) { + content.append(line); + content.append('\n'); + } + } catch (IOException e) { + throw new ParserException("IO error", e); + } + Region region = new Region(null, content.toString()); + split(region, 0); + return region; + } + + public List getSeparatorList() { + return separatorList; + } + + public void addSeparator(String separator) { + this.separatorList.add(separator); + } + + public void removeSeparator(int nr) { + this.separatorList.remove(nr); + } + + /** + * Splits region using separator with given number from separatorList. + * Recursively calls itself until separatorNr is greater than number of + * separators. + * @param region Region to be splitted, is modified! + * @param separatorNr separator number in separatorList. + */ + private void split(Region region, int separatorNr) { + if (separatorNr < separatorList.size()) { + String content = region.getContent(); + String separator = separatorList.get(separatorNr); + String[] childContentList = content.split(separator); + for(String childContent : childContentList) { + Region child = new Region(region, childContent); + split(child, separatorNr + 1); + region.addChild(child); + } + } + } + + private List separatorList; + +} diff --git a/trash/PlaintextParserOldTest.java b/trash/PlaintextParserOldTest.java new file mode 100755 index 0000000..a6c8707 --- /dev/null +++ b/trash/PlaintextParserOldTest.java @@ -0,0 +1,31 @@ +package parsers; + +import junit.framework.TestCase; + +public class PlaintextParserTest extends TestCase { + + public PlaintextParserTest() { + this.parser = new PlaintextParser(); + parser.addSeparator("\n\n"); + parser.addSeparator("\n"); + } + + public void testParse() { + + } + + public void testSeparators() { + PlaintextParser testParser = new PlaintextParser(); + assertEquals(0, testParser.getSeparatorList().size()); + testParser.addSeparator("aaa"); + assertEquals(1, testParser.getSeparatorList().size()); + testParser.addSeparator("bbb"); + assertEquals(2, testParser.getSeparatorList().size()); + testParser.removeSeparator(0); + assertEquals(1, testParser.getSeparatorList().size()); + assertEquals("bbb", testParser.getSeparatorList().get(0)); + } + + private PlaintextParser parser; + +} diff --git a/trash/PlaintextParserTest.java b/trash/PlaintextParserTest.java new file mode 100755 index 0000000..4075c9f --- /dev/null +++ b/trash/PlaintextParserTest.java @@ -0,0 +1,62 @@ +package parsers; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; + +import regions.Region; + +import junit.framework.TestCase; + +public class PlaintextParserTest extends TestCase { + + public static final String FILE_NAME = "data/test/simpleinput.txt"; + + public PlaintextParserTest() { + this.parser = new PlaintextParser(); + parser.addSeparator("\n\n"); + parser.addSeparator("\n"); + } + + public void testParse() { + Region region = null; + BufferedReader reader; + try { + reader = new BufferedReader(new FileReader(FILE_NAME)); + region = parser.parse(reader); + } catch (FileNotFoundException e) { + fail("Test file not found: " + e); + } catch (ParserException e) { + fail("Parser exception: " + e); + } + + assertEquals("dokument1, paragraf1\n\ndokument2, paragraf1\n" + + "dokument2, paragraf2", region.getContent()); + assertEquals(2, region.getChildren().size()); + region = region.getChildren().get(1); + + assertEquals("dokument2, paragraf1\ndokument2, paragraf2", + region.getContent()); + assertEquals(2, region.getChildren().size()); + region = region.getChildren().get(1); + + assertEquals("dokument2, paragraf2", + region.getContent()); + assertEquals(0, region.getChildren().size()); + } + + public void testSeparators() { + PlaintextParser testParser = new PlaintextParser(); + assertEquals(0, testParser.getSeparatorList().size()); + testParser.addSeparator("aaa"); + assertEquals(1, testParser.getSeparatorList().size()); + testParser.addSeparator("bbb"); + assertEquals(2, testParser.getSeparatorList().size()); + testParser.removeSeparator(0); + assertEquals(1, testParser.getSeparatorList().size()); + assertEquals("bbb", testParser.getSeparatorList().get(0)); + } + + private PlaintextParser parser; + +} diff --git a/trash/Region.java b/trash/Region.java new file mode 100755 index 0000000..2f30539 --- /dev/null +++ b/trash/Region.java @@ -0,0 +1,66 @@ +package regions; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class Region { + + public Region(Region parent, String content) { + this.parent = parent; + this.content = content; + this.children = new LinkedList(); + } + + public Region getParent() { + return parent; + } + + public void setParent(Region parent) { + this.parent = parent; + } + + public String getContent() { + return content; + } + + public int getLength() { + return content.length(); + } + + public List getChildren() { + return Collections.unmodifiableList(children); + } + + /** + * Adds child. + * @param child + */ + public void addChild(Region child) { + children.add(child); + } + + /** + * Removes child. + * @param child + * @return Returns true if child was removed. + */ + public boolean removeChild(Region child) { + return children.remove(child); + } + + /** + * Remove all children from this node. + */ + public void removeAllChildren() { + children.clear(); + } + + private Region parent; + + private List children; + + //Performance optimization, addtional memory cost + private String content; + +} diff --git a/trash/RegionInt.java b/trash/RegionInt.java new file mode 100755 index 0000000..a951038 --- /dev/null +++ b/trash/RegionInt.java @@ -0,0 +1,32 @@ +package regions; + +import java.util.List; + +/** + * Represents text region in document. Contains InternalRegions + * or is ChildRegion. + * @author loomchild + */ +public interface Region { + + /** + * @return Returns region's parent (null if region is root) + */ + ParentRegion getParent(); + + /** + * @return Returns const list of region children. + */ + List getChildren(); + + /** + * @return Returns region's content. + */ + String getContent(); + + /** + * *@return Returns content lenght (== getContent.lenght()), but more efficient. + */ + int getLength(); + +} diff --git a/trash/RegionOld.java b/trash/RegionOld.java new file mode 100755 index 0000000..e892f7e --- /dev/null +++ b/trash/RegionOld.java @@ -0,0 +1,43 @@ +package regions; + +import java.util.List; + +/** + * Represents text region in document. Contains InternalRegions + * or is ChildRegion. + * @author loomchild + */ +public abstract class Region { + + public Region(ParentRegion parent) { + this.parent = parent; + if (parent != null) { + parent.addChild(this); + } + } + + /** + * @return Returns region's parent (null if region is root) + */ + public ParentRegion getParent() { + return parent; + } + + /** + * @return Returns const list of region children. + */ + public abstract List getChildren(); + + /** + * @return Returns region's content. + */ + public abstract String getContent(); + + /** + * *@return Returns content lenght (== getContent.lenght()), but more efficient. + */ + public abstract int getLength(); + + private ParentRegion parent; + +} diff --git a/trash/Segamentator.java b/trash/Segamentator.java new file mode 100755 index 0000000..04019a0 --- /dev/null +++ b/trash/Segamentator.java @@ -0,0 +1,20 @@ +package segmentators; + +import java.util.List; + +import regions.Region; + +public abstract class Segamentator { + + public void split(Region region) { + String content = region.getContent(); + List childContentList = split(content); + for(String childContent : childContentList) { + Region child = new Region(region, childContent); + region.addChild(child); + } + } + + protected abstract List split(String text); + +} diff --git a/trash/SentenceSegmentator.java b/trash/SentenceSegmentator.java new file mode 100755 index 0000000..0ee107f --- /dev/null +++ b/trash/SentenceSegmentator.java @@ -0,0 +1,25 @@ +package segmentators; + +import java.text.BreakIterator; +import java.util.ArrayList; +import java.util.List; + +import regions.Region; + +public class SentenceSegmentator extends Segamentator { + + protected List split(String text) { + int start, end; + ArrayList sentenceList = new ArrayList(); + //Uses default locale, change... + BreakIterator breakIterator = BreakIterator.getSentenceInstance(); + breakIterator.setText(text); + start = breakIterator.first(); + for (end = breakIterator.next(); end != BreakIterator.DONE; + start = end, end = breakIterator.next()){ + sentenceList.add(text.substring(start, end)); + } + return sentenceList; + } + +} diff --git a/trash/SeparatorSegmentator.java b/trash/SeparatorSegmentator.java new file mode 100755 index 0000000..21f00b7 --- /dev/null +++ b/trash/SeparatorSegmentator.java @@ -0,0 +1,25 @@ +package segmentators; + +import java.util.ArrayList; +import java.util.List; + +import regions.Region; + +public class SeparatorSegmentator extends Segamentator { + + public SeparatorSegmentator(String separator) { + this.separator = separator; + } + + protected List split(String text) { + String[] childContentList = text.split(separator); + List list = new ArrayList(childContentList.length); + for(String childContent : childContentList) { + list.add(childContent); + } + return list; + } + + private String separator; + +} diff --git a/trash/SimpleTaskTest.java b/trash/SimpleTaskTest.java new file mode 100755 index 0000000..63bf886 --- /dev/null +++ b/trash/SimpleTaskTest.java @@ -0,0 +1,103 @@ +package align.task; + +import static loomchild.util.Utils.readAll; +import static loomchild.util.testing.Utils.assertListEquals; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.LinkedList; +import java.util.List; + +import align.aligner.Aligner; +import align.aligner.AlignerMock; +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; +import align.splitter.Splitter; +import align.splitter.SplitterMock; + +import junit.framework.TestCase; + +public class SimpleTaskTest extends TestCase { + + private SimpleTask task; + + public void setUp() { + Splitter sourceSplitter = new SplitterMock(1); + Splitter targetSplitter = new SplitterMock(2); + Aligner aligner = new AlignerMock(); + task = new SimpleTask(sourceSplitter, targetSplitter, aligner); + } + + public void testUseDifferentSplitters() throws AlignmentImpossibleException { + List alignmentList = task.run("abcd", "efgh"); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + assertListEquals(new String[]{"a", "b", "c", "d",}, + alignment.getSourceSegmentList()); + assertListEquals(new String[]{"ef", "gh",}, + alignment.getTargetSegmentList()); + } + + public void testAlignManyToZero() + throws AlignmentImpossibleException, IOException { + String sourceText = "abcd"; + String targetText = ""; + checkManyToZero(runTask(sourceText, targetText)); + checkManyToZero(runTaskFromReaders(sourceText, targetText)); + } + + private void checkManyToZero(List alignmentList) { + Alignment alignment = getOnlyElement(alignmentList); + assertListEquals(new String[]{"a", "b", "c", "d",}, + alignment.getSourceSegmentList()); + assertListEquals(new String[]{}, alignment.getTargetSegmentList()); + } + + public void testAlignZeroToMany() + throws AlignmentImpossibleException, IOException { + String sourceText = ""; + String targetText = "efgh"; + checkZeroToMany(runTask(sourceText, targetText)); + checkZeroToMany(runTaskFromReaders(sourceText, targetText)); + } + + private void checkZeroToMany(List alignmentList) { + Alignment alignment = getOnlyElement(alignmentList); + assertListEquals(new String[]{}, alignment.getSourceSegmentList()); + assertListEquals(new String[]{"ef", "gh",}, + alignment.getTargetSegmentList()); + } + + public void testAlignZeroToZero() + throws AlignmentImpossibleException, IOException { + String sourceText = ""; + String targetText = ""; + checkZeroToZero(runTask(sourceText, targetText)); + checkZeroToZero(runTaskFromReaders(sourceText, targetText)); + } + + private void checkZeroToZero(List alignmentList) { + assertEquals(0, alignmentList.size()); + } + + private List runTask(String sourceString, String targetString) + throws AlignmentImpossibleException { + return task.run(sourceString, targetString); + } + + private List runTaskFromReaders(String sourceString, + String targetString) + throws AlignmentImpossibleException, IOException { + Reader sourceReader = new StringReader(sourceString); + Reader targetReader = new StringReader(targetString); + return task.run(sourceReader, targetReader); + } + + private T getOnlyElement(List list) { + assertEquals(1, list.size()); + return list.get(0); + } + +} + diff --git a/trash/SrxSplitAlgorithm.java b/trash/SrxSplitAlgorithm.java new file mode 100755 index 0000000..695b7a2 --- /dev/null +++ b/trash/SrxSplitAlgorithm.java @@ -0,0 +1,44 @@ +package align.filter.modifier.modify.split; + + +import java.io.Reader; +import java.util.List; + +/** + * Reprezentuje splitter dzielący tekst za pomocą reguł zapisanych w formacie + * SRX. + * + * @author Jarek Lipski (loomchild) + */ +public class SrxSplitAlgorithm extends SplitAlgorithm { + + { + isSplitPresent = isSplitPresent(); + } + + private static boolean isSplitPresent; + + private SplitAlgorithm algorithm; + + public SrxSplitAlgorithm(Reader reader, String languageCode) { + if (isSplitPresent) { + this.algorithm = new SrxSplitAlgorithmImpl(reader, languageCode); + } else { + this.algorithm = new SrxSplitAlgorithmMock(); + } + } + + private static boolean isSplitPresent() { + try { + Class.forName("split.srx.SrxSplitter"); + } catch (ClassNotFoundException e) { + return false; + } + return true; + } + + public List split(String string) { + return algorithm.split(string); + } + +} diff --git a/trash/SrxSplitAlgorithmImpl.java b/trash/SrxSplitAlgorithmImpl.java new file mode 100755 index 0000000..181f3a5 --- /dev/null +++ b/trash/SrxSplitAlgorithmImpl.java @@ -0,0 +1,44 @@ +package align.filter.modifier.modify.split; + + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +import split.srx.Document; +import split.srx.LanguageRule; +import split.srx.MapRule; +import split.srx.Parser; + +/** + * Reprezentuje splitter dzielący tekst za pomocą reguł zapisanych w formacie + * SRX. + * + * @author Jarek Lipski (loomchild) + */ +public class SrxSplitAlgorithmImpl extends SplitAlgorithm { + + private LanguageRule languageRule; + + private split.srx.SrxSplitter splitter; + + public SrxSplitAlgorithmImpl(Reader reader, String languageCode) { + Document srxDocument = Parser.getInstance().parse(reader); + MapRule mapRule = srxDocument.getSingletonMapRule(); + languageRule = mapRule.getLanguageMap(languageCode).getLanguageRule(); + } + + /** + * @inheritDoc + */ + public List split(String string) { + splitter = new split.srx.SrxSplitter(languageRule, string); + List segmentList = new ArrayList(); + while(splitter.hasNext()) { + String segment = splitter.next(); + segmentList.add(segment); + } + return segmentList; + } + +} diff --git a/trash/SrxSplitAlgorithmMock.java b/trash/SrxSplitAlgorithmMock.java new file mode 100755 index 0000000..1f13621 --- /dev/null +++ b/trash/SrxSplitAlgorithmMock.java @@ -0,0 +1,17 @@ +package align.filter.modifier.modify.split; + + +import java.util.List; + +/** + * Reprezentuje atrape splittera SRX. + * + * @author Jarek Lipski (loomchild) + */ +public class SrxSplitAlgorithmMock extends SplitAlgorithm { + + public List split(String string) { + throw new UnsupportedOperationException("SRX splitter is not installed"); + } + +} diff --git a/trash/Trainer.java b/trash/Trainer.java new file mode 100755 index 0000000..239d7cd --- /dev/null +++ b/trash/Trainer.java @@ -0,0 +1,35 @@ +package align.aligner.aligners.moore.translationmodel; + +import java.util.LinkedList; +import java.util.List; + +import align.splitter.WordSplitter; + +public class Trainer { + + public Trainer() { + } + + public TranslationModel train(int iterationCount, + List sourceSegmentList, List targetSegmentList) { + assert sourceSegmentList.size() == targetSegmentList.size(); + assert iterationCount >= 1; + + + return null; + } + + /* + * Optymalizacja + private List< List > splitIntoWords(List sentenceList) { + WordSplitter splitter = new WordSplitter(); + List< List > list = new LinkedList< List >(); + for (String sentence : sentenceList) { + List wordList = splitter.split(sentence); + list.add(wordList); + } + return list; + } + */ + +} diff --git a/trash/Translation.java b/trash/Translation.java new file mode 100755 index 0000000..3fcebc8 --- /dev/null +++ b/trash/Translation.java @@ -0,0 +1,23 @@ +package align.aligner.aligners.moore.models; + +public class Translation { + + private String word; + + private float probability; + + public Translation(String word, float probability) { + this.word = word; + this.probability = probability; + } + + public float getProbability() { + return probability; + } + + public String getWord() { + return word; + } + + +} diff --git a/trash/WordNotFoundException.java b/trash/WordNotFoundException.java new file mode 100755 index 0000000..b6fea6d --- /dev/null +++ b/trash/WordNotFoundException.java @@ -0,0 +1,13 @@ +package align.aligner.aligners.moore.models; + +import loomchild.util.exceptions.LogicException; + +public class WordNotFoundException extends LogicException { + + private static final long serialVersionUID = 1474443021847245849L; + + public WordNotFoundException(String word) { + super("No such word: " + word); + } + +} diff --git a/trash/XmlErrorHandler.java b/trash/XmlErrorHandler.java new file mode 100755 index 0000000..1b10c79 --- /dev/null +++ b/trash/XmlErrorHandler.java @@ -0,0 +1,34 @@ +package parsers; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +/** + * Represents strict error handler. Used to report validation errors. + * @author loomchild + */ +public class XmlErrorHandler implements ErrorHandler { + + /** + * Ignores warnings. + */ + public void warning(SAXParseException exception) throws SAXException { + //Ignore warnings or log them? + } + + /** + * Throws errors. + */ + public void error(SAXParseException exception) throws SAXException { + throw exception; + } + + /** + * Throws fatal errors. + */ + public void fatalError(SAXParseException exception) throws SAXException { + throw exception; + } + +} diff --git a/trash/XmlHandler.java b/trash/XmlHandler.java new file mode 100755 index 0000000..7e371ee --- /dev/null +++ b/trash/XmlHandler.java @@ -0,0 +1,82 @@ +package parsers; + +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; + +import regions.ChildRegion; +import regions.ParentRegion; +import regions.Region; + +public class XmlHandler implements ContentHandler { + + public XmlHandler() { + } + + public void setDocumentLocator(Locator locator) { + } + + public void startDocument() throws SAXException { + parent = null; + region = null; + content = ""; + } + + public void endDocument() throws SAXException { + } + + public void startPrefixMapping(String prefix, String uri) + throws SAXException { + } + + public void endPrefixMapping(String prefix) throws SAXException { + } + + public void startElement(String uri, String localName, String qName, + Attributes atts) throws SAXException { + if (region ) + parent = new ParentRegion(parent); + region = null; + content = ""; + } + + public void endElement(String uri, String localName, String qName) + throws SAXException { + if (region == null) { + new ChildRegion(parent, content); + content = ""; + } + region = parent; + parent = parent.getParent(); + } + + public void characters(char[] ch, int start, int length) + throws SAXException { + if (region == null) { + content += new String(ch, start, length); + } + } + + public void ignorableWhitespace(char[] ch, int start, int length) + throws SAXException { + } + + public void processingInstruction(String target, String data) + throws SAXException { + } + + public void skippedEntity(String name) throws SAXException { + } + + public Region getRegion() { + return region; + } + + private Region region; + + private ParentRegion parent; + + String content; + +} diff --git a/trash/XmlParser.java b/trash/XmlParser.java new file mode 100755 index 0000000..c35c0c2 --- /dev/null +++ b/trash/XmlParser.java @@ -0,0 +1,49 @@ +package parsers; + +import java.io.IOException; +import java.io.Reader; + +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; + +import regions.Region; + +import exceptions.InitializationException; + +public class XmlParser implements Parser { + + + public static XmlParser getInstance() { + return instance; + } + + public Region parse(Reader reader) throws ParserException { + parser.setContentHandler(handler); + try { + parser.parse(new InputSource(reader)); + } catch (IOException e) { + throw new ParserException("IO error during parsing",e); + } catch (SAXException e) { + throw new ParserException("SAX error during parsing",e); + } + return handler.getRegion(); + } + + private XmlParser() { + try { + parser = XMLReaderFactory.createXMLReader(); + handler = new XmlHandler(); + } catch (SAXException e) { + throw new InitializationException("Cannot crete XML parser: " + + e.getMessage()); + } + } + + private static XmlParser instance = new XmlParser(); + + private XMLReader parser; + private XmlHandler handler; + +} diff --git a/trash/XmlParserTest.java b/trash/XmlParserTest.java new file mode 100755 index 0000000..6fd9789 --- /dev/null +++ b/trash/XmlParserTest.java @@ -0,0 +1,40 @@ +package parsers; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; + +import regions.Region; +import junit.framework.TestCase; + +public class XmlParserTest extends TestCase { + + public static final String DOCUMENT = "test/documentx.xml"; + + public XmlParserTest() { + parser = XmlParser.getInstance(); + } + + public void testParse() { + Region document = null; + try { + BufferedReader file = new BufferedReader(new FileReader(DOCUMENT)); + document = parser.parse(file); + } catch (ParserException e) { + fail("Parser error parsing correct document: " + e.getMessage()); + } catch (FileNotFoundException e) { + fail("File not found: " + e.getMessage()); + } + assertEquals("To zdanie to drugie jeszcze",document.getContent()); + assertEquals(2, document.getChildren().size()); + Region region = document.getChildren().get(0); + assertEquals(2, region.getChildren().size()); + region = region.getChildren().get(1); + System.out.println(region.getContent()); + assertEquals(0, region.getChildren().size()); + assertEquals("to drugie", region.getContent()); + } + + private Parser parser; + +} diff --git a/trash/align.bat b/trash/align.bat new file mode 100755 index 0000000..6f2db84 --- /dev/null +++ b/trash/align.bat @@ -0,0 +1,3 @@ +@echo off +set SCRIPT_DIR=%~p0 +java -cp "%CLASSPATH%;%SCRIPT_DIR%\..\res;%SCRIPT_DIR%\..\lib\align.jar;%SCRIPT_DIR%\..\lib\split.jar;%SCRIPT_DIR%\..\lib\loomchild.jar" ui.swing.Align \ No newline at end of file diff --git a/trash/align.tar.gz b/trash/align.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c9506c43ad1c166289d6f755b3d868e00acb70f7 GIT binary patch literal 198660 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
    T-rc0`R;=Or^-)?{sZcVeSbs% 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

    Qxs{1vO5Ad7n96>QI|AAiwOOv(`# zkp*k0%JEz9ii+QWEfFr|@M52sH)(PX2up*Q{(8j4{4SzCFK@FK5|nknrAj$hx>FvK zftXr4Hfb%Ooo|`I90AYO4&xjesYW(}eu{=JT(_y<%-vJH!`OXUVMvBCFXtWYQaI& z+_&!8D)emF6#ykIuG?1F8(T^uHMmx&z^ALYn`e0!qq_}>73#&tzC^Qy?PW<>9Iu%? zfka(aOuGtfdrwkF;w`fX5?HZ~GqWQVDImd%cFvj=+n{RdA8Dj)gB&XOP^@# zrTCtX0jjzTBJp@lrQ?5b-rHN9-Y^%o#Fe}%%*|er_Y0WpRo*M+rEY1|_BNfwatvce z5G`Wukb;A=ReXC*5!tKR#Bk^P$lf(ie41sCe_FJQ&hnmKo5q`pwWT!86 zgGf|NTTVn-D=W{;ao6_kMWf`dE*K|m53S9yYV}>k_liVR?iO64ipP~>Y>M8)U{}cf zWM_7yd7v;G@i_?dBGYNYBELp+5 z7J){jGWgKO{PacPz=0U=7^Rz;K_;Go-EpOior^3m^-YdmCO zBE|mT-JDr)ou#e{(f4Z2UzHjWoZ{&w>Vvt&tO7b!D@W~g(8sQPofEMYfTMz!i+f))DL$H37GJgZLQ?|KYU=0e1yl^URXL9;mF84bov45`p;C3vrud zL!{D!k0C0iHH3i0?RJKIuekKV2{Zk8Fytzic18=dlhs#+`GUuck`XAQv?97DY3w^u zeV5~O+TBr}Mqai0x|p9dy?0a0i7*#86XO-rDRs&^GV!3qxn_6~?e=8G`ewdr66}

    (7qj&Vaob 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

  • EGdO$UR>MCd|Q-tI|PT|L)twG$ImX2pPt2VGhI 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 leftAlignmentList, + List rightAlignmentList); + +} diff --git a/trash/comparatornew/.svn/text-base/ComparatorTestSuite.java.svn-base b/trash/comparatornew/.svn/text-base/ComparatorTestSuite.java.svn-base new file mode 100755 index 0000000..b9caec9 --- /dev/null +++ b/trash/comparatornew/.svn/text-base/ComparatorTestSuite.java.svn-base @@ -0,0 +1,11 @@ +package net.sourceforge.align.comparator; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + SequentialComparatorTest.class +}) +public class ComparatorTestSuite { +} diff --git a/trash/comparatornew/.svn/text-base/Diff.java.svn-base b/trash/comparatornew/.svn/text-base/Diff.java.svn-base new file mode 100755 index 0000000..028391b --- /dev/null +++ b/trash/comparatornew/.svn/text-base/Diff.java.svn-base @@ -0,0 +1,34 @@ +package net.sourceforge.align.comparator; + +import java.util.List; + +import net.sourceforge.align.Alignment; + + +/** + * Reprezentuje wynik porównania dopasowań. Odpowiada za przechowywanie + * różnic w dopasowaniach. + * + * @author Jarek Lipski (loomchild) + */ +public class Diff { + + private List leftOnlyAlignmentList; + + private List rightOnlyAlignmentList; + + public Diff(List leftOnlyAlignmentList, + List rightOnlyAlignmentList) { + this.leftOnlyAlignmentList = leftOnlyAlignmentList; + this.rightOnlyAlignmentList = rightOnlyAlignmentList; + } + + public List getLeftOnlyAlignmentList() { + return leftOnlyAlignmentList; + } + + public List getRightOnlyAlignmentList() { + return rightOnlyAlignmentList; + } + +} diff --git a/trash/comparatornew/.svn/text-base/SequentialComparator.java.svn-base b/trash/comparatornew/.svn/text-base/SequentialComparator.java.svn-base new file mode 100755 index 0000000..cc3f0ab --- /dev/null +++ b/trash/comparatornew/.svn/text-base/SequentialComparator.java.svn-base @@ -0,0 +1,58 @@ +package net.sourceforge.align.comparator; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.Alignment; + +/** + * Reprezentuje porównywacz sekwencyjny. + * + * @author Jarek Lipski (loomchild) + */ +public class SequentialComparator implements Comparator { + + /** + * Porównuje listy dopasowań. Zeby dopasowania były uznane za identyczne + * muszą być takie same i występować w takim samym porządku. + * Nie działa gdy w tekście występują powtórzone dopasowania ponieważ + * może wtedy nie znaleźć najdłuższego możliwego dopasowania. + * @param leftAlignmentList Pierwsza lista dopasowań. + * @param rightAlignmentList Druga lista dopasowań. + * @return Zwraca listę różnic. + */ + public Diff compare(List leftAlignmentList, + List rightAlignmentList) { + List leftOnlyAlignmentList = new ArrayList(); + List rightOnlyAlignmentList = new ArrayList(); + int startIndex = 0; + for (Alignment leftAlignment : leftAlignmentList) { + int index = startIndex; + Iterator rightIterator = + rightAlignmentList.listIterator(index); + while(rightIterator.hasNext()) { + Alignment rightAlignment = rightIterator.next(); + if (leftAlignment.equals(rightAlignment)) { + rightOnlyAlignmentList.addAll( + rightAlignmentList.subList(startIndex, index)); + startIndex = index + 1; + break; + } else { + ++index; + } + } + //Gdy nie znaleziono identycznego dopasowania + if (startIndex <= index) { + leftOnlyAlignmentList.add(leftAlignment); + } + } + if (startIndex < rightAlignmentList.size()) { + rightOnlyAlignmentList.addAll( + rightAlignmentList.subList(startIndex, + rightAlignmentList.size())); + } + return new Diff(leftOnlyAlignmentList, rightOnlyAlignmentList); + } + +} diff --git a/trash/comparatornew/.svn/text-base/SequentialComparatorTest.java.svn-base b/trash/comparatornew/.svn/text-base/SequentialComparatorTest.java.svn-base new file mode 100755 index 0000000..396e3b3 --- /dev/null +++ b/trash/comparatornew/.svn/text-base/SequentialComparatorTest.java.svn-base @@ -0,0 +1,90 @@ +package net.sourceforge.align.comparator; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; +import static net.sourceforge.align.util.Util.filterSegmentArray; + +import java.util.List; + +import net.sourceforge.align.Alignment; + +import org.junit.Test; + +public class SequentialComparatorTest { + + public static final String[][] LEFT_SOURCE_ARRAY = new String[][] { + new String[] {"aa", "bb"}, + new String[] {}, + new String[] {"cc"}, + new String[] {"dd", "ee"}, + new String[] {}, + new String[] {}, + new String[] {"ff"}, + new String[] {"gg"}, + new String[] {"hh"}, + new String[] {"ii"}, + new String[] {}, + }; + + public static final String[][] LEFT_TARGET_ARRAY = new String[][] { + new String[] {"11"}, + new String[] {"22"}, + new String[] {"33"}, + new String[] {"44"}, + new String[] {}, + new String[] {"55"}, + new String[] {"66"}, + new String[] {"77"}, + new String[] {"88"}, + new String[] {}, + new String[] {"99"}, + }; + + public static final String[][] RIGHT_SOURCE_ARRAY = new String[][] { + new String[] {"aa", "bb"}, + new String[] {"cc"}, + new String[] {}, + new String[] {}, + new String[] {"ff", "gg"}, + new String[] {"hh"}, + new String[] {"ii"}, + }; + + public static final String[][] RIGHT_TARGET_ARRAY = new String[][] { + new String[] {"11", "22"}, + new String[] {"33"}, + new String[] {}, + new String[] {"55"}, + new String[] {"66", "77"}, + new String[] {"88"}, + new String[] {"99"}, + }; + + public static final int[] LEFT_ONLY_INDEXES = new int[] { + 0, 1, 3, 6, 7, 9, 10, + }; + + public static final int[] RIGHT_ONLY_INDEXES = new int[] { + 0, 4, 6, + }; + + @Test + public void compare() { + List leftAlignmentList = createAlignmentList( + LEFT_SOURCE_ARRAY, LEFT_TARGET_ARRAY); + List rightAlignmentList = createAlignmentList( + RIGHT_SOURCE_ARRAY, RIGHT_TARGET_ARRAY); + Comparator comparator = new SequentialComparator(); + Diff result = comparator.compare(leftAlignmentList, + rightAlignmentList); + assertAlignmentListEquals( + filterSegmentArray(LEFT_SOURCE_ARRAY, LEFT_ONLY_INDEXES), + filterSegmentArray(LEFT_TARGET_ARRAY, LEFT_ONLY_INDEXES), + result.getLeftOnlyAlignmentList()); + assertAlignmentListEquals( + filterSegmentArray(RIGHT_SOURCE_ARRAY, RIGHT_ONLY_INDEXES), + filterSegmentArray(RIGHT_TARGET_ARRAY, RIGHT_ONLY_INDEXES), + result.getRightOnlyAlignmentList()); + } + +} diff --git a/trash/comparatornew/Comparator.java b/trash/comparatornew/Comparator.java new file mode 100755 index 0000000..9011359 --- /dev/null +++ b/trash/comparatornew/Comparator.java @@ -0,0 +1,17 @@ +package net.sourceforge.align.comparator; + +import java.util.List; + +import net.sourceforge.align.Alignment; + +/** + * Reprezentuje porównywacz list dopasowań. + * + * @author Jarek Lipski (loomchild) + */ +public interface Comparator { + + public Diff compare(List leftAlignmentList, + List rightAlignmentList); + +} diff --git a/trash/comparatornew/ComparatorTestSuite.java b/trash/comparatornew/ComparatorTestSuite.java new file mode 100755 index 0000000..b9caec9 --- /dev/null +++ b/trash/comparatornew/ComparatorTestSuite.java @@ -0,0 +1,11 @@ +package net.sourceforge.align.comparator; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + SequentialComparatorTest.class +}) +public class ComparatorTestSuite { +} diff --git a/trash/comparatornew/Diff.java b/trash/comparatornew/Diff.java new file mode 100755 index 0000000..028391b --- /dev/null +++ b/trash/comparatornew/Diff.java @@ -0,0 +1,34 @@ +package net.sourceforge.align.comparator; + +import java.util.List; + +import net.sourceforge.align.Alignment; + + +/** + * Reprezentuje wynik porównania dopasowań. Odpowiada za przechowywanie + * różnic w dopasowaniach. + * + * @author Jarek Lipski (loomchild) + */ +public class Diff { + + private List leftOnlyAlignmentList; + + private List rightOnlyAlignmentList; + + public Diff(List leftOnlyAlignmentList, + List rightOnlyAlignmentList) { + this.leftOnlyAlignmentList = leftOnlyAlignmentList; + this.rightOnlyAlignmentList = rightOnlyAlignmentList; + } + + public List getLeftOnlyAlignmentList() { + return leftOnlyAlignmentList; + } + + public List getRightOnlyAlignmentList() { + return rightOnlyAlignmentList; + } + +} diff --git a/trash/comparatornew/SequentialComparator.java b/trash/comparatornew/SequentialComparator.java new file mode 100755 index 0000000..cc3f0ab --- /dev/null +++ b/trash/comparatornew/SequentialComparator.java @@ -0,0 +1,58 @@ +package net.sourceforge.align.comparator; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.sourceforge.align.Alignment; + +/** + * Reprezentuje porównywacz sekwencyjny. + * + * @author Jarek Lipski (loomchild) + */ +public class SequentialComparator implements Comparator { + + /** + * Porównuje listy dopasowań. Zeby dopasowania były uznane za identyczne + * muszą być takie same i występować w takim samym porządku. + * Nie działa gdy w tekście występują powtórzone dopasowania ponieważ + * może wtedy nie znaleźć najdłuższego możliwego dopasowania. + * @param leftAlignmentList Pierwsza lista dopasowań. + * @param rightAlignmentList Druga lista dopasowań. + * @return Zwraca listę różnic. + */ + public Diff compare(List leftAlignmentList, + List rightAlignmentList) { + List leftOnlyAlignmentList = new ArrayList(); + List rightOnlyAlignmentList = new ArrayList(); + int startIndex = 0; + for (Alignment leftAlignment : leftAlignmentList) { + int index = startIndex; + Iterator rightIterator = + rightAlignmentList.listIterator(index); + while(rightIterator.hasNext()) { + Alignment rightAlignment = rightIterator.next(); + if (leftAlignment.equals(rightAlignment)) { + rightOnlyAlignmentList.addAll( + rightAlignmentList.subList(startIndex, index)); + startIndex = index + 1; + break; + } else { + ++index; + } + } + //Gdy nie znaleziono identycznego dopasowania + if (startIndex <= index) { + leftOnlyAlignmentList.add(leftAlignment); + } + } + if (startIndex < rightAlignmentList.size()) { + rightOnlyAlignmentList.addAll( + rightAlignmentList.subList(startIndex, + rightAlignmentList.size())); + } + return new Diff(leftOnlyAlignmentList, rightOnlyAlignmentList); + } + +} diff --git a/trash/comparatornew/SequentialComparatorTest.java b/trash/comparatornew/SequentialComparatorTest.java new file mode 100755 index 0000000..396e3b3 --- /dev/null +++ b/trash/comparatornew/SequentialComparatorTest.java @@ -0,0 +1,90 @@ +package net.sourceforge.align.comparator; + +import static net.sourceforge.align.util.Util.assertAlignmentListEquals; +import static net.sourceforge.align.util.Util.createAlignmentList; +import static net.sourceforge.align.util.Util.filterSegmentArray; + +import java.util.List; + +import net.sourceforge.align.Alignment; + +import org.junit.Test; + +public class SequentialComparatorTest { + + public static final String[][] LEFT_SOURCE_ARRAY = new String[][] { + new String[] {"aa", "bb"}, + new String[] {}, + new String[] {"cc"}, + new String[] {"dd", "ee"}, + new String[] {}, + new String[] {}, + new String[] {"ff"}, + new String[] {"gg"}, + new String[] {"hh"}, + new String[] {"ii"}, + new String[] {}, + }; + + public static final String[][] LEFT_TARGET_ARRAY = new String[][] { + new String[] {"11"}, + new String[] {"22"}, + new String[] {"33"}, + new String[] {"44"}, + new String[] {}, + new String[] {"55"}, + new String[] {"66"}, + new String[] {"77"}, + new String[] {"88"}, + new String[] {}, + new String[] {"99"}, + }; + + public static final String[][] RIGHT_SOURCE_ARRAY = new String[][] { + new String[] {"aa", "bb"}, + new String[] {"cc"}, + new String[] {}, + new String[] {}, + new String[] {"ff", "gg"}, + new String[] {"hh"}, + new String[] {"ii"}, + }; + + public static final String[][] RIGHT_TARGET_ARRAY = new String[][] { + new String[] {"11", "22"}, + new String[] {"33"}, + new String[] {}, + new String[] {"55"}, + new String[] {"66", "77"}, + new String[] {"88"}, + new String[] {"99"}, + }; + + public static final int[] LEFT_ONLY_INDEXES = new int[] { + 0, 1, 3, 6, 7, 9, 10, + }; + + public static final int[] RIGHT_ONLY_INDEXES = new int[] { + 0, 4, 6, + }; + + @Test + public void compare() { + List leftAlignmentList = createAlignmentList( + LEFT_SOURCE_ARRAY, LEFT_TARGET_ARRAY); + List rightAlignmentList = createAlignmentList( + RIGHT_SOURCE_ARRAY, RIGHT_TARGET_ARRAY); + Comparator comparator = new SequentialComparator(); + Diff result = comparator.compare(leftAlignmentList, + rightAlignmentList); + assertAlignmentListEquals( + filterSegmentArray(LEFT_SOURCE_ARRAY, LEFT_ONLY_INDEXES), + filterSegmentArray(LEFT_TARGET_ARRAY, LEFT_ONLY_INDEXES), + result.getLeftOnlyAlignmentList()); + assertAlignmentListEquals( + filterSegmentArray(RIGHT_SOURCE_ARRAY, RIGHT_ONLY_INDEXES), + filterSegmentArray(RIGHT_TARGET_ARRAY, RIGHT_ONLY_INDEXES), + result.getRightOnlyAlignmentList()); + } + +} diff --git a/trash/comparatorold/.svn/all-wcprops b/trash/comparatorold/.svn/all-wcprops new file mode 100644 index 0000000..ac81796 --- /dev/null +++ b/trash/comparatorold/.svn/all-wcprops @@ -0,0 +1,35 @@ +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/align/!svn/ver/19/trunk/maligna/trash/comparatorold +END +ComparatorTestSuite.java +K 25 +svn:wc:ra_dav:version-url +V 81 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/comparator/ComparatorTestSuite.java +END +SequentialComparatorTest.java +K 25 +svn:wc:ra_dav:version-url +V 86 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/comparator/SequentialComparatorTest.java +END +Comparator.java +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/comparator/Comparator.java +END +SequentialComparator.java +K 25 +svn:wc:ra_dav:version-url +V 82 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/comparator/SequentialComparator.java +END +CompareResult.java +K 25 +svn:wc:ra_dav:version-url +V 75 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/comparator/CompareResult.java +END diff --git a/trash/comparatorold/.svn/entries b/trash/comparatorold/.svn/entries new file mode 100644 index 0000000..838eb74 --- /dev/null +++ b/trash/comparatorold/.svn/entries @@ -0,0 +1,88 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/trash/comparatorold +https://align.svn.sourceforge.net/svnroot/align + + + +2008-09-04T00:34:57.783908Z +19 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Comparator.java +file + + + + +2008-08-20T21:14:48.000000Z +2ae860f8180a327e8c83f3d35520a712 +2008-09-04T00:34:57.783908Z +19 +jarekl + +ComparatorTestSuite.java +file + + + + +2008-08-20T21:14:48.000000Z +c01d65371e7d662518381297d403cd8d +2008-09-04T00:34:57.783908Z +19 +jarekl + +CompareResult.java +file + + + + +2008-08-20T21:14:48.000000Z +177994fad8ba6e3c889674d10b2a311e +2008-09-04T00:34:57.783908Z +19 +jarekl + +SequentialComparator.java +file + + + + +2008-08-20T21:14:48.000000Z +8d973151b91708647e550c29953c89b1 +2008-09-04T00:34:57.783908Z +19 +jarekl + +SequentialComparatorTest.java +file + + + + +2008-08-20T21:14:48.000000Z +ac1e8de774dcee859b31ace09c46a475 +2008-09-04T00:34:57.783908Z +19 +jarekl + diff --git a/trash/comparatorold/.svn/text-base/Comparator.java.svn-base b/trash/comparatorold/.svn/text-base/Comparator.java.svn-base new file mode 100755 index 0000000..f66b40d --- /dev/null +++ b/trash/comparatorold/.svn/text-base/Comparator.java.svn-base @@ -0,0 +1,17 @@ +package align.comparator; + +import java.util.List; + +import align.Alignment; + +/** + * Reprezentuje porównywacz list dopasowań. + * + * @author Jarek Lipski (loomchild) + */ +public interface Comparator { + + public CompareResult compare(List leftAlignmentList, + List rightAlignmentList); + +} diff --git a/trash/comparatorold/.svn/text-base/ComparatorTestSuite.java.svn-base b/trash/comparatorold/.svn/text-base/ComparatorTestSuite.java.svn-base new file mode 100755 index 0000000..41f67f3 --- /dev/null +++ b/trash/comparatorold/.svn/text-base/ComparatorTestSuite.java.svn-base @@ -0,0 +1,15 @@ +package align.comparator; + +import junit.framework.TestSuite; + +public class ComparatorTestSuite extends TestSuite { + + public static junit.framework.Test suite() { + TestSuite suite = new TestSuite(); + + suite.addTestSuite(SequentialComparatorTest.class); + + return suite; + } + +} diff --git a/trash/comparatorold/.svn/text-base/CompareResult.java.svn-base b/trash/comparatorold/.svn/text-base/CompareResult.java.svn-base new file mode 100755 index 0000000..413a33b --- /dev/null +++ b/trash/comparatorold/.svn/text-base/CompareResult.java.svn-base @@ -0,0 +1,33 @@ +package align.comparator; + +import java.util.List; + +import align.Alignment; + +/** + * Reprezentuje wynik porównania dopasowań. Odpowiada za przechowywanie + * różnic w dopasowaniach. + * + * @author Jarek Lipski (loomchild) + */ +public class CompareResult { + + private List leftOnlyAlignmentList; + + private List rightOnlyAlignmentList; + + public CompareResult(List leftOnlyAlignmentList, + List rightOnlyAlignmentList) { + this.leftOnlyAlignmentList = leftOnlyAlignmentList; + this.rightOnlyAlignmentList = rightOnlyAlignmentList; + } + + public List getLeftOnlyAlignmentList() { + return leftOnlyAlignmentList; + } + + public List getRightOnlyAlignmentList() { + return rightOnlyAlignmentList; + } + +} diff --git a/trash/comparatorold/.svn/text-base/SequentialComparator.java.svn-base b/trash/comparatorold/.svn/text-base/SequentialComparator.java.svn-base new file mode 100755 index 0000000..7ec581a --- /dev/null +++ b/trash/comparatorold/.svn/text-base/SequentialComparator.java.svn-base @@ -0,0 +1,109 @@ +package align.comparator; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import align.Alignment; +import align.merger.Merger; +import align.merger.SeparatorMerger; + +/** + * Reprezentuje porównywacz sekwencyjny. Odpowiada za wyszukanie różnic w + * dopasowaniu ciągłym. + * + * @author Jarek Lipski (loomchild) + */ +public class SequentialComparator implements Comparator { + + private Merger merger; + + public SequentialComparator() { + this.merger = new SeparatorMerger(); + } + + /** + * Porównuje listy dopasowań. Każde dopasowanie powinno reprezentować + * ciągłe obszary w tekstach źródłowym i docelowym. Porównywane teksty + * muszą być identyczne i najlepiej żebyt były podzielone tym samym + * splitterem. + * @param leftAlignmentList + * @param rightAlignmentList + * @return + */ + public CompareResult compare(List leftAlignmentList, + List rightAlignmentList) { + List leftOnlyAlignmentList = new LinkedList(); + List rightOnlyAlignmentList = new LinkedList(); + Iterator leftIterator = leftAlignmentList.iterator(); + Iterator rightIterator = rightAlignmentList.iterator(); + int leftSourceCharNr = 0; + int leftTargetCharNr = 0; + int rightSourceCharNr = 0; + int rightTargetCharNr = 0; + Alignment leftAlignment = null; + Alignment rightAlignment = null; + String leftMergedSourceSegment = null; + String leftMergedTargetSegment = null; + String rightMergedSourceSegment = null; + String rightMergedTargetSegment = null; + + while(leftIterator.hasNext() && rightIterator.hasNext()) { + //Przechodzi po obu tylko jeśli source i target są równe. + //W przeciwnym wypadku przechodzi po tym co ma mniejsze source + //a gdy są równe to target. + boolean moveLeft = (leftSourceCharNr < rightSourceCharNr) || + (leftSourceCharNr == rightSourceCharNr && + leftTargetCharNr <= rightTargetCharNr); + boolean moveRight = (leftSourceCharNr > rightSourceCharNr) || + (leftSourceCharNr == rightSourceCharNr && + leftTargetCharNr >= rightTargetCharNr); + if (moveLeft) { + leftAlignment = leftIterator.next(); + leftMergedSourceSegment = + merger.merge(leftAlignment.getSourceSegmentList()); + leftMergedTargetSegment = + merger.merge(leftAlignment.getTargetSegmentList()); + leftSourceCharNr += leftMergedSourceSegment.length(); + leftTargetCharNr += leftMergedTargetSegment.length(); + } + if (moveRight) { + rightAlignment = rightIterator.next(); + rightMergedSourceSegment = + merger.merge(rightAlignment.getSourceSegmentList()); + rightMergedTargetSegment = + merger.merge(rightAlignment.getTargetSegmentList()); + rightSourceCharNr += rightMergedSourceSegment.length(); + rightTargetCharNr += rightMergedTargetSegment.length(); + } + if ((leftMergedSourceSegment.equals(rightMergedSourceSegment)) && + (leftMergedTargetSegment.equals(rightMergedTargetSegment))) { + rightSourceCharNr = leftSourceCharNr; + rightTargetCharNr = leftTargetCharNr; + } else { + if (moveLeft) { + leftOnlyAlignmentList.add(leftAlignment); + } + if (moveRight) { + rightOnlyAlignmentList.add(rightAlignment); + } + } + } + if ((leftSourceCharNr != rightSourceCharNr) || + (leftTargetCharNr != rightTargetCharNr)){ + throw new IllegalArgumentException("Dopasowania nie są " + + "identycznej długości"); + } + while(leftIterator.hasNext()) { + leftAlignment = leftIterator.next(); + leftOnlyAlignmentList.add(leftAlignment); + } + while(rightIterator.hasNext()) { + rightAlignment = rightIterator.next(); + rightOnlyAlignmentList.add(rightAlignment); + } + + return new CompareResult(leftOnlyAlignmentList, rightOnlyAlignmentList); + } + +} diff --git a/trash/comparatorold/.svn/text-base/SequentialComparatorTest.java.svn-base b/trash/comparatorold/.svn/text-base/SequentialComparatorTest.java.svn-base new file mode 100755 index 0000000..fb81b59 --- /dev/null +++ b/trash/comparatorold/.svn/text-base/SequentialComparatorTest.java.svn-base @@ -0,0 +1,59 @@ +package align.comparator; + +import static loomchild.util.testing.Utils.assertListEquals; + +import java.util.Arrays; +import java.util.List; + +import junit.framework.TestCase; +import align.Alignment; + +public class SequentialComparatorTest extends TestCase { + + public void testCompare() { + Alignment[] leftAlignmentArray = new Alignment[] { + createAlignment(new String[] {"aa", "bb"}, new String[] {"11"}), + createAlignment(new String[] {}, new String[] {"22"}), + createAlignment(new String[] {"cc"}, new String[] {"33"}), + createAlignment(new String[] {"dd", "ee"}, new String[] {"44"}), + createAlignment(new String[] {}, new String[] {}), + createAlignment(new String[] {}, new String[] {"55"}), + createAlignment(new String[] {"ff"}, new String[] {"66"}), + createAlignment(new String[] {"gg"}, new String[] {"77"}), + createAlignment(new String[] {"hh"}, new String[] {"88"}), + createAlignment(new String[] {"ii"}, new String[] {"99"}), + createAlignment(new String[] {"jj"}, new String[] {}), + }; + List leftAlignmentList = Arrays.asList(leftAlignmentArray); + Alignment[] rightAlignmentArray = new Alignment[] { + createAlignment(new String[] {"aa", "bb"}, new String[] {"11", "22"}), + createAlignment(new String[] {"cc"}, new String[] {"33"}), + createAlignment(new String[] {"dd", "ee"}, new String[] {"44"}), + createAlignment(new String[] {}, new String[] {}), + createAlignment(new String[] {}, new String[] {"55"}), + createAlignment(new String[] {"ff gg"}, new String[] {"66 77"}), + createAlignment(new String[] {"hh"}, new String[] {"88"}), + createAlignment(new String[] {"ii"}, new String[] {"00"}), + }; + List rightAlignmentList = Arrays.asList(rightAlignmentArray); + Comparator comparator = new SequentialComparator(); + CompareResult result = comparator.compare(leftAlignmentList, + rightAlignmentList); + assertListEquals(new Alignment[] { + leftAlignmentArray[0], leftAlignmentArray[1], + leftAlignmentArray[6], leftAlignmentArray[7], + leftAlignmentArray[9], leftAlignmentArray[10]}, + result.getLeftOnlyAlignmentList()); + assertListEquals(new Alignment[] { + rightAlignmentArray[0], rightAlignmentArray[5], + rightAlignmentArray[7]}, + result.getRightOnlyAlignmentList()); + } + + private Alignment createAlignment(String[] sourceSegmentArray, + String[] targetSegmentArray) { + return new Alignment(Arrays.asList(sourceSegmentArray), + Arrays.asList(targetSegmentArray), 0.0f); + } + +} diff --git a/trash/comparatorold/Comparator.java b/trash/comparatorold/Comparator.java new file mode 100755 index 0000000..f66b40d --- /dev/null +++ b/trash/comparatorold/Comparator.java @@ -0,0 +1,17 @@ +package align.comparator; + +import java.util.List; + +import align.Alignment; + +/** + * Reprezentuje porównywacz list dopasowań. + * + * @author Jarek Lipski (loomchild) + */ +public interface Comparator { + + public CompareResult compare(List leftAlignmentList, + List rightAlignmentList); + +} diff --git a/trash/comparatorold/ComparatorTestSuite.java b/trash/comparatorold/ComparatorTestSuite.java new file mode 100755 index 0000000..41f67f3 --- /dev/null +++ b/trash/comparatorold/ComparatorTestSuite.java @@ -0,0 +1,15 @@ +package align.comparator; + +import junit.framework.TestSuite; + +public class ComparatorTestSuite extends TestSuite { + + public static junit.framework.Test suite() { + TestSuite suite = new TestSuite(); + + suite.addTestSuite(SequentialComparatorTest.class); + + return suite; + } + +} diff --git a/trash/comparatorold/CompareResult.java b/trash/comparatorold/CompareResult.java new file mode 100755 index 0000000..413a33b --- /dev/null +++ b/trash/comparatorold/CompareResult.java @@ -0,0 +1,33 @@ +package align.comparator; + +import java.util.List; + +import align.Alignment; + +/** + * Reprezentuje wynik porównania dopasowań. Odpowiada za przechowywanie + * różnic w dopasowaniach. + * + * @author Jarek Lipski (loomchild) + */ +public class CompareResult { + + private List leftOnlyAlignmentList; + + private List rightOnlyAlignmentList; + + public CompareResult(List leftOnlyAlignmentList, + List rightOnlyAlignmentList) { + this.leftOnlyAlignmentList = leftOnlyAlignmentList; + this.rightOnlyAlignmentList = rightOnlyAlignmentList; + } + + public List getLeftOnlyAlignmentList() { + return leftOnlyAlignmentList; + } + + public List getRightOnlyAlignmentList() { + return rightOnlyAlignmentList; + } + +} diff --git a/trash/comparatorold/SequentialComparator.java b/trash/comparatorold/SequentialComparator.java new file mode 100755 index 0000000..7ec581a --- /dev/null +++ b/trash/comparatorold/SequentialComparator.java @@ -0,0 +1,109 @@ +package align.comparator; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import align.Alignment; +import align.merger.Merger; +import align.merger.SeparatorMerger; + +/** + * Reprezentuje porównywacz sekwencyjny. Odpowiada za wyszukanie różnic w + * dopasowaniu ciągłym. + * + * @author Jarek Lipski (loomchild) + */ +public class SequentialComparator implements Comparator { + + private Merger merger; + + public SequentialComparator() { + this.merger = new SeparatorMerger(); + } + + /** + * Porównuje listy dopasowań. Każde dopasowanie powinno reprezentować + * ciągłe obszary w tekstach źródłowym i docelowym. Porównywane teksty + * muszą być identyczne i najlepiej żebyt były podzielone tym samym + * splitterem. + * @param leftAlignmentList + * @param rightAlignmentList + * @return + */ + public CompareResult compare(List leftAlignmentList, + List rightAlignmentList) { + List leftOnlyAlignmentList = new LinkedList(); + List rightOnlyAlignmentList = new LinkedList(); + Iterator leftIterator = leftAlignmentList.iterator(); + Iterator rightIterator = rightAlignmentList.iterator(); + int leftSourceCharNr = 0; + int leftTargetCharNr = 0; + int rightSourceCharNr = 0; + int rightTargetCharNr = 0; + Alignment leftAlignment = null; + Alignment rightAlignment = null; + String leftMergedSourceSegment = null; + String leftMergedTargetSegment = null; + String rightMergedSourceSegment = null; + String rightMergedTargetSegment = null; + + while(leftIterator.hasNext() && rightIterator.hasNext()) { + //Przechodzi po obu tylko jeśli source i target są równe. + //W przeciwnym wypadku przechodzi po tym co ma mniejsze source + //a gdy są równe to target. + boolean moveLeft = (leftSourceCharNr < rightSourceCharNr) || + (leftSourceCharNr == rightSourceCharNr && + leftTargetCharNr <= rightTargetCharNr); + boolean moveRight = (leftSourceCharNr > rightSourceCharNr) || + (leftSourceCharNr == rightSourceCharNr && + leftTargetCharNr >= rightTargetCharNr); + if (moveLeft) { + leftAlignment = leftIterator.next(); + leftMergedSourceSegment = + merger.merge(leftAlignment.getSourceSegmentList()); + leftMergedTargetSegment = + merger.merge(leftAlignment.getTargetSegmentList()); + leftSourceCharNr += leftMergedSourceSegment.length(); + leftTargetCharNr += leftMergedTargetSegment.length(); + } + if (moveRight) { + rightAlignment = rightIterator.next(); + rightMergedSourceSegment = + merger.merge(rightAlignment.getSourceSegmentList()); + rightMergedTargetSegment = + merger.merge(rightAlignment.getTargetSegmentList()); + rightSourceCharNr += rightMergedSourceSegment.length(); + rightTargetCharNr += rightMergedTargetSegment.length(); + } + if ((leftMergedSourceSegment.equals(rightMergedSourceSegment)) && + (leftMergedTargetSegment.equals(rightMergedTargetSegment))) { + rightSourceCharNr = leftSourceCharNr; + rightTargetCharNr = leftTargetCharNr; + } else { + if (moveLeft) { + leftOnlyAlignmentList.add(leftAlignment); + } + if (moveRight) { + rightOnlyAlignmentList.add(rightAlignment); + } + } + } + if ((leftSourceCharNr != rightSourceCharNr) || + (leftTargetCharNr != rightTargetCharNr)){ + throw new IllegalArgumentException("Dopasowania nie są " + + "identycznej długości"); + } + while(leftIterator.hasNext()) { + leftAlignment = leftIterator.next(); + leftOnlyAlignmentList.add(leftAlignment); + } + while(rightIterator.hasNext()) { + rightAlignment = rightIterator.next(); + rightOnlyAlignmentList.add(rightAlignment); + } + + return new CompareResult(leftOnlyAlignmentList, rightOnlyAlignmentList); + } + +} diff --git a/trash/comparatorold/SequentialComparatorTest.java b/trash/comparatorold/SequentialComparatorTest.java new file mode 100755 index 0000000..fb81b59 --- /dev/null +++ b/trash/comparatorold/SequentialComparatorTest.java @@ -0,0 +1,59 @@ +package align.comparator; + +import static loomchild.util.testing.Utils.assertListEquals; + +import java.util.Arrays; +import java.util.List; + +import junit.framework.TestCase; +import align.Alignment; + +public class SequentialComparatorTest extends TestCase { + + public void testCompare() { + Alignment[] leftAlignmentArray = new Alignment[] { + createAlignment(new String[] {"aa", "bb"}, new String[] {"11"}), + createAlignment(new String[] {}, new String[] {"22"}), + createAlignment(new String[] {"cc"}, new String[] {"33"}), + createAlignment(new String[] {"dd", "ee"}, new String[] {"44"}), + createAlignment(new String[] {}, new String[] {}), + createAlignment(new String[] {}, new String[] {"55"}), + createAlignment(new String[] {"ff"}, new String[] {"66"}), + createAlignment(new String[] {"gg"}, new String[] {"77"}), + createAlignment(new String[] {"hh"}, new String[] {"88"}), + createAlignment(new String[] {"ii"}, new String[] {"99"}), + createAlignment(new String[] {"jj"}, new String[] {}), + }; + List leftAlignmentList = Arrays.asList(leftAlignmentArray); + Alignment[] rightAlignmentArray = new Alignment[] { + createAlignment(new String[] {"aa", "bb"}, new String[] {"11", "22"}), + createAlignment(new String[] {"cc"}, new String[] {"33"}), + createAlignment(new String[] {"dd", "ee"}, new String[] {"44"}), + createAlignment(new String[] {}, new String[] {}), + createAlignment(new String[] {}, new String[] {"55"}), + createAlignment(new String[] {"ff gg"}, new String[] {"66 77"}), + createAlignment(new String[] {"hh"}, new String[] {"88"}), + createAlignment(new String[] {"ii"}, new String[] {"00"}), + }; + List rightAlignmentList = Arrays.asList(rightAlignmentArray); + Comparator comparator = new SequentialComparator(); + CompareResult result = comparator.compare(leftAlignmentList, + rightAlignmentList); + assertListEquals(new Alignment[] { + leftAlignmentArray[0], leftAlignmentArray[1], + leftAlignmentArray[6], leftAlignmentArray[7], + leftAlignmentArray[9], leftAlignmentArray[10]}, + result.getLeftOnlyAlignmentList()); + assertListEquals(new Alignment[] { + rightAlignmentArray[0], rightAlignmentArray[5], + rightAlignmentArray[7]}, + result.getRightOnlyAlignmentList()); + } + + private Alignment createAlignment(String[] sourceSegmentArray, + String[] targetSegmentArray) { + return new Alignment(Arrays.asList(sourceSegmentArray), + Arrays.asList(targetSegmentArray), 0.0f); + } + +} diff --git a/trash/documentx.xml b/trash/documentx.xml new file mode 100755 index 0000000..900c583 --- /dev/null +++ b/trash/documentx.xml @@ -0,0 +1,9 @@ + + + + To zdanieto drugie + + + jeszcze + + diff --git a/trash/example/.svn/all-wcprops b/trash/example/.svn/all-wcprops new file mode 100644 index 0000000..c03db33 --- /dev/null +++ b/trash/example/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 54 +/svnroot/align/!svn/ver/16/trunk/maligna/trash/example +END +example2a +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/16/trunk/maligna/trash/example/example2a +END +example2b +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/16/trunk/maligna/trash/example/example2b +END +example2c +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/16/trunk/maligna/trash/example/example2c +END +example2d +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/align/!svn/ver/16/trunk/maligna/trash/example/example2d +END diff --git a/trash/example/.svn/entries b/trash/example/.svn/entries new file mode 100644 index 0000000..d474c8c --- /dev/null +++ b/trash/example/.svn/entries @@ -0,0 +1,80 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/trash/example +https://align.svn.sourceforge.net/svnroot/align + + + +2008-08-20T23:12:34.302965Z +16 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +example2a +file + + + + +2008-07-26T11:58:50.000000Z +6e3cd81501bdb95c84842bdf32860a3f +2008-08-20T23:12:34.302965Z +16 +jarekl +has-props + +example2b +file + + + + +2008-07-26T11:59:30.000000Z +ecacafe51bbb84bf1ee680ec27c940db +2008-08-20T23:12:34.302965Z +16 +jarekl +has-props + +example2c +file + + + + +2008-07-26T12:00:05.000000Z +ed97ec6feaba136e085f52d0a9490a9e +2008-08-20T23:12:34.302965Z +16 +jarekl +has-props + +example2d +file + + + + +2008-07-26T12:00:45.000000Z +1d789f01c8399032bebc3232332b6948 +2008-08-20T23:12:34.302965Z +16 +jarekl +has-props + diff --git a/trash/example/.svn/prop-base/example2a.svn-base b/trash/example/.svn/prop-base/example2a.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/trash/example/.svn/prop-base/example2a.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/trash/example/.svn/prop-base/example2b.svn-base b/trash/example/.svn/prop-base/example2b.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/trash/example/.svn/prop-base/example2b.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/trash/example/.svn/prop-base/example2c.svn-base b/trash/example/.svn/prop-base/example2c.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/trash/example/.svn/prop-base/example2c.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/trash/example/.svn/prop-base/example2d.svn-base b/trash/example/.svn/prop-base/example2d.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/trash/example/.svn/prop-base/example2d.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/trash/example/.svn/text-base/example2a.svn-base b/trash/example/.svn/text-base/example2a.svn-base new file mode 100755 index 0000000..040255f --- /dev/null +++ b/trash/example/.svn/text-base/example2a.svn-base @@ -0,0 +1,9 @@ +#!/bin/bash +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. +FILE=poznan +SOURCE_LANGUAGE=pl +TARGET_LANGUAGE=de + +$PROJECT_HOME/bin/maligna parse -c txt $PROJECT_HOME/example/txt/$FILE-$SOURCE_LANGUAGE.txt $PROJECT_HOME/example/txt/$FILE-$TARGET_LANGUAGE.txt | $PROJECT_HOME/bin/maligna modify -c srxsplit -f $PROJECT_HOME/example/srx/my.srx -l $SOURCE_LANGUAGE,$TARGET_LANGUAGE | $PROJECT_HOME/bin/maligna modify -c trim > $FILE-split.al + diff --git a/trash/example/.svn/text-base/example2b.svn-base b/trash/example/.svn/text-base/example2b.svn-base new file mode 100755 index 0000000..0209206 --- /dev/null +++ b/trash/example/.svn/text-base/example2b.svn-base @@ -0,0 +1,6 @@ +#!/bin/bash +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. +FILE=poznan + +cat $FILE-split.al | $PROJECT_HOME/bin/maligna align -c viterbi -a poisson -n word -s iterband | $PROJECT_HOME/bin/maligna select -c onetoone | $PROJECT_HOME/bin/maligna select -c fraction -f 0.85 | $PROJECT_HOME/bin/maligna modify -c unifyrarewords > $FILE-align-length.al diff --git a/trash/example/.svn/text-base/example2c.svn-base b/trash/example/.svn/text-base/example2c.svn-base new file mode 100755 index 0000000..5058425 --- /dev/null +++ b/trash/example/.svn/text-base/example2c.svn-base @@ -0,0 +1,6 @@ +#!/bin/bash +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. +FILE=poznan + +cat $FILE-split.al | $PROJECT_HOME/bin/maligna modify -c unifyrarewords | $PROJECT_HOME/bin/maligna align -c fb -a poisson-translation -n word -s iterband -t $FILE-align-length.al > $FILE-auxiliary-align.al diff --git a/trash/example/.svn/text-base/example2d.svn-base b/trash/example/.svn/text-base/example2d.svn-base new file mode 100755 index 0000000..3b8cb1b --- /dev/null +++ b/trash/example/.svn/text-base/example2d.svn-base @@ -0,0 +1,6 @@ +#!/bin/bash +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. +FILE=poznan + +cat $FILE-split.al | $PROJECT_HOME/bin/maligna align -c unify -u $FILE-auxiliary-align.al > $FILE-align.al diff --git a/trash/example/example2a b/trash/example/example2a new file mode 100755 index 0000000..040255f --- /dev/null +++ b/trash/example/example2a @@ -0,0 +1,9 @@ +#!/bin/bash +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. +FILE=poznan +SOURCE_LANGUAGE=pl +TARGET_LANGUAGE=de + +$PROJECT_HOME/bin/maligna parse -c txt $PROJECT_HOME/example/txt/$FILE-$SOURCE_LANGUAGE.txt $PROJECT_HOME/example/txt/$FILE-$TARGET_LANGUAGE.txt | $PROJECT_HOME/bin/maligna modify -c srxsplit -f $PROJECT_HOME/example/srx/my.srx -l $SOURCE_LANGUAGE,$TARGET_LANGUAGE | $PROJECT_HOME/bin/maligna modify -c trim > $FILE-split.al + diff --git a/trash/example/example2b b/trash/example/example2b new file mode 100755 index 0000000..0209206 --- /dev/null +++ b/trash/example/example2b @@ -0,0 +1,6 @@ +#!/bin/bash +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. +FILE=poznan + +cat $FILE-split.al | $PROJECT_HOME/bin/maligna align -c viterbi -a poisson -n word -s iterband | $PROJECT_HOME/bin/maligna select -c onetoone | $PROJECT_HOME/bin/maligna select -c fraction -f 0.85 | $PROJECT_HOME/bin/maligna modify -c unifyrarewords > $FILE-align-length.al diff --git a/trash/example/example2c b/trash/example/example2c new file mode 100755 index 0000000..5058425 --- /dev/null +++ b/trash/example/example2c @@ -0,0 +1,6 @@ +#!/bin/bash +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. +FILE=poznan + +cat $FILE-split.al | $PROJECT_HOME/bin/maligna modify -c unifyrarewords | $PROJECT_HOME/bin/maligna align -c fb -a poisson-translation -n word -s iterband -t $FILE-align-length.al > $FILE-auxiliary-align.al diff --git a/trash/example/example2d b/trash/example/example2d new file mode 100755 index 0000000..3b8cb1b --- /dev/null +++ b/trash/example/example2d @@ -0,0 +1,6 @@ +#!/bin/bash +SCRIPT_DIR=`dirname $0` +PROJECT_HOME=$SCRIPT_DIR/../.. +FILE=poznan + +cat $FILE-split.al | $PROJECT_HOME/bin/maligna align -c unify -u $FILE-auxiliary-align.al > $FILE-align.al diff --git a/trash/moore.txt b/trash/moore.txt new file mode 100755 index 0000000..90fc589 --- /dev/null +++ b/trash/moore.txt @@ -0,0 +1,26 @@ +(1-1) + +$word_seq_score_pos_1_minus_1 + + +$length_neg_log_prob_pos_1_minus_1 + + +&length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1); + + + +(2-1) + +$word_seq_score_pos_1_minus_2 + + +$length_neg_log_prob_pos_1_minus_2 + + +&length_neg_log_cond_prob_2($length_pair_1,$length_pos_2_minus_1); + + + +(1-2) + +&word_seq_trans_score($words_pos_1_minus_1,[@$words_pos_2_minus_2,@$words_pos_2_minus_1]) + + +$target_pair_2_neg_log_prob{$length_pos_2_minus_2}{$length_pos_2_minus_1}; + diff --git a/trash/moore2.txt b/trash/moore2.txt new file mode 100755 index 0000000..02ebbf4 --- /dev/null +++ b/trash/moore2.txt @@ -0,0 +1,93 @@ + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'delete'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1; + + $bead_score{$pos_1}{$pos_2}{'delete'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'insert'})) { + $new_bead_score = + + // Target language score + &word_seq_score_2(@$words_pos_2_minus_1) + + + // Target length score + $length_neg_log_prob_2{$length_pos_2_minus_1}; + + $bead_score{$pos_1}{$pos_2}{'insert'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'match'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1 + + + // Translation score + &word_seq_trans_score($words_pos_1_minus_1,$words_pos_2_minus_1) + + + // Length translation score + &length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1); + + $bead_score{$pos_1}{$pos_2}{'match'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'contract'})) { + $new_bead_score = + + // Source language score (2nd sentence) + $word_seq_score_pos_1_minus_1 + + + // Source length score (2nd sentence) + $length_neg_log_prob_pos_1_minus_1 + + + // Source language score (1st sentence) + $word_seq_score_pos_1_minus_2 + + + // Source length score (1st sentence) + $length_neg_log_prob_pos_1_minus_2 + + + // Translation score, source sentences sum, to target sentence: + ... $words_pair_1 = [@$words_pos_1_minus_2,@$words_pos_1_minus_1];, ). + &word_seq_trans_score($words_pair_1,$words_pos_2_minus_1) + + + // Length translation score source, sentences sum, to target sentence: + ... $length_pair_1 = $length_pos_1 + $length_pos_1_plus_1 + &length_neg_log_cond_prob_2($length_pair_1,$length_pos_2_minus_1); + + $bead_score{$pos_1}{$pos_2}{'contract'} = $new_bead_score; + } + + + if (!defined($new_bead_score = $bead_score{$pos_1}{$pos_2}{'expand'})) { + $new_bead_score = + + // Source language score + $word_seq_score_pos_1_minus_1 + + + // Source length score + $length_neg_log_prob_pos_1_minus_1 + + + // Translation score, source sentence, to target sentence sum + &word_seq_trans_score($words_pos_1_minus_1,[@$words_pos_2_minus_2,@$words_pos_2_minus_1]) + + + // Length translation score, source sentence, to target sentence sum + &length_neg_log_cond_prob_2($length_pos_1_minus_1,$length_pos_2_minus_1 + $length_pos_2_minus_2) + + + // + $target_pair_2_neg_log_prob{$length_pos_2_minus_2}{$length_pos_2_minus_1}; + + $bead_score{$pos_1}{$pos_2}{'expand'} = $new_bead_score; + } + diff --git a/trash/readme_jimmy.htm b/trash/readme_jimmy.htm new file mode 100755 index 0000000..5ad33fe --- /dev/null +++ b/trash/readme_jimmy.htm @@ -0,0 +1,126 @@ + + +Read Me + +

    mALIGNa

    + +

    Version @project.fullversion@, Date @build.date@

    +
    + +

    Table of Contents

    +
      +
    1. Introduction
    2. +
    3. Requirements
    4. +
    5. Running
    6. +
    7. Formats
    8. +
    9. Algorithms
    10. +
    11. Sources
    12. +
    13. Tools
    14. +
    + +
    + +

    1. Introduction

    +

    mALIGNa is a program for aligning documents on the sentence level. It contains implementations of a few groups of alignment algorithms - algorithms based exclusively on the sentence length (Gale and Church, Brown), algorithms based on the connections between words (Moore's algorithm), as well as any variation and intersection of these algorithms. The aim of alignment is to obtain a bilingual corpus. It can be used for creating translation memories, translation by analogy, modelling probabilistic dictionaries and other applications.

    + +

    2. Requirements

    +

    JVM 1.6 is required to run the program. To build the program both JDK 1.6 and Ant are required. Theoretically, the program is platform independent (like Java), it was tested on Linux and Windows.

    + +

    3. Running

    +

    Aligning documents consists of several stages, which may be performed in different ways. Therefore, the text interface of the program is divided into several independent commands. A common feature of the commands is that they read from standard input and write the results to standard output, always using the native format .al. Therefore these programs act as filters and may be combined in a pipe using |. Below is a brief description of each command, you can get more information about their exact parameters using the option --help. At the end, there is a complete example of text alignment using several commands connected in a pipeline.

    +

    + +

    3.1 The 'parse' command

    +

    The parse option is used to convert an external format to the native format .al. It also allows you to combine several documents into one, by giving a list of files as arguments. It accepts input files as aguments and writes the result to standard output. This can only occur at the beginning of the pipeline.

    + +

    3.2 The 'format' command

    +

    The 'format' option is used to convert the native format .al to an external format. It reads data from standard input and writes the result to the files given as arguments. This can only occur at the end of the pipeline.

    + +

    3.3 The 'align' command

    +

    Alignment commands. Segments of each of the input alignments are aligned independently, thanks to which alignments can be performed at different levels of accuracy (document, paragraph, sentence), performing consecutive alignments, and then dividing the results into smaller and smaller segments. Filter; may be used at any point of the pipeline.

    + +

    3.4 The 'modify' command

    +

    This option performs modifications on every alignment, replacing source and target lists of segments with other lists of segments, in addition both the size of the segments and their contents may be changed (e.g. connect segments in one, divide them into more segments or remove unnecessary whitespace). Filter; may be used at any point of the pipeline.

    + +

    3.5 The 'select' command

    +

    On the basis of certain criteria, chooses from the input lists of alignments only a few and writes them to output. Eg. using this you can choose only the most probable alignments or only 1 - 1 alignments. Filter; may be used at any point of the pipeline.

    + +

    3.6 The 'compare' command

    +

    This is used for comparing two files of alignments with each other, provided as arguments, returning the degree of their similarity and the differences occurring. Used for test targets.

    + +

    3.7 The 'test' command

    +

    Runs the program's automatic tests.

    + +

    3.6 Examples of running

    +

    Below I have given examples of pipelines of commands that that should be used to join together two documents in .txt files, and also write the results as two .txt files, also the input documents should contain the same number of sentences, one per line, and sentences of corresponding numbers should be mutual translations. The commands given below will do everything, however it is worth remembering that sometimes it's better to preserve the intermediate results of the operations of each command in temporary files instead of redirecting them directly to the next command. The following command writes the string in one line; it has been split into several lines in order to enhance readability. They are being carried out in the main directory of the project. Ready to run scripts containing these commands can be found in the directory examples/scripts,

    +

    +bin/maligna parse -c txt example/txt/poznan-pl.txt example/txt/poznan-de.txt |
    +bin/maligna modify -c sentencesplit |
    +bin/maligna modify -c trim |
    +bin/maligna align -c viterbi -a poisson -n word -s iterband |
    +bin/maligna select -c onetoone |
    +bin/maligna format -c txt poznan-pl-align.txt poznan-de-align.txt +

    +

    Another case worth attention is alignment using Moore's algorithm, which requires a properly aligned corpus to build a translation model. To do this you must perform several commands.

    +

    +bin/maligna parse -c txt example/txt/poznan-pl.txt example/txt/poznan-de.txt |
    +bin/maligna modify -c sentencesplit |
    +bin/maligna modify -c trim >
    +poznan-split.al +

    +

    +cat poznan-split.al |
    +bin/maligna align -c viterbi -a poisson -n word -s iterband |
    +bin/maligna select -c onetoone |
    +bin/maligna select -c fraction -f 0.85 >
    +poznan-align-length.al +

    +

    +cat poznan-split.al |
    +bin/maligna align -c viterbi -a poisson-translation -n word -s iterband -t poznan-align-length.al >
    +poznan-align.al +

    + +

    4. Formats

    +

    Most commands expect input and output in the native format .al. To use a different format, you must parse the input (using the parse command). To get the result in another format, you need to format it (using the format command).

    + +

    4.1 The .al format

    +

    This is the native format for files of alignment lists. Contains all necessary information for alignment: lists of source and target segments and result (probability) of alignment.

    + +

    4.2 The .tmx format

    +

    The standard format for translation memories, supported by many tools. Both an input and output format. For the full specification, see: http://www.lisa.org/standards/tmx/tmx.html.

    + +

    4.3 The .txt format

    +

    Plain text, in the form of two files in two languages. On input the whole file is treated as one segment. On output, successive lines of files correspond by alignment and are mutual translations (their quantity is equal).

    + +

    4.4 The presentation format

    +

    An output format which allows the presentation of an alignment in a human readable manner. It is written to a text file in two columns.

    + +

    5. Algorithms

    +

    In the program a few alignment algorithms were applied, and thanks to the flexibility of the code it is possible to modify them and join them together.

    + +

    5.1 Gale and Church algorithm

    +

    This is a fast bilingual text alignment algorithm. The algorithm counts the probability of each possible alignment, which depends on the length of sentences in each language, the length of the whole texts in each language (with no loss of accuracy averaged to 1:1) and some constants. Next it finds alignments for the whole text, maximalising the total probability of alignment. Details can be found in the Gale and Church article, referenced in the sources.

    + +

    5.1 Moore's algorithm

    +

    This is a modern algorithm based not only on the length of sentences but also on the relationships between words. The first phase of operation of this algorithm is alignment based on length (similarly to the Gale and Church algorithm; moreover, it can be used as the first phase of that algorithm). Next, from this alignment only 1 - 1 alignments are selected, and from them only the best part (e.g. 80%). In this manner a relatively well aligned corpus is yielded. Later a translation model (IBM Model 1) and unigram language models are built based on this corpus. In the final alignment not only is the probability of alignment of sentences of determined length taken into consideration, but also the probability of the translation of the source sentence to the target sentence (counted on the basis of the translation model and the language models, in the standard way). Details can be found in the Moore article, referenced in the sources.

    + +

    6. Sources

    +

    +

      +
    1. A Program for Aligning Sentences in Bilingual Corpora, William A. Gale, Kenneth Ward Church
    2. +
    3. Fast and Accurate Sentence Alignment of Bilingual Corpora, Robert C. Moore
    4. +
    +

    + +

    7. Tools

    +

    I wrote this program using the Eclipse IDE. For the automation of various tasks, I used the program Ant.

    + +
    + +

    I wrote this program as part of my studies in Machine Translation, and later I expanded it as part of a master's thesis. Happy aligning!

    +

       -- Jarek Lipski

    + + + + diff --git a/trash/simpleinput.txt b/trash/simpleinput.txt new file mode 100755 index 0000000..9e45b87 --- /dev/null +++ b/trash/simpleinput.txt @@ -0,0 +1,4 @@ +dokument1, paragraf1 + +dokument2, paragraf1 +dokument2, paragraf2 diff --git a/trash/task/.svn/all-wcprops b/trash/task/.svn/all-wcprops new file mode 100644 index 0000000..c185cb7 --- /dev/null +++ b/trash/task/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 51 +/svnroot/align/!svn/ver/54/trunk/maligna/trash/task +END diff --git a/trash/task/.svn/entries b/trash/task/.svn/entries new file mode 100644 index 0000000..a2292c7 --- /dev/null +++ b/trash/task/.svn/entries @@ -0,0 +1,205 @@ +10 + +dir +54 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/trash/task +https://align.svn.sourceforge.net/svnroot/align + + + +2011-04-11T08:54:45.302219Z +54 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + + + + + + +0 + +CompositeTask.java +file + + + + +2008-08-20T21:14:52.000000Z +13b055ef81f07bf293b98d8ca675a0e8 +2011-04-11T08:54:45.302219Z +54 +jarekl + + + + + + + + + + + + + + + + + + + + + +3617 + +CompositeTaskTest.java +file + + + + +2008-08-20T21:14:52.000000Z +ab5c6c62ba94aa979470a71d1f8c1164 +2011-04-11T08:54:45.302219Z +54 +jarekl + + + + + + + + + + + + + + + + + + + + + +108 + +SimpleTask.java +file + + + + +2008-08-20T21:14:52.000000Z +aad21ee620866ffffd2823834784a1c2 +2011-04-11T08:54:45.302219Z +54 +jarekl + + + + + + + + + + + + + + + + + + + + + +2002 + +SimpleTaskTest.java +file + + + + +2008-08-20T21:14:52.000000Z +b7e4f15b980dabbfe47428d722e949fa +2011-04-11T08:54:45.302219Z +54 +jarekl + + + + + + + + + + + + + + + + + + + + + +1036 + +Task.java +file + + + + +2008-08-20T21:14:51.000000Z +ac0ae11091d915eb02a0a6f53b31c8fb +2011-04-11T08:54:45.302219Z +54 +jarekl + + + + + + + + + + + + + + + + + + + + + +1290 + diff --git a/trash/task/.svn/text-base/CompositeTask.java.svn-base b/trash/task/.svn/text-base/CompositeTask.java.svn-base new file mode 100755 index 0000000..8d6a0db --- /dev/null +++ b/trash/task/.svn/text-base/CompositeTask.java.svn-base @@ -0,0 +1,108 @@ +package align.task; + +import static align.Utils.merge; + +import java.io.IOException; +import java.io.Reader; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; + +/** + * Reprezentuje wieloetapowe zadanie podziału tekstów na segmenty i dopasowania + * ich. W każdym etapie wykonywane jest podzadanie. Wejściem kolejnych podzadań + * są wyjścia ich poprzedników, odpowiednio scalone. + * + * @author Jarek Lipski (loomchild) + */ +public class CompositeTask implements Task { + + private List taskList; + + /** + * Tworzy nie zawierające podzadań zadanie złożone. + */ + public CompositeTask() { + this.taskList = new LinkedList(); + } + + /** + * Uruchamia proces dzielenia i dopasowywania dla danych tekstów kolejno + * za pomocą każdego swojego podzadania. + * Ostatecznie wynikiem jest dopasowanie dokonane przez ostatnie podzadanie. + * @param sourceReader Strumień tekstu źródłowego. + * @param targetReader Strumień tekstu docelowego. + * @return Zwraca listę uzyskanych dopasowań. + * @throws AlignmentImpossibleException Zgłaszany gdy dopasowanie jest niemożliwe. + * @throws IOException Zgłaszany gdy nastąpi błąd odczytu strumienia. + */ + public List run(Reader sourceReader, Reader targetReader) + throws AlignmentImpossibleException, IOException { + Iterator taskIterator = taskList.iterator(); + if (!taskIterator.hasNext()) { + return Collections.emptyList(); + } + Task firstTask = taskIterator.next(); + List alignmentList = firstTask.run(sourceReader, + targetReader); + return runRemainingTasks(taskIterator, alignmentList); + } + + /** + * Uruchamia proces dzielenia i dopasowywania dla danych tekstów kolejno + * za pomocą każdego swojego podzadania. + * Ostatecznie wynikiem jest dopasowanie dokonane przez ostatnie podzadanie. + * @param sourceString Tekst źródłowy. + * @param targetString Tekst docelowy. + * @return Zwraca listę uzyskanych dopasowań. + * @throws AlignmentImpossibleException Zgłaszany gdy dopasowanie jest niemożliwe. + */ + public List run(String sourceString, String targetString) + throws AlignmentImpossibleException { + Iterator taskIterator = taskList.iterator(); + if (!taskIterator.hasNext()) { + return Collections.emptyList(); + } + Task firstTask = taskIterator.next(); + List alignmentList = firstTask.run(sourceString, + targetString); + return runRemainingTasks(taskIterator, alignmentList); + } + + private List runRemainingTasks(Iterator taskIterator, + List alignmentList) + throws AlignmentImpossibleException { + while(taskIterator.hasNext()) { + Task task = taskIterator.next(); + alignmentList = runSubTask(task, alignmentList); + } + return alignmentList; + } + + private List runSubTask(Task task, + List previousTaskAlignmentList) + throws AlignmentImpossibleException { + List alignmentList = new LinkedList(); + for(Alignment alignment : previousTaskAlignmentList) { + String sourceSegment = merge(alignment.getSourceSegmentList()); + String targetSegment = merge(alignment.getTargetSegmentList()); + List currentSegmentAlignmentList = + task.run(sourceSegment, targetSegment); + alignmentList.addAll(currentSegmentAlignmentList); + } + return alignmentList; + } + + /** + * Dołącza zadanie na koniec listy podzadań. + * @param task Zadanie. + */ + public void addTask(Task task) { + taskList.add(task); + } + +} diff --git a/trash/task/.svn/text-base/CompositeTaskTest.java.svn-base b/trash/task/.svn/text-base/CompositeTaskTest.java.svn-base new file mode 100755 index 0000000..ac4b336 --- /dev/null +++ b/trash/task/.svn/text-base/CompositeTaskTest.java.svn-base @@ -0,0 +1,7 @@ +package align.task; + +import junit.framework.TestCase; + +public class CompositeTaskTest extends TestCase { + +} diff --git a/trash/task/.svn/text-base/SimpleTask.java.svn-base b/trash/task/.svn/text-base/SimpleTask.java.svn-base new file mode 100755 index 0000000..d048a86 --- /dev/null +++ b/trash/task/.svn/text-base/SimpleTask.java.svn-base @@ -0,0 +1,65 @@ +package align.task; + +import java.io.IOException; +import java.io.Reader; +import java.util.List; + +import align.aligner.Aligner; +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; +import align.splitter.Splitter; + +/** + * Reprezentuje jednoetapowe zadanie podziału i dopasowania tekstów. Odpowiada + * za podział tekstu źródłowego i docelowego na segmenty za pomocą osobnych + * splitterów i dopasowanie uzyskanych segmentów za pomocą alignera. + * + * @author Jarek Lipski (loomchild) + */ +public class SimpleTask implements Task { + + private Splitter sourceSplitter; + + private Splitter targetSplitter; + + private Aligner aligner; + + /** + * Towrzy zadanie używające danych Splitterów i Alignera. + * @param sourceSplitter Splitter dla tekstu źrógłowego. + * @param targetSplitter Splitter dla tekstu docelowego. + * @param aligner Aligner dopasowujący segmenty. + */ + public SimpleTask(Splitter sourceSplitter, Splitter targetSplitter, + Aligner aligner) { + this.sourceSplitter = sourceSplitter; + this.targetSplitter = targetSplitter; + this.aligner = aligner; + } + + /** + * @inheritDoc + */ + public List run(Reader sourceReader, Reader targetReader) + throws AlignmentImpossibleException, IOException { + List sourceSegmentList = sourceSplitter.split(sourceReader); + List targetSegmentList = targetSplitter.split(targetReader); + return align(sourceSegmentList, targetSegmentList); + } + + /** + * @inheritDoc + */ + public List run(String sourceString, String targetString) + throws AlignmentImpossibleException { + List sourceSegmentList = sourceSplitter.split(sourceString); + List targetSegmentList = targetSplitter.split(targetString); + return align(sourceSegmentList, targetSegmentList); + } + + private List align(List sourceSegmentList, + List targetSegmentList) throws AlignmentImpossibleException { + return aligner.align(sourceSegmentList, targetSegmentList); + } + +} diff --git a/trash/task/.svn/text-base/SimpleTaskTest.java.svn-base b/trash/task/.svn/text-base/SimpleTaskTest.java.svn-base new file mode 100755 index 0000000..5bc0e89 --- /dev/null +++ b/trash/task/.svn/text-base/SimpleTaskTest.java.svn-base @@ -0,0 +1,33 @@ +package align.task; + +import static loomchild.util.testing.Utils.assertListEquals; + +import java.util.List; + +import junit.framework.TestCase; +import align.aligner.Aligner; +import align.aligner.AlignerMock; +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; +import align.splitter.Splitter; +import align.splitter.SplitterMock; + +public class SimpleTaskTest extends TestCase { + + public void testUseDifferentSplitters() throws AlignmentImpossibleException { + Splitter sourceSplitter = new SplitterMock(1); + Splitter targetSplitter = new SplitterMock(2); + Aligner aligner = new AlignerMock(); + SimpleTask task = + new SimpleTask(sourceSplitter, targetSplitter, aligner); + List alignmentList = task.run("abcd", "efgh"); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + assertListEquals(new String[]{"a", "b", "c", "d",}, + alignment.getSourceSegmentList()); + assertListEquals(new String[]{"ef", "gh",}, + alignment.getTargetSegmentList()); + } + +} + diff --git a/trash/task/.svn/text-base/Task.java.svn-base b/trash/task/.svn/text-base/Task.java.svn-base new file mode 100755 index 0000000..51ce467 --- /dev/null +++ b/trash/task/.svn/text-base/Task.java.svn-base @@ -0,0 +1,39 @@ +package align.task; + +import java.io.IOException; +import java.io.Reader; +import java.util.List; + +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; + +/** + * Reprezemtuje zadanie podzielenia tekstów źródłowego i docelowego na segmenty + * i zrównoleglenia ich. + * + * @author Jarek Lipski (loomchild) + */ +public interface Task { + + /** + * Uruchamia proces dzielenia i dopasowywania dla danych tekstów. + * @param sourceReader Strumień tekstu źródłowego. + * @param targetReader Strumień tekstu docelowego. + * @return Zwraca listę uzyskanych dopasowań. + * @throws AlignmentImpossibleException Zgłaszany gdy dopasowanie jest niemożliwe. + * @throws IOException Zgłaszany gdy nastąpi błąd odczytu strumienia. + */ + public List run(Reader sourceReader, Reader targetReader) + throws AlignmentImpossibleException, IOException; + + /** + * Uruchamia proces dzielenia i dopasowywania dla danych tekstów. + * @param sourceString Tekst źródłowy. + * @param targetString Tekst docelowy. + * @return Zwraca listę uzyskanych dopasowań. + * @throws AlignmentImpossibleException Zgłaszany gdy dopasowanie jest niemożliwe. + */ + public List run(String sourceString, String targetString) + throws AlignmentImpossibleException; + +} diff --git a/trash/task/CompositeTask.java b/trash/task/CompositeTask.java new file mode 100755 index 0000000..8d6a0db --- /dev/null +++ b/trash/task/CompositeTask.java @@ -0,0 +1,108 @@ +package align.task; + +import static align.Utils.merge; + +import java.io.IOException; +import java.io.Reader; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; + +/** + * Reprezentuje wieloetapowe zadanie podziału tekstów na segmenty i dopasowania + * ich. W każdym etapie wykonywane jest podzadanie. Wejściem kolejnych podzadań + * są wyjścia ich poprzedników, odpowiednio scalone. + * + * @author Jarek Lipski (loomchild) + */ +public class CompositeTask implements Task { + + private List taskList; + + /** + * Tworzy nie zawierające podzadań zadanie złożone. + */ + public CompositeTask() { + this.taskList = new LinkedList(); + } + + /** + * Uruchamia proces dzielenia i dopasowywania dla danych tekstów kolejno + * za pomocą każdego swojego podzadania. + * Ostatecznie wynikiem jest dopasowanie dokonane przez ostatnie podzadanie. + * @param sourceReader Strumień tekstu źródłowego. + * @param targetReader Strumień tekstu docelowego. + * @return Zwraca listę uzyskanych dopasowań. + * @throws AlignmentImpossibleException Zgłaszany gdy dopasowanie jest niemożliwe. + * @throws IOException Zgłaszany gdy nastąpi błąd odczytu strumienia. + */ + public List run(Reader sourceReader, Reader targetReader) + throws AlignmentImpossibleException, IOException { + Iterator taskIterator = taskList.iterator(); + if (!taskIterator.hasNext()) { + return Collections.emptyList(); + } + Task firstTask = taskIterator.next(); + List alignmentList = firstTask.run(sourceReader, + targetReader); + return runRemainingTasks(taskIterator, alignmentList); + } + + /** + * Uruchamia proces dzielenia i dopasowywania dla danych tekstów kolejno + * za pomocą każdego swojego podzadania. + * Ostatecznie wynikiem jest dopasowanie dokonane przez ostatnie podzadanie. + * @param sourceString Tekst źródłowy. + * @param targetString Tekst docelowy. + * @return Zwraca listę uzyskanych dopasowań. + * @throws AlignmentImpossibleException Zgłaszany gdy dopasowanie jest niemożliwe. + */ + public List run(String sourceString, String targetString) + throws AlignmentImpossibleException { + Iterator taskIterator = taskList.iterator(); + if (!taskIterator.hasNext()) { + return Collections.emptyList(); + } + Task firstTask = taskIterator.next(); + List alignmentList = firstTask.run(sourceString, + targetString); + return runRemainingTasks(taskIterator, alignmentList); + } + + private List runRemainingTasks(Iterator taskIterator, + List alignmentList) + throws AlignmentImpossibleException { + while(taskIterator.hasNext()) { + Task task = taskIterator.next(); + alignmentList = runSubTask(task, alignmentList); + } + return alignmentList; + } + + private List runSubTask(Task task, + List previousTaskAlignmentList) + throws AlignmentImpossibleException { + List alignmentList = new LinkedList(); + for(Alignment alignment : previousTaskAlignmentList) { + String sourceSegment = merge(alignment.getSourceSegmentList()); + String targetSegment = merge(alignment.getTargetSegmentList()); + List currentSegmentAlignmentList = + task.run(sourceSegment, targetSegment); + alignmentList.addAll(currentSegmentAlignmentList); + } + return alignmentList; + } + + /** + * Dołącza zadanie na koniec listy podzadań. + * @param task Zadanie. + */ + public void addTask(Task task) { + taskList.add(task); + } + +} diff --git a/trash/task/CompositeTaskTest.java b/trash/task/CompositeTaskTest.java new file mode 100755 index 0000000..ac4b336 --- /dev/null +++ b/trash/task/CompositeTaskTest.java @@ -0,0 +1,7 @@ +package align.task; + +import junit.framework.TestCase; + +public class CompositeTaskTest extends TestCase { + +} diff --git a/trash/task/SimpleTask.java b/trash/task/SimpleTask.java new file mode 100755 index 0000000..d048a86 --- /dev/null +++ b/trash/task/SimpleTask.java @@ -0,0 +1,65 @@ +package align.task; + +import java.io.IOException; +import java.io.Reader; +import java.util.List; + +import align.aligner.Aligner; +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; +import align.splitter.Splitter; + +/** + * Reprezentuje jednoetapowe zadanie podziału i dopasowania tekstów. Odpowiada + * za podział tekstu źródłowego i docelowego na segmenty za pomocą osobnych + * splitterów i dopasowanie uzyskanych segmentów za pomocą alignera. + * + * @author Jarek Lipski (loomchild) + */ +public class SimpleTask implements Task { + + private Splitter sourceSplitter; + + private Splitter targetSplitter; + + private Aligner aligner; + + /** + * Towrzy zadanie używające danych Splitterów i Alignera. + * @param sourceSplitter Splitter dla tekstu źrógłowego. + * @param targetSplitter Splitter dla tekstu docelowego. + * @param aligner Aligner dopasowujący segmenty. + */ + public SimpleTask(Splitter sourceSplitter, Splitter targetSplitter, + Aligner aligner) { + this.sourceSplitter = sourceSplitter; + this.targetSplitter = targetSplitter; + this.aligner = aligner; + } + + /** + * @inheritDoc + */ + public List run(Reader sourceReader, Reader targetReader) + throws AlignmentImpossibleException, IOException { + List sourceSegmentList = sourceSplitter.split(sourceReader); + List targetSegmentList = targetSplitter.split(targetReader); + return align(sourceSegmentList, targetSegmentList); + } + + /** + * @inheritDoc + */ + public List run(String sourceString, String targetString) + throws AlignmentImpossibleException { + List sourceSegmentList = sourceSplitter.split(sourceString); + List targetSegmentList = targetSplitter.split(targetString); + return align(sourceSegmentList, targetSegmentList); + } + + private List align(List sourceSegmentList, + List targetSegmentList) throws AlignmentImpossibleException { + return aligner.align(sourceSegmentList, targetSegmentList); + } + +} diff --git a/trash/task/SimpleTaskTest.java b/trash/task/SimpleTaskTest.java new file mode 100755 index 0000000..5bc0e89 --- /dev/null +++ b/trash/task/SimpleTaskTest.java @@ -0,0 +1,33 @@ +package align.task; + +import static loomchild.util.testing.Utils.assertListEquals; + +import java.util.List; + +import junit.framework.TestCase; +import align.aligner.Aligner; +import align.aligner.AlignerMock; +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; +import align.splitter.Splitter; +import align.splitter.SplitterMock; + +public class SimpleTaskTest extends TestCase { + + public void testUseDifferentSplitters() throws AlignmentImpossibleException { + Splitter sourceSplitter = new SplitterMock(1); + Splitter targetSplitter = new SplitterMock(2); + Aligner aligner = new AlignerMock(); + SimpleTask task = + new SimpleTask(sourceSplitter, targetSplitter, aligner); + List alignmentList = task.run("abcd", "efgh"); + assertEquals(1, alignmentList.size()); + Alignment alignment = alignmentList.get(0); + assertListEquals(new String[]{"a", "b", "c", "d",}, + alignment.getSourceSegmentList()); + assertListEquals(new String[]{"ef", "gh",}, + alignment.getTargetSegmentList()); + } + +} + diff --git a/trash/task/Task.java b/trash/task/Task.java new file mode 100755 index 0000000..51ce467 --- /dev/null +++ b/trash/task/Task.java @@ -0,0 +1,39 @@ +package align.task; + +import java.io.IOException; +import java.io.Reader; +import java.util.List; + +import align.aligner.AlignmentImpossibleException; +import align.data.Alignment; + +/** + * Reprezemtuje zadanie podzielenia tekstów źródłowego i docelowego na segmenty + * i zrównoleglenia ich. + * + * @author Jarek Lipski (loomchild) + */ +public interface Task { + + /** + * Uruchamia proces dzielenia i dopasowywania dla danych tekstów. + * @param sourceReader Strumień tekstu źródłowego. + * @param targetReader Strumień tekstu docelowego. + * @return Zwraca listę uzyskanych dopasowań. + * @throws AlignmentImpossibleException Zgłaszany gdy dopasowanie jest niemożliwe. + * @throws IOException Zgłaszany gdy nastąpi błąd odczytu strumienia. + */ + public List run(Reader sourceReader, Reader targetReader) + throws AlignmentImpossibleException, IOException; + + /** + * Uruchamia proces dzielenia i dopasowywania dla danych tekstów. + * @param sourceString Tekst źródłowy. + * @param targetString Tekst docelowy. + * @return Zwraca listę uzyskanych dopasowań. + * @throws AlignmentImpossibleException Zgłaszany gdy dopasowanie jest niemożliwe. + */ + public List run(String sourceString, String targetString) + throws AlignmentImpossibleException; + +} diff --git a/trash/trash.txt b/trash/trash.txt new file mode 100755 index 0000000..5e9d6a4 --- /dev/null +++ b/trash/trash.txt @@ -0,0 +1,35 @@ + +/* + private TranslationModel performTrainingIteration1( + List< List > sourceSegmentList, + List< List > targetSegmentList) { + TrainedTranslationModel newModel = new TrainedTranslationModel(); + Iterator< List > sourceSegmentIterator = + sourceSegmentList.iterator(); + Iterator< List > targetSegmentIterator = + targetSegmentList.iterator(); + + while(sourceSegmentIterator.hasNext() + && targetSegmentIterator.hasNext()) { + List sourceSegment = sourceSegmentIterator.next(); + List targetSegment = targetSegmentIterator.next(); + + for (int targetWid : targetSegment) { + float probability = 1.0f / sourceSegment.size(); + + for (int sourceWid : sourceSegment) { + TranslationData newModelData = newModel.get(sourceWid); + float newModelProbability = + newModelData.getTranslationProbability(targetWid); + float newProbability = newModelProbability + probability; + + newModelData.setTranslationProbability(targetWid, + newProbability); + } + } + } + + return newModel; + + } +*/ diff --git a/trash/vocabulary/.svn/all-wcprops b/trash/vocabulary/.svn/all-wcprops new file mode 100644 index 0000000..1448e30 --- /dev/null +++ b/trash/vocabulary/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 56 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/vocabulary +END +WordIdNotFoundException.java +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/vocabulary/WordIdNotFoundException.java +END +VocabularyTest.java +K 25 +svn:wc:ra_dav:version-url +V 76 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/vocabulary/VocabularyTest.java +END +Vocabulary.java +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/vocabulary/Vocabulary.java +END +WordNotFoundException.java +K 25 +svn:wc:ra_dav:version-url +V 83 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/vocabulary/WordNotFoundException.java +END diff --git a/trash/vocabulary/.svn/entries b/trash/vocabulary/.svn/entries new file mode 100644 index 0000000..172ae3f --- /dev/null +++ b/trash/vocabulary/.svn/entries @@ -0,0 +1,76 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/trash/vocabulary +https://align.svn.sourceforge.net/svnroot/align + + + +2008-01-14T15:11:50.564431Z +6 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Vocabulary.java +file + + + + +2008-08-20T21:14:48.000000Z +670b6fa1b16e3938ae451ecc3ae83343 +2008-01-14T15:11:50.564431Z +6 +jarekl + +VocabularyTest.java +file + + + + +2008-08-20T21:14:48.000000Z +b1acff9030e30a45b2503cceecc164fd +2008-01-14T15:11:50.564431Z +6 +jarekl + +WordIdNotFoundException.java +file + + + + +2008-08-20T21:14:48.000000Z +391744a00ed459aa038dee5578f6defc +2008-01-14T15:11:50.564431Z +6 +jarekl + +WordNotFoundException.java +file + + + + +2008-08-20T21:14:48.000000Z +95d4eba2ae0926865dd0a86c7a0fc5af +2008-01-14T15:11:50.564431Z +6 +jarekl + diff --git a/trash/vocabulary/.svn/text-base/Vocabulary.java.svn-base b/trash/vocabulary/.svn/text-base/Vocabulary.java.svn-base new file mode 100755 index 0000000..a7fcb82 --- /dev/null +++ b/trash/vocabulary/.svn/text-base/Vocabulary.java.svn-base @@ -0,0 +1,97 @@ +package align.aligner.algorithms.moore.translation; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Reprezentuje słownik mapujący słowa na identyfikatory. + * + * @author Jarek Lipski (loomchild) + */ +public class Vocabulary { + + private List wordArray; + + private Map wordMap; + + /** + * Tworzy pusty słownik. + */ + public Vocabulary() { + this.wordArray = new ArrayList(); + this.wordMap = new HashMap(); + } + + /** + * Wyszukuje identyfikator danego słowa. Jeśli słowa nie ma w słowniku + * zgłasza wyjątek. + * @param word Słowo. + * @return Zwraca identyfikator słowa. + * @throws WordNotFoundException Zgłaszany jeśli nie istnieje podane słowo. + */ + public int getWid(String word) { + Integer wid = wordMap.get(word); + if (wid != null) { + return wid; + } else { + throw new WordNotFoundException(word); + } + } + + /** + * Sprawdza czy dany identyfikator znajduje się w słowniku. + * @param wid Identyfikator słowa. + * @return Zwrawca true jeśli podany identyfikator znajduje się w słowniku. + */ + public boolean containsWid(int wid) { + return wid >= 0 && wid < wordArray.size(); + } + + /** + * Wyszukuje słowo po identyfikatorze. Jeśli nie znajdzie zgłasza wyjątek. + * @param wid Identyfikator słowa. + * @return Zwraca słowo. + * @throws WordIdNotFoundException Zgłaszany jeśli nie istnieje słowo o podanym identyfikatorze. + */ + public String getWord(int wid) { + if (wid < wordArray.size()) { + return wordArray.get(wid); + } else { + throw new WordIdNotFoundException(wid); + } + } + + /** + * Sprawdza czy dane słowo znajduje się w słowniku. + * @param word Słowo. + * @return Zwrawca true jeśli podane słowo znajduje się w słowniku. + */ + public boolean containsWord(String word) { + return wordMap.containsKey(word); + } + + /** + * Dodaje nowe słowo do słownika jeśli go tam nie ma, w przeciwnym wypadku + * nic nie robi. + * @param word Słowo + */ + public void put(String word) { + if (!wordMap.containsKey(word)) { + int wid = wordArray.size(); + wordArray.add(word); + wordMap.put(word, wid); + } + } + + /** + * Zwraca liczbę słów w słowniku. Równocześnie jest to maksymalny + * identyfikator słowa + 1. + * @return Zwraca liczbę słów w słowniku. + */ + public int getWordCount() { + return wordArray.size(); + } + +} diff --git a/trash/vocabulary/.svn/text-base/VocabularyTest.java.svn-base b/trash/vocabulary/.svn/text-base/VocabularyTest.java.svn-base new file mode 100755 index 0000000..fa32769 --- /dev/null +++ b/trash/vocabulary/.svn/text-base/VocabularyTest.java.svn-base @@ -0,0 +1,30 @@ +package align.aligner.algorithms.moore.translation; + +import junit.framework.TestCase; + +public class VocabularyTest extends TestCase { + + public void testVocabulary() { + Vocabulary vocabulary = new Vocabulary(); + assertFalse(vocabulary.containsWord("a b")); + try { + vocabulary.getWid("a b"); + fail("Znalazłem nieistniejące słowo"); + } catch (WordNotFoundException e) { + //Spodziewane + } + assertFalse(vocabulary.containsWid(0)); + try { + vocabulary.getWord(0); + fail("Znalazłem nieistniejące id"); + } catch (WordIdNotFoundException e) { + //Spodziewane + } + vocabulary.put("a b"); + assertTrue(vocabulary.containsWord("a b")); + int wid = vocabulary.getWid("a b"); + assertTrue(vocabulary.containsWid(wid)); + assertEquals("a b", vocabulary.getWord(wid)); + } + +} diff --git a/trash/vocabulary/.svn/text-base/WordIdNotFoundException.java.svn-base b/trash/vocabulary/.svn/text-base/WordIdNotFoundException.java.svn-base new file mode 100755 index 0000000..9457440 --- /dev/null +++ b/trash/vocabulary/.svn/text-base/WordIdNotFoundException.java.svn-base @@ -0,0 +1,13 @@ +package align.aligner.algorithms.moore.translation; + +import loomchild.util.exceptions.LogicException; + +public class WordIdNotFoundException extends LogicException { + + private static final long serialVersionUID = -3007097076190278497L; + + public WordIdNotFoundException(int id) { + super("No such word id: " + id); + } + +} diff --git a/trash/vocabulary/.svn/text-base/WordNotFoundException.java.svn-base b/trash/vocabulary/.svn/text-base/WordNotFoundException.java.svn-base new file mode 100755 index 0000000..e72dfc6 --- /dev/null +++ b/trash/vocabulary/.svn/text-base/WordNotFoundException.java.svn-base @@ -0,0 +1,13 @@ +package align.aligner.algorithms.moore.translation; + +import loomchild.util.exceptions.LogicException; + +public class WordNotFoundException extends LogicException { + + private static final long serialVersionUID = 1474443021847245849L; + + public WordNotFoundException(String word) { + super("No such word: " + word); + } + +} diff --git a/trash/vocabulary/Vocabulary.java b/trash/vocabulary/Vocabulary.java new file mode 100755 index 0000000..a7fcb82 --- /dev/null +++ b/trash/vocabulary/Vocabulary.java @@ -0,0 +1,97 @@ +package align.aligner.algorithms.moore.translation; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Reprezentuje słownik mapujący słowa na identyfikatory. + * + * @author Jarek Lipski (loomchild) + */ +public class Vocabulary { + + private List wordArray; + + private Map wordMap; + + /** + * Tworzy pusty słownik. + */ + public Vocabulary() { + this.wordArray = new ArrayList(); + this.wordMap = new HashMap(); + } + + /** + * Wyszukuje identyfikator danego słowa. Jeśli słowa nie ma w słowniku + * zgłasza wyjątek. + * @param word Słowo. + * @return Zwraca identyfikator słowa. + * @throws WordNotFoundException Zgłaszany jeśli nie istnieje podane słowo. + */ + public int getWid(String word) { + Integer wid = wordMap.get(word); + if (wid != null) { + return wid; + } else { + throw new WordNotFoundException(word); + } + } + + /** + * Sprawdza czy dany identyfikator znajduje się w słowniku. + * @param wid Identyfikator słowa. + * @return Zwrawca true jeśli podany identyfikator znajduje się w słowniku. + */ + public boolean containsWid(int wid) { + return wid >= 0 && wid < wordArray.size(); + } + + /** + * Wyszukuje słowo po identyfikatorze. Jeśli nie znajdzie zgłasza wyjątek. + * @param wid Identyfikator słowa. + * @return Zwraca słowo. + * @throws WordIdNotFoundException Zgłaszany jeśli nie istnieje słowo o podanym identyfikatorze. + */ + public String getWord(int wid) { + if (wid < wordArray.size()) { + return wordArray.get(wid); + } else { + throw new WordIdNotFoundException(wid); + } + } + + /** + * Sprawdza czy dane słowo znajduje się w słowniku. + * @param word Słowo. + * @return Zwrawca true jeśli podane słowo znajduje się w słowniku. + */ + public boolean containsWord(String word) { + return wordMap.containsKey(word); + } + + /** + * Dodaje nowe słowo do słownika jeśli go tam nie ma, w przeciwnym wypadku + * nic nie robi. + * @param word Słowo + */ + public void put(String word) { + if (!wordMap.containsKey(word)) { + int wid = wordArray.size(); + wordArray.add(word); + wordMap.put(word, wid); + } + } + + /** + * Zwraca liczbę słów w słowniku. Równocześnie jest to maksymalny + * identyfikator słowa + 1. + * @return Zwraca liczbę słów w słowniku. + */ + public int getWordCount() { + return wordArray.size(); + } + +} diff --git a/trash/vocabulary/VocabularyTest.java b/trash/vocabulary/VocabularyTest.java new file mode 100755 index 0000000..fa32769 --- /dev/null +++ b/trash/vocabulary/VocabularyTest.java @@ -0,0 +1,30 @@ +package align.aligner.algorithms.moore.translation; + +import junit.framework.TestCase; + +public class VocabularyTest extends TestCase { + + public void testVocabulary() { + Vocabulary vocabulary = new Vocabulary(); + assertFalse(vocabulary.containsWord("a b")); + try { + vocabulary.getWid("a b"); + fail("Znalazłem nieistniejące słowo"); + } catch (WordNotFoundException e) { + //Spodziewane + } + assertFalse(vocabulary.containsWid(0)); + try { + vocabulary.getWord(0); + fail("Znalazłem nieistniejące id"); + } catch (WordIdNotFoundException e) { + //Spodziewane + } + vocabulary.put("a b"); + assertTrue(vocabulary.containsWord("a b")); + int wid = vocabulary.getWid("a b"); + assertTrue(vocabulary.containsWid(wid)); + assertEquals("a b", vocabulary.getWord(wid)); + } + +} diff --git a/trash/vocabulary/WordIdNotFoundException.java b/trash/vocabulary/WordIdNotFoundException.java new file mode 100755 index 0000000..9457440 --- /dev/null +++ b/trash/vocabulary/WordIdNotFoundException.java @@ -0,0 +1,13 @@ +package align.aligner.algorithms.moore.translation; + +import loomchild.util.exceptions.LogicException; + +public class WordIdNotFoundException extends LogicException { + + private static final long serialVersionUID = -3007097076190278497L; + + public WordIdNotFoundException(int id) { + super("No such word id: " + id); + } + +} diff --git a/trash/vocabulary/WordNotFoundException.java b/trash/vocabulary/WordNotFoundException.java new file mode 100755 index 0000000..e72dfc6 --- /dev/null +++ b/trash/vocabulary/WordNotFoundException.java @@ -0,0 +1,13 @@ +package align.aligner.algorithms.moore.translation; + +import loomchild.util.exceptions.LogicException; + +public class WordNotFoundException extends LogicException { + + private static final long serialVersionUID = 1474443021847245849L; + + public WordNotFoundException(String word) { + super("No such word: " + word); + } + +} diff --git a/trash/xpath/.svn/all-wcprops b/trash/xpath/.svn/all-wcprops new file mode 100644 index 0000000..efa6ec3 --- /dev/null +++ b/trash/xpath/.svn/all-wcprops @@ -0,0 +1,35 @@ +K 25 +svn:wc:ra_dav:version-url +V 52 +/svnroot/align/!svn/ver/32/trunk/maligna/trash/xpath +END +XPathParserTest.java +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/xpath/XPathParserTest.java +END +XPathParser.java +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/xpath/XPathParser.java +END +simpletext.xml +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/align/!svn/ver/32/trunk/maligna/trash/xpath/simpletext.xml +END +XPathParserException.java +K 25 +svn:wc:ra_dav:version-url +V 77 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/xpath/XPathParserException.java +END +Util.java +K 25 +svn:wc:ra_dav:version-url +V 61 +/svnroot/align/!svn/ver/8/trunk/maligna/trash/xpath/Util.java +END diff --git a/trash/xpath/.svn/entries b/trash/xpath/.svn/entries new file mode 100644 index 0000000..2061ad8 --- /dev/null +++ b/trash/xpath/.svn/entries @@ -0,0 +1,110 @@ +10 + +dir +50 +https://align.svn.sourceforge.net/svnroot/align/trunk/maligna/trash/xpath +https://align.svn.sourceforge.net/svnroot/align + + + +2009-04-15T07:14:58.474012Z +32 +jarekl + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +4439f797-f042-0410-9cfb-804d0787b311 + +Util.java +file + + + + +2008-08-20T21:14:50.000000Z +d26aae6999830adb12ed4a28e2e7c9a1 +2008-01-14T15:11:50.564431Z +6 +jarekl + +XPathParser.java +file + + + + +2008-08-20T21:14:50.000000Z +429c946db031408c9320c69401063821 +2008-01-14T15:11:50.564431Z +6 +jarekl + +XPathParserException.java +file + + + + +2008-08-20T21:14:49.000000Z +10bdb6a4c1b012a405a043d7e6e85168 +2008-01-14T15:11:50.564431Z +6 +jarekl + +XPathParserTest.java +file + + + + +2008-08-20T21:14:50.000000Z +6aa38fd8508663c73b9079cfef496eb0 +2008-01-14T15:11:50.564431Z +6 +jarekl + +simpletext.xml +file + + + + +2008-08-20T21:15:18.000000Z +8f97ec9264985a2170f78cc183ff2f26 +2009-04-15T07:14:58.474012Z +32 +jarekl + + + + + + + + + + + + + + + + + + + + + +274 + diff --git a/trash/xpath/.svn/text-base/Util.java.svn-base b/trash/xpath/.svn/text-base/Util.java.svn-base new file mode 100755 index 0000000..234f026 --- /dev/null +++ b/trash/xpath/.svn/text-base/Util.java.svn-base @@ -0,0 +1,31 @@ +package align.util; + +import static loomchild.util.Utils.readAll; +import static loomchild.util.res.Util.getResource; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.UnsupportedEncodingException; + +import loomchild.util.exceptions.IORuntimeException; + +public class Util { + + public static String readAllFromResource(String resourceName) { + try { + String fileName = getResource(resourceName); + Reader reader = new BufferedReader(new InputStreamReader( + new FileInputStream(fileName), "utf-8")); + String text = readAll(reader); + return text; + } catch (UnsupportedEncodingException e) { + throw new IORuntimeException(e); + } catch (FileNotFoundException e) { + throw new IORuntimeException(e); + } + } + +} diff --git a/trash/xpath/.svn/text-base/XPathParser.java.svn-base b/trash/xpath/.svn/text-base/XPathParser.java.svn-base new file mode 100755 index 0000000..87551b8 --- /dev/null +++ b/trash/xpath/.svn/text-base/XPathParser.java.svn-base @@ -0,0 +1,94 @@ +package align.parser; + +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.xml.XMLConstants; +import javax.xml.namespace.NamespaceContext; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import align.splitter.Splitter; + +/** + * Reprezentuje splitter wydobywający z dokumentu XML określoną zawartość + * znaczników zawierających tekst, Wybór znaczników dodkonywany jest na + * podstawie zadanego wyrażenia w języku XPath. Warunek by były to znaczniki + * zawierające tekst determinuje to że wyrażenie XPath musi się kończyć /text(). + * Latwo będzie w przyszłości rozszerzyć funkcjonalność o obsługe zawartości + * innych typów znaczników i atrybutów. + * @author loomchild + */ +public class XPathParser implements Splitter { + + private static XPathFactory xPathFactory = XPathFactory.newInstance(); + + private XPathExpression xPathExpression; + + public XPathParser(String expression) { + try { + XPath xPath = xPathFactory.newXPath(); + xPath.setNamespaceContext(new XmlNamespaceContext()); + this.xPathExpression = xPath.compile(expression); + } catch (XPathExpressionException e) { + throw new XPathParserException("Expression compilation error", e); + } + } + + public List split(String string) { + StringReader reader = new StringReader(string); + return split(reader); + } + + private List split(Reader reader) { + List segmentList = new ArrayList(); + try { + InputSource inputSource = new InputSource(reader); + NodeList nodeList = (NodeList) + xPathExpression.evaluate(inputSource, XPathConstants.NODESET); + for (int i = 0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if (node.getNodeType() == Node.TEXT_NODE) { + segmentList.add(node.getTextContent()); + } + } + } catch (XPathExpressionException e) { + throw new XPathParserException("Expression compilation error", e); + } + return segmentList; + } + +} + +class XmlNamespaceContext implements NamespaceContext { + + public String getNamespaceURI(String prefix) { + if (prefix == null) { + throw new NullPointerException("Null prefix"); + } else if (XMLConstants.XML_NS_PREFIX.equals(prefix)) { + return XMLConstants.XML_NS_URI; + } else { + return XMLConstants.NULL_NS_URI; + } + } + + public String getPrefix(String uri) { + throw new UnsupportedOperationException(); + } + + public Iterator getPrefixes(String uri) { + throw new UnsupportedOperationException(); + } + +} + diff --git a/trash/xpath/.svn/text-base/XPathParserException.java.svn-base b/trash/xpath/.svn/text-base/XPathParserException.java.svn-base new file mode 100755 index 0000000..157bc9d --- /dev/null +++ b/trash/xpath/.svn/text-base/XPathParserException.java.svn-base @@ -0,0 +1,32 @@ +package align.parser; + +import loomchild.util.exceptions.LogicException; + +/** + * Reprezentuje wyjątek mówiący o tym że dopasowanie tekstów jest niemożliwe. + * Zgłaszany np. gdy teksty tak różnią się długością że nie można ich dopasować, + * bo maksymalne dopasowanie to 1-1 albo tekst jest za krótki by + * zastosować dany algorytm. + * + * @author Jarek Lipski (loomchild) + */ +public class XPathParserException extends LogicException { + + /** + * + */ + private static final long serialVersionUID = 1586040420857957984L; + + /** + * Tworzy wyjątek. + * @param message Wiadomość. + */ + public XPathParserException(String message) { + super(message); + } + + + public XPathParserException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/trash/xpath/.svn/text-base/XPathParserTest.java.svn-base b/trash/xpath/.svn/text-base/XPathParserTest.java.svn-base new file mode 100755 index 0000000..7b23ffc --- /dev/null +++ b/trash/xpath/.svn/text-base/XPathParserTest.java.svn-base @@ -0,0 +1,31 @@ +package align.parser; + +import static align.util.Util.readAllFromResource; +import static loomchild.util.testing.Utils.assertListEquals; + +import java.util.List; + +import org.junit.Test; + + + +public class XPathParserTest { + + public static final String TEXT_FILE = "test/simpletext.xml"; + + public static final String EXPRESSION = + "/document/paragraph/sentence[@language='en']/text()"; + + public static final String[] SEGMENT_ARRAY = { + "First sentence. ", "Third sentence." + }; + + @Test + public void split() { + XPathParser splitter = new XPathParser(EXPRESSION); + String text = readAllFromResource(TEXT_FILE); + List segmentList = splitter.split(text); + assertListEquals(SEGMENT_ARRAY, segmentList); + } + +} diff --git a/trash/xpath/.svn/text-base/simpletext.xml.svn-base b/trash/xpath/.svn/text-base/simpletext.xml.svn-base new file mode 100755 index 0000000..b89a521 --- /dev/null +++ b/trash/xpath/.svn/text-base/simpletext.xml.svn-base @@ -0,0 +1,10 @@ + + + + First sentence. + Drugie zdanie. + + + Third sentence. + + \ No newline at end of file diff --git a/trash/xpath/Util.java b/trash/xpath/Util.java new file mode 100755 index 0000000..234f026 --- /dev/null +++ b/trash/xpath/Util.java @@ -0,0 +1,31 @@ +package align.util; + +import static loomchild.util.Utils.readAll; +import static loomchild.util.res.Util.getResource; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.UnsupportedEncodingException; + +import loomchild.util.exceptions.IORuntimeException; + +public class Util { + + public static String readAllFromResource(String resourceName) { + try { + String fileName = getResource(resourceName); + Reader reader = new BufferedReader(new InputStreamReader( + new FileInputStream(fileName), "utf-8")); + String text = readAll(reader); + return text; + } catch (UnsupportedEncodingException e) { + throw new IORuntimeException(e); + } catch (FileNotFoundException e) { + throw new IORuntimeException(e); + } + } + +} diff --git a/trash/xpath/XPathParser.java b/trash/xpath/XPathParser.java new file mode 100755 index 0000000..87551b8 --- /dev/null +++ b/trash/xpath/XPathParser.java @@ -0,0 +1,94 @@ +package align.parser; + +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.xml.XMLConstants; +import javax.xml.namespace.NamespaceContext; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import align.splitter.Splitter; + +/** + * Reprezentuje splitter wydobywający z dokumentu XML określoną zawartość + * znaczników zawierających tekst, Wybór znaczników dodkonywany jest na + * podstawie zadanego wyrażenia w języku XPath. Warunek by były to znaczniki + * zawierające tekst determinuje to że wyrażenie XPath musi się kończyć /text(). + * Latwo będzie w przyszłości rozszerzyć funkcjonalność o obsługe zawartości + * innych typów znaczników i atrybutów. + * @author loomchild + */ +public class XPathParser implements Splitter { + + private static XPathFactory xPathFactory = XPathFactory.newInstance(); + + private XPathExpression xPathExpression; + + public XPathParser(String expression) { + try { + XPath xPath = xPathFactory.newXPath(); + xPath.setNamespaceContext(new XmlNamespaceContext()); + this.xPathExpression = xPath.compile(expression); + } catch (XPathExpressionException e) { + throw new XPathParserException("Expression compilation error", e); + } + } + + public List split(String string) { + StringReader reader = new StringReader(string); + return split(reader); + } + + private List split(Reader reader) { + List segmentList = new ArrayList(); + try { + InputSource inputSource = new InputSource(reader); + NodeList nodeList = (NodeList) + xPathExpression.evaluate(inputSource, XPathConstants.NODESET); + for (int i = 0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if (node.getNodeType() == Node.TEXT_NODE) { + segmentList.add(node.getTextContent()); + } + } + } catch (XPathExpressionException e) { + throw new XPathParserException("Expression compilation error", e); + } + return segmentList; + } + +} + +class XmlNamespaceContext implements NamespaceContext { + + public String getNamespaceURI(String prefix) { + if (prefix == null) { + throw new NullPointerException("Null prefix"); + } else if (XMLConstants.XML_NS_PREFIX.equals(prefix)) { + return XMLConstants.XML_NS_URI; + } else { + return XMLConstants.NULL_NS_URI; + } + } + + public String getPrefix(String uri) { + throw new UnsupportedOperationException(); + } + + public Iterator getPrefixes(String uri) { + throw new UnsupportedOperationException(); + } + +} + diff --git a/trash/xpath/XPathParserException.java b/trash/xpath/XPathParserException.java new file mode 100755 index 0000000..157bc9d --- /dev/null +++ b/trash/xpath/XPathParserException.java @@ -0,0 +1,32 @@ +package align.parser; + +import loomchild.util.exceptions.LogicException; + +/** + * Reprezentuje wyjątek mówiący o tym że dopasowanie tekstów jest niemożliwe. + * Zgłaszany np. gdy teksty tak różnią się długością że nie można ich dopasować, + * bo maksymalne dopasowanie to 1-1 albo tekst jest za krótki by + * zastosować dany algorytm. + * + * @author Jarek Lipski (loomchild) + */ +public class XPathParserException extends LogicException { + + /** + * + */ + private static final long serialVersionUID = 1586040420857957984L; + + /** + * Tworzy wyjątek. + * @param message Wiadomość. + */ + public XPathParserException(String message) { + super(message); + } + + + public XPathParserException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/trash/xpath/XPathParserTest.java b/trash/xpath/XPathParserTest.java new file mode 100755 index 0000000..7b23ffc --- /dev/null +++ b/trash/xpath/XPathParserTest.java @@ -0,0 +1,31 @@ +package align.parser; + +import static align.util.Util.readAllFromResource; +import static loomchild.util.testing.Utils.assertListEquals; + +import java.util.List; + +import org.junit.Test; + + + +public class XPathParserTest { + + public static final String TEXT_FILE = "test/simpletext.xml"; + + public static final String EXPRESSION = + "/document/paragraph/sentence[@language='en']/text()"; + + public static final String[] SEGMENT_ARRAY = { + "First sentence. ", "Third sentence." + }; + + @Test + public void split() { + XPathParser splitter = new XPathParser(EXPRESSION); + String text = readAllFromResource(TEXT_FILE); + List segmentList = splitter.split(text); + assertListEquals(SEGMENT_ARRAY, segmentList); + } + +} diff --git a/trash/xpath/simpletext.xml b/trash/xpath/simpletext.xml new file mode 100755 index 0000000..b89a521 --- /dev/null +++ b/trash/xpath/simpletext.xml @@ -0,0 +1,10 @@ + + + + First sentence. + Drugie zdanie. + + + Third sentence. + + \ No newline at end of file