metacrunch-mab2 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e58083a8b10b6796906050c64d31ed1e3b565b92
4
+ data.tar.gz: e76670a16196f8c9ab0d1ed7aa4be9592f6fe79d
5
+ SHA512:
6
+ metadata.gz: 6facef45723b7ae6d4c7af8f6e32ddbc4ec9a34fa81e5b80e253556fe9b4ccfe2a2058c82f3874ba945c2fea59f8ef1188c8c6785460c93fec11356d77e7b801
7
+ data.tar.gz: 22a9eb459fd762b0a597bdb6472e3484dd8c5ec96fd28465ac07ec5907d0461aa1f49800f985fb68ed2fdc05fbc7a9466feeadb9125bfbb18a3c9f5ae6d6edd7
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .DS_Store
2
+ /Gemfile.lock
3
+ /.yardoc
4
+ /doc
5
+ /*.gem
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format documentation
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.2.2"
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "metacrunch", ">= 2.1.0", github: "ubpb/metacrunch", branch: "master"
6
+
7
+ gem "rake"
8
+ gem "pry-byebug", "~> 3.1.0"
9
+ gem "rspec", "~> 3.2.0"
10
+ gem "benchmark-ips", "~> 2.1"
11
+
12
+ # for benchmarking
13
+ gem "mabmapper", github: "ubpb/mabmapper", branch: "master"
data/License.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 René Sprotte, Michael Sievers, Marcel Otto
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "rspec/core/rake_task"
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
4
+
5
+ task :default => :spec
data/Readme.md ADDED
@@ -0,0 +1,6 @@
1
+ # metacrunch-mab2
2
+
3
+ [![Code Climate](https://codeclimate.com/github/ubpb/metacrunch-mab2/badges/gpa.svg)](https://codeclimate.com/github/ubpb/metacrunch-mab2)
4
+ [![Build Status](https://travis-ci.org/ubpb/metacrunch-mab2.svg)](https://travis-ci.org/ubpb/metacrunch-mab2)
5
+
6
+ Dokumentation folgt in Kürze...
@@ -0,0 +1,24 @@
1
+ require "metacrunch/mab2"
2
+ require "benchmark/ips"
3
+
4
+ require "mabmapper"
5
+ require "mabmapper/aleph_mab_xml_engine"
6
+ class EmptyMabmapperEngine < Mabmapper::Engine
7
+ document_class Mabmapper::MabXml::Document
8
+ end
9
+
10
+ Benchmark.ips do |x|
11
+ x.config(time: 5, warmup: 2)
12
+
13
+ @xml = File.read(File.join(Pathname.new(__dir__), "..", "spec", "assets", "aleph_mab_xml", "file1.xml"))
14
+
15
+ x.report("mabmapper") do
16
+ @document = EmptyMabmapperEngine.new.process("dummy.xml", @xml)
17
+ end
18
+
19
+ x.report("metacrunch") do
20
+ @document = Metacrunch::Mab2::Document.from_aleph_mab_xml(@xml)
21
+ end
22
+
23
+ x.compare!
24
+ end
@@ -0,0 +1,34 @@
1
+ require "metacrunch/mab2"
2
+ require "benchmark/ips"
3
+
4
+ Benchmark.ips do |x|
5
+ x.config(time: 5, warmup: 2)
6
+
7
+ @xml = File.read(File.join(Pathname.new(__dir__), "..", "spec", "assets", "aleph_mab_xml", "file1.xml"))
8
+ @document = Metacrunch::Mab2::Document.from_aleph_mab_xml(@xml)
9
+
10
+ x.report("reference") do
11
+ a = []
12
+
13
+ datafields_struct = @document.send(:datafields_struct)
14
+ datafields_set = datafields_struct["PPE"]
15
+ datafields = datafields_set.to_a
16
+
17
+ datafields.each do |datafield|
18
+ subfields_struct = datafield.send(:subfields_struct)
19
+ subfields_set = subfields_struct["p"]
20
+ subfields = subfields_set.to_a
21
+
22
+ subfields.each do |subfield|
23
+ a << subfield.value
24
+ end
25
+ end
26
+ end
27
+
28
+ x.report("implementation") do
29
+ @document.datafields("PPE").subfields("p").values
30
+ end
31
+
32
+ x.compare!
33
+ end
34
+
@@ -0,0 +1,89 @@
1
+ require "htmlentities"
2
+ require "ox"
3
+ require_relative "./document"
4
+
5
+ module Metacrunch
6
+ module Mab2
7
+ class AlephMabXmlDocumentFactory
8
+
9
+ def initialize(aleph_mab_xml)
10
+ @aleph_mab_xml = aleph_mab_xml
11
+ end
12
+
13
+ def to_document
14
+ @document ||= Parser.new.parse(@aleph_mab_xml)
15
+ end
16
+
17
+ private
18
+
19
+ class Parser < Ox::Sax
20
+ def parse(io_or_string)
21
+ # initialize state machine
22
+ @in_controlfield = @in_datafield = @in_subfield = false
23
+
24
+ @controlfield = @datafield = @subfield = nil
25
+ @document = Document.new
26
+ @html_entities_coder = HTMLEntities.new
27
+
28
+ io = io_or_string.is_a?(IO) ? io_or_string : StringIO.new(io_or_string)
29
+
30
+ # convert_special tells ox to convert some html entities already during
31
+ # parsing, which minifies the amount of entities we have to decode ourself
32
+ Ox.sax_parse(self, io, convert_special: true)
33
+
34
+ return @document
35
+ end
36
+
37
+ def start_element(name)
38
+ if name == :subfield
39
+ @in_subfield = true
40
+ @subfield = Document::Datafield::Subfield.new
41
+ elsif name == :datafield
42
+ @in_datafield = true
43
+ @datafield = Document::Datafield.new
44
+ elsif name == :controlfield
45
+ @in_controlfield = true
46
+ @controlfield = Document::Controlfield.new
47
+ end
48
+ end
49
+
50
+ def end_element(name)
51
+ if @in_subfield
52
+ @in_subfield = false
53
+ @datafield.add_subfield(@subfield)
54
+ elsif @in_datafield
55
+ @in_datafield = false
56
+ @document.add_datafield(@datafield)
57
+ elsif @in_controlfield
58
+ @in_controlfield = false
59
+ @document.add_controlfield(@controlfield)
60
+ end
61
+ end
62
+
63
+ def attr(name, value)
64
+ if @in_subfield
65
+ @subfield.code = value if name == :code
66
+ elsif @in_datafield
67
+ if name == :tag
68
+ @datafield.tag = value
69
+ elsif name == :ind1
70
+ @datafield.ind1 = value
71
+ elsif name == :ind2
72
+ @datafield.ind2 = value
73
+ end
74
+ elsif @in_controlfield
75
+ @controlfield.tag = value if name == :tag
76
+ end
77
+ end
78
+
79
+ def text(value)
80
+ if @in_subfield
81
+ @subfield.value = value.include?("&") ? @html_entities_coder.decode(value) : value
82
+ elsif @in_controlfield
83
+ @controlfield.values = value
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1 @@
1
+ # TODO
@@ -0,0 +1,79 @@
1
+ module Metacrunch
2
+ module Mab2
3
+ class Document
4
+ class Controlfield
5
+
6
+ attr_accessor :tag
7
+
8
+ def initialize(tag = nil, values = [])
9
+ self.tag = tag
10
+ self.values = values
11
+ end
12
+
13
+ def tag=(value)
14
+ @tag = value.to_s if value
15
+ end
16
+
17
+ #
18
+ # Setter for the control field values. Values can be given as String or
19
+ # as an Array.
20
+ #
21
+ # @param [String, Array] values for the control field as a String or Array.
22
+ # In case of String the MAB2 delimiter/placeholder | is respected. In case
23
+ # of an Array every element is converted into a String. Empty strings are
24
+ # converted into nil. Array values that are longer than one character will
25
+ # raise an ArgumentError.
26
+ #
27
+ # @example Add control field using String values
28
+ # add_control_field("050", "a|b||")
29
+ #
30
+ # @example Add control field using Array
31
+ # add_control_field("050", ["a", nil, "b", nil, nil])
32
+ #
33
+ def values=(values)
34
+ @values = case values
35
+ when String then string2values(values)
36
+ when Array then array2values(values)
37
+ when nil then []
38
+ else
39
+ raise ArgumentError, "expecting a String or Array, but got #{values}"
40
+ end
41
+ end
42
+
43
+ #
44
+ # @return [Array<String>]
45
+ #
46
+ def values
47
+ @values
48
+ end
49
+
50
+ #
51
+ # @param [int] index
52
+ # @return [Array<String>] value at given index
53
+ #
54
+ def at(index)
55
+ @values.at(index)
56
+ end
57
+
58
+ private
59
+
60
+ def string2values(string)
61
+ string.chars.to_a.map{ |e| (e=="|") ? nil : e }
62
+ end
63
+
64
+ def array2values(values)
65
+ values.map do |v|
66
+ if v.present?
67
+ v = v.to_s
68
+ raise ArgumentError, "invalid value of controlfield #{tag}: #{values}" if v.length > 1
69
+ v
70
+ else
71
+ nil
72
+ end
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,54 @@
1
+ module Metacrunch
2
+ module Mab2
3
+ class Document
4
+ class Datafield
5
+
6
+ attr_accessor :tag
7
+ attr_accessor :ind1, :ind2
8
+
9
+ def initialize(tag = nil, ind1:nil, ind2:nil)
10
+ @tag = tag
11
+ @ind1 = ind1
12
+ @ind2 = ind2
13
+ end
14
+
15
+ # ------------------------------------------------------------------------------
16
+ # Sub fields
17
+ # ------------------------------------------------------------------------------
18
+
19
+ #
20
+ # @return [Hash{String => Metacrunch::Mab2::Document::Datafield::Subfield::Set}]
21
+ # @private
22
+ #
23
+ def subfields_struct
24
+ @subfields_struct ||= {}
25
+ end
26
+ private :subfields_struct
27
+
28
+ #
29
+ # Returns the sub field matching the given code.
30
+ #
31
+ # @param [String] code of the sub field
32
+ # @return [Metacrunch::Mab2::Document::Datafield::Subfield::Set] sub field with the given code. The set
33
+ # is empty if the sub field doesn't exists.
34
+ #
35
+ def subfields(code)
36
+ subfields_struct[code] || Subfield::Set.new
37
+ end
38
+
39
+ #
40
+ # Adds a new sub field.
41
+ #
42
+ # @param [Metacrunch::Mab2::Document::Datafield::Subfield] subfield
43
+ #
44
+ def add_subfield(subfield)
45
+ subfield_set = subfields(subfield.code)
46
+ subfield_set << subfield
47
+
48
+ subfields_struct[subfield.code] = subfield_set
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,47 @@
1
+ module Metacrunch
2
+ module Mab2
3
+ class Document
4
+ class Datafield
5
+ class Set
6
+ include Enumerable
7
+
8
+ def initialize(datafields = [])
9
+ @datafields = datafields
10
+ end
11
+
12
+ def each
13
+ block_given? ? @datafields.each { |_datafield| yield _datafield } : to_enum
14
+ end
15
+
16
+ def <<(datafield)
17
+ @datafields << datafield
18
+ end
19
+
20
+ def concat(datafield_set)
21
+ @datafields.concat(datafield_set.to_a)
22
+ end
23
+
24
+ def to_a
25
+ @datafields
26
+ end
27
+
28
+ def empty?
29
+ @datafields.empty?
30
+ end
31
+
32
+ # @return [Metacrunch::Mab2::Document::Datafield::Subfield::Set]
33
+ def subfields(name)
34
+ set = Subfield::Set.new
35
+
36
+ @datafields.each do |datafield|
37
+ set.concat(datafield.subfields(name))
38
+ end
39
+
40
+ set
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,20 @@
1
+ module Metacrunch
2
+ module Mab2
3
+ class Document
4
+ class Datafield
5
+ class Subfield
6
+
7
+ attr_accessor :code
8
+ attr_accessor :value
9
+
10
+ def initialize(code = nil, value = nil)
11
+ @code = code
12
+ @value = value
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,42 @@
1
+ module Metacrunch
2
+ module Mab2
3
+ class Document
4
+ class Datafield
5
+ class Subfield
6
+ class Set
7
+ include Enumerable
8
+
9
+ def initialize(subfields = [])
10
+ @subfields = subfields
11
+ end
12
+
13
+ def each
14
+ block_given? ? @subfields.each { |_subfield| yield _subfield } : to_enum
15
+ end
16
+
17
+ def <<(subfield)
18
+ @subfields << subfield
19
+ end
20
+
21
+ def concat(subfield_set)
22
+ @subfields.concat(subfield_set.to_a)
23
+ end
24
+
25
+ def to_a
26
+ @subfields
27
+ end
28
+
29
+ def empty?
30
+ @subfields.empty?
31
+ end
32
+
33
+ def values
34
+ @subfields.map{ |subfield| subfield.value }
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,106 @@
1
+ module Metacrunch
2
+ module Mab2
3
+ class Document
4
+ require_relative "./document/controlfield"
5
+ require_relative "./document/datafield"
6
+ require_relative "./document/datafield_set"
7
+ require_relative "./document/subfield"
8
+ require_relative "./document/subfield_set"
9
+
10
+ # ------------------------------------------------------------------------------
11
+ # Parsing
12
+ # ------------------------------------------------------------------------------
13
+
14
+ #
15
+ # @param [String] xml repesenting a MAB document in Aleph MAB XML format
16
+ # @return [Metacrunch::Mab2::Document]
17
+ #
18
+ def self.from_aleph_mab_xml(xml)
19
+ AlephMabXmlDocumentFactory.new(xml).to_document
20
+ end
21
+
22
+ # ------------------------------------------------------------------------------
23
+ # Control fields
24
+ # ------------------------------------------------------------------------------
25
+
26
+ #
27
+ # @return [Hash{String => Metacrunch::Mab2::Document::Controlfield}]
28
+ # @private
29
+ #
30
+ def controlfields_struct
31
+ @controlfields_struct ||= {}
32
+ end
33
+ private :controlfields_struct
34
+
35
+ #
36
+ # Returns the control field matching the given tag.
37
+ #
38
+ # @param [String] tag of the control field
39
+ # @return [Controlfield, nil] control field with the given tag. Is nil
40
+ # if the control field doesn't exists.
41
+ #
42
+ def controlfield(tag)
43
+ controlfields_struct[tag]
44
+ end
45
+
46
+ #
47
+ # Adds a new control field.
48
+ #
49
+ # @param [Metacrunch::Mab2::Document::Controlfield] controlfield
50
+ #
51
+ def add_controlfield(controlfield)
52
+ controlfields_struct[controlfield.tag] = controlfield
53
+ end
54
+
55
+ # ------------------------------------------------------------------------------
56
+ # Data fields
57
+ # ------------------------------------------------------------------------------
58
+
59
+ #
60
+ # @return [Hash{String => Metacrunch::Mab2::Document::Datafield::Set}]
61
+ # @private
62
+ #
63
+ def datafields_struct
64
+ @datafields_struct ||= {}
65
+ end
66
+ private :datafields_struct
67
+
68
+ #
69
+ # Returns the data fields matching the given tag and ind1/ind2.
70
+ #
71
+ # @param [String] tag of the data field
72
+ # @param [String, nil] ind1 filter for ind1. Can be nil to match any.
73
+ # @param [String, nil] ind2 filter for ind2. Can be nil to match any.
74
+ # @return [Metacrunch::Mab2::Document::Datafield::Set] data field with the given tag and ind1/ind2.
75
+ # The set is empty if a matching field with the tag and/or ind1/ind2 doesn't exists.
76
+ #
77
+ def datafields(tag, ind1: nil, ind2: nil)
78
+ set = datafields_struct[tag] || Datafield::Set.new
79
+ return set if set.empty?
80
+
81
+ if ind1 || ind2
82
+ filtered_datafields = set.select do |_datafield|
83
+ (!ind1 || _datafield.ind1 == ind1) && (!ind2 || _datafield.ind2 == ind2)
84
+ end
85
+
86
+ Datafield::Set.new(filtered_datafields)
87
+ else
88
+ set
89
+ end
90
+ end
91
+
92
+ #
93
+ # Adds a new data field.
94
+ #
95
+ # @param [Metacrunch::Mab2::Document::Datafield] datafield
96
+ #
97
+ def add_datafield(datafield)
98
+ datafield_set = datafields(datafield.tag)
99
+ datafield_set << datafield
100
+
101
+ datafields_struct[datafield.tag] = datafield_set
102
+ end
103
+
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,5 @@
1
+ module Metacrunch
2
+ module Mab2
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ require "metacrunch"
2
+ require "ox"
3
+ require "htmlentities"
4
+
5
+ begin
6
+ require "pry"
7
+ rescue LoadError ; end
8
+
9
+ module Metacrunch
10
+ module Mab2
11
+ require_relative "./mab2/version"
12
+ require_relative "./mab2/document"
13
+ require_relative "./mab2/cli"
14
+ require_relative "./mab2/aleph_mab_xml_document_factory"
15
+ end
16
+ end
@@ -0,0 +1 @@
1
+ require "metacrunch/mab2"
@@ -0,0 +1,23 @@
1
+ require File.expand_path("../lib/metacrunch/mab2/version", __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.authors = ["René Sprotte", "Michael Sievers", "Marcel Otto"]
5
+ s.email = "r.sprotte@ub.uni-paderborn.de"
6
+ s.summary = %q{MAB2 tools for metacrunch}
7
+ s.description = s.summary
8
+ s.homepage = "http://github.com/ubpb/metacrunch-mab2"
9
+ s.licenses = ["MIT"]
10
+
11
+ s.files = `git ls-files`.split($\)
12
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
14
+ s.name = "metacrunch-mab2"
15
+ s.require_paths = ["lib"]
16
+ s.version = Metacrunch::Mab2::VERSION
17
+
18
+ s.required_ruby_version = ">= 2.2.0"
19
+
20
+ s.add_dependency "metacrunch", "~> 2.1"
21
+ s.add_dependency "htmlentities", "~> 4.3"
22
+ s.add_dependency "ox", "~> 2.1"
23
+ end
@@ -0,0 +1,210 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
3
+ <ListRecords>
4
+ <record>
5
+ <header>
6
+ <identifier>aleph-publish:000969442</identifier>
7
+ </header>
8
+ <metadata>
9
+ <record xmlns="http://www.ddb.de/professionell/mabxml/mabxml-1.xsd">
10
+ <leader>------M2.01200024------h</leader>
11
+ <controlfield tag="LDR">------M2.01200024------h</controlfield>
12
+ <controlfield tag="FMT">MH</controlfield>
13
+ <datafield tag="001" ind1="-" ind2="1">
14
+ <subfield code="a">HT014768063</subfield>
15
+ </datafield>
16
+ <datafield tag="002" ind1="a" ind2="1">
17
+ <subfield code="a">20060627</subfield>
18
+ </datafield>
19
+ <datafield tag="003" ind1="-" ind2="1">
20
+ <subfield code="a">20061121</subfield>
21
+ </datafield>
22
+ <controlfield tag="030">a|1uc||||||17</controlfield>
23
+ <datafield tag="036" ind1="a" ind2="1">
24
+ <subfield code="a">DE</subfield>
25
+ </datafield>
26
+ <datafield tag="037" ind1="b" ind2="1">
27
+ <subfield code="a">ger</subfield>
28
+ </datafield>
29
+ <controlfield tag="050">a|||||||||||||</controlfield>
30
+ <controlfield tag="051">m|||||||</controlfield>
31
+ <datafield tag="070" ind1="-" ind2="1">
32
+ <subfield code="a">290</subfield>
33
+ </datafield>
34
+ <datafield tag="070" ind1="b" ind2="1">
35
+ <subfield code="a">294</subfield>
36
+ </datafield>
37
+ <datafield tag="080" ind1="-" ind2="1">
38
+ <subfield code="a">60</subfield>
39
+ </datafield>
40
+ <datafield tag="100" ind1="-" ind2="1">
41
+ <subfield code="p">Kofler, Michael</subfield>
42
+ <subfield code="d">1967-</subfield>
43
+ <subfield code="9">(DE-588)121636763</subfield>
44
+ </datafield>
45
+ <datafield tag="104" ind1="a" ind2="1">
46
+ <subfield code="p">Plate, Jürgen</subfield>
47
+ <subfield code="9">(DE-588)124010938</subfield>
48
+ </datafield>
49
+ <datafield tag="331" ind1="-" ind2="1">
50
+ <subfield code="a">&lt;&lt;Das&gt;&gt; Linux für Studenten</subfield>
51
+ </datafield>
52
+ <datafield tag="359" ind1="-" ind2="1">
53
+ <subfield code="a">Michael Kofler ; Jürgen Plate</subfield>
54
+ </datafield>
55
+ <datafield tag="370" ind1="a" ind2="1">
56
+ <subfield code="a">Debian GNU-Linux 3.1r2 "Sarge"</subfield>
57
+ </datafield>
58
+ <datafield tag="410" ind1="-" ind2="1">
59
+ <subfield code="a">München [u.a.]</subfield>
60
+ </datafield>
61
+ <datafield tag="412" ind1="-" ind2="1">
62
+ <subfield code="a">Pearson Studium</subfield>
63
+ </datafield>
64
+ <datafield tag="425" ind1="a" ind2="1">
65
+ <subfield code="a">2006</subfield>
66
+ </datafield>
67
+ <datafield tag="433" ind1="-" ind2="1">
68
+ <subfield code="a">607 S. : Ill., graph. Darst.</subfield>
69
+ </datafield>
70
+ <datafield tag="437" ind1="-" ind2="1">
71
+ <subfield code="a">2 DVDs</subfield>
72
+ </datafield>
73
+ <datafield tag="451" ind1="-" ind2="1">
74
+ <subfield code="a">Scientific tools</subfield>
75
+ </datafield>
76
+ <datafield tag="512" ind1="-" ind2="1">
77
+ <subfield code="p">DVDs u.d.T.</subfield>
78
+ <subfield code="a">Debian GNU-Linux 3.1r2 "Sarge"</subfield>
79
+ </datafield>
80
+ <datafield tag="540" ind1="a" ind2="1">
81
+ <subfield code="a">978-3-8273-7205-5</subfield>
82
+ <subfield code="b">kart. : EUR 39.95</subfield>
83
+ </datafield>
84
+ <datafield tag="540" ind1="a" ind2="1">
85
+ <subfield code="a">3-8273-7205-4</subfield>
86
+ </datafield>
87
+ <datafield tag="902" ind1="-" ind2="1">
88
+ <subfield code="s">LINUX</subfield>
89
+ <subfield code="9">(DE-588)4337730-0</subfield>
90
+ </datafield>
91
+ <controlfield tag="SYS">000969442</controlfield>
92
+ <datafield tag="PPE" ind1="-" ind2="1">
93
+ <subfield code="p">Kofler, M.</subfield>
94
+ <subfield code="d">1967-</subfield>
95
+ <subfield code="9">(DE-588)121636763</subfield>
96
+ </datafield>
97
+ <datafield tag="PPE" ind1="-" ind2="1">
98
+ <subfield code="p">Kofler, Michaėlʹ</subfield>
99
+ <subfield code="d">1967-</subfield>
100
+ <subfield code="9">(DE-588)121636763</subfield>
101
+ </datafield>
102
+ <datafield tag="PPE" ind1="-" ind2="1">
103
+ <subfield code="p">Kofler, M.</subfield>
104
+ <subfield code="d">1967-</subfield>
105
+ <subfield code="9">(DE-588)121636763</subfield>
106
+ </datafield>
107
+ <datafield tag="PPE" ind1="-" ind2="1">
108
+ <subfield code="p">Kofler, Michaėlʹ</subfield>
109
+ <subfield code="d">1967-</subfield>
110
+ <subfield code="9">(DE-588)121636763</subfield>
111
+ </datafield>
112
+ <datafield tag="700" ind1=" " ind2=" ">
113
+ <subfield code="a">TWR</subfield>
114
+ </datafield>
115
+ <datafield tag="OWN" ind1=" " ind2=" ">
116
+ <subfield code="a">P0001</subfield>
117
+ <subfield code="n">466 - Paderborn: UB</subfield>
118
+ </datafield>
119
+ <datafield tag="655" ind1=" " ind2=" ">
120
+ <subfield code="y">Linux für Studenten</subfield>
121
+ <subfield code="t">VIEW</subfield>
122
+ <subfield code="u">http://digitool.hbz-nrw.de:1801/webclient/DeliveryManager?application=DIGITOOL-3&amp;owner=resourcediscovery&amp;custom_att_2=simple_viewer&amp;user=GUEST&amp;pid=2170987</subfield>
123
+ </datafield>
124
+ <datafield tag="TXT" ind1=" " ind2=" ">
125
+ <subfield code="a">OCR-TEXT: INHALTSVERZEICHNIS VORWORT 17 KAPITEL 1 WAS IST LINUX? 21 1.1 EINFHRUNG 22 1.2 DISTRIBUTIONEN 25 1.3 TRAUM UND WIRKLICHKEIT 29 1.4 HERKUNFT UND LIZENZ VON LINUX 31 KAPITEL 2 INSTALLATION 35 2.1 VORAUSSETZUNGEN 36 2.2 BERBLICK BER DEN INSTALLATIONSPROZESS 36 2.3 GRUNDLAGEN DER FESTPLATTENPARTITIONIERUNG 38 2.3.1 WAS SIND PARTITIONEN UND WOZU DIENEN SIE? 38 2.3.2 PARTITIONSTYPEN 38 2.3.3 PARTITIONIERUNG UND FORMATIERUNG 39 2.3.4 PARTITIONSNAMEN UNTER WINDOWS 39 2.3.5 PARTITIONSNAMEN UNTER LINUX 40 2.4 NEUPARTITIONIERUNG DER FESTPLATTE 41 2.4.1 NEUPARTITIONIERUNG UNTER WINDOWS 9X/ME 42 2.4.2 NEUPARTITIONIERUNG UNTER WINDOWS NT/2000/XP 44 2.5 START DER LINUX-INSTALLATION 45 2.6 PARTITIONIERUNG DER FESTPLATTE UNTER LINUX 47 2.6.1 ANZAHL UND GRE VON LINUX-PARTITIONEN 47 2.6.2 WELCHES DATEISYSTEM? 49 2.7 PAKETAUSWAHL 49 2.7.1 GRUNDKONFIGURATION 50 2.7.2 INSTALLATION DES BOOT-LOADERS 52 2.8 INSTALLATIONSVARIANTEN 53 2.8.1 INSTALLATIONSDISKETTEN ERZEUGEN 53 2.8.2 LINUX BER EINE NETZWERKVERBINDUNG INSTALLIEREN 53 2.8.3 NOTEBOOK-INSTALLATION 54 2.9 PROBLEME BEI DER INSTALLATION 55 2.9.1 HARDWARE-PROBLEME 55 2.9.2 DAS 1024-ZYLINDER-PROBLEM 56 2.9.3 TASTATURPROBLEME 56 2.10 PROBLEME NACH DER INSTALLATION 57 2.10.1 DER RECHNER KANN NICHT MEHR GESTARTET WERDEN 57 2.10.2 X/KDE/GNOME STARTET NICHT 59 2.10.3 DIE MAUS FUNKTIONIERT NICHT ODER NUR TEILWEISE 59 2.10.4 DIE TASTATUR FUNKTIONIERT NICHT 60 2.10.5 MENS ERSCHEINEN IN DER FALSCHEN SPRACHE 60 2.11 SYSTEMVERNDERUNGEN, ERWEITERUNGEN UND UPDATES 60 2.12 LINUX WIEDER ENTFERNEN 61 KAPITEL 3 LINUX-EINSTIEG 63 3.1 LINUX STARTEN UND BEENDEN 64 3.2 GRAFISCHE BENUTZEROBERFLCHEN (KDE UND GNOME) 67 3.2.1 KDE-SCHNELLEINSTIEG 67 3.2.2 GNOME-SCHNELLEINSTIEG 68 3.3 TASTATUR, MAUS UND ZWISCHENABLAGE 68 3.3.1 WICHTIGE TASTENKRZEL 68 3.3.2 EINGABE AUSLNDISCHER SONDERZEICHEN 70 3.3.3 VERWENDUNG DER MAUS 71 3.3.4 MAUSSTEUERUNG PER TASTATUR 72 3.3.5 ZWISCHENABLAGE 72 3.4 TEXTKONSOLEN UND SHELL-FENSTER 73 3.4.1 TEXTKONSOLEN 73</subfield>
126
+ </datafield>
127
+ <datafield tag="TXT" ind1=" " ind2=" ">
128
+ <subfield code="a">3.4.2 KONSOLENFENSTER (SHELL-FENSTER) 74 3.4.3 KOMMANDOS AUSFHREN 75 3.4.4 ARBEITEN ALS ROOT 77 3.5 UMGANG MIT DATEIEN UND VERZEICHNISSEN 78 3.5.1 DATEIEN 78 3.5.2 KOMMANDOS ZUR BEARBEITUNG VON DATEIEN 79 3.5.3 TEXTDATEIEN ANZEIGEN 80 3.5.4 TEXTEDITOREN 81 3.5.5 JOKERZEICHEN 82 3.5.6 KOMPLIKATIONEN BEI DER VERWENDUNG VON JOKERZEICHEN 83 3.5.7 VERSTECKTE DATEIEN 85 3.5.8 VERZEICHNISSE 85 3.5.9 FESTE UND SYMBOLISCHE LINKS 86 3.5.10 LINKS AUF PROGRAMME 88 3.6 ZUGRIFFSRECHTE, BENUTZER UND GRUPPENZUGEHRIGKEIT 88 3.6.1 ZUGRIFFSRECHTE AUF VERZEICHNISSE 90 3.6.2 SPEZIALBITS 91 3.6.3 BESITZER, GRUPPE UND ZUGRIFFSBITS NEUER DATEIEN 92 3.7 LINUX-VERZEICHNISSTRUKTUR, DEVICE-NAMEN 93 3.7.1 LINUX-VERZEICHNISSTRUKTUR (FILESYSTEM HIERARCHY STANDARD) 93 3.7.2 DEVICES 95 3.7.3 DATEITYPEN (MIME) 98 3.7.4 MAGIC-DATEIEN 99 3.8 CD-ROMS, DVDS, DISKETTEN UND WINDOWS-PARTITIONEN 100 3.8.1 AUTOMATISCHER ZUGRIFF AUF DATENTRGER UNTER KDE UND GNOME ... 101 3.8.2 MANUELLER ZUGRIFF AUF CD-ROMS 101 3.8.3 MANUELLER ZUGRIFF AUF DISKETTEN 102 3.8.4 MANUELLER ZUGRIFF AUF WINDOWS-PARTITIONEN 102 3.8.5 USB-, FIREWIRE- UND PCMCIA-LAUFWERKE, USB-MEMORY-STICKS .. 103 3.8.6 AKTUELLEN ZUSTAND DES DATEISYSTEMS ERMITTELN 104 3.8.7 /ETC/FSTAB - DATEISYSTEME AUTOMATISCH EINBINDEN 105 3.8.8 SPEZIELLE DATEISYSTEME 107 3.9 DOKUMENTATION ZU LINUX 109 3.9.1 HILFE IN GNOME- UND KDE-PROGRAMMEN 109 3.9.2 HILFE BEI TEXTORIENTIERTEN KOMMANDOS 109 3.9.3 MAN-HILFETEXTE 110 3.9.4 INFO-HILFETEXTE 111 3.9.5 ZUSATZDOKUMENTATION ZU PROGRAMMPAKETEN 112 3.9.6 DAS LINUX DOCUMENTATION PROJECT (LDP) 114 3.9.7 KERNEL-DOKUMENTATION 115 3.9.8 WEITERE DOKUMENTATIONEN IM INTERNET 115 KAPITEL 4 DIE LINUX-SHELL 117 4.1 AUFGABEN DER SHELL 118 4.2 GRUNDLEGENDE EIGENSCHAFTEN DER SHELL 119 4.3 EIN- UND AUSGABEUMLEITUNG 120 4.3.1 EINGABEUMLEITUNG 121 4.3.2 AUSGABEUMLEITUNG 121 4.3.3 PIPES 123 4.4 METAZEICHEN ZUR EXPANSION VON DATEINAMEN 124 4.5 STRING-ERSETZUNGEN (QUOTING) 126 4.6 BASH-SPEZIALITTEN 127 4.6.1 DER PROMPT 127</subfield>
129
+ </datafield>
130
+ <datafield tag="TXT" ind1=" " ind2=" ">
131
+ <subfield code="a">4.6.2 EDITIEREN DER KOMMANDOZEILE 128 4.6.3 HISTORY-MECHANISMUS 128 4.6.4 WICHTIGE INTERNE KOMMANDOS 128 4.6.5 ZEICHENKETTENBILDUNG MIT GESCHWEIFTEN KLAMMERN 129 4.6.6 BERECHNUNG ARITHMETISCHER AUSDRCKE IN ECKIGEN KLAMMERN 130 4.6.7 AUSGABEVERVIELFACHUNG MIT TEE 130 4.7 REGULRE AUSDRCKE, GREP UND SED 132 4.7.1 REGULRE AUSDRCKE (REGULR EXPRESSIONS) 132 4.7.2 GREP 135 4.7.3 DER STREAM-EDITOR SED 136 4.8 SHELL-PROGRAMMIERUNG 139 4.8.1 TESTEN VON SHELL-SKRIPTEN 140 4.8.2 KOMMENTARE IN SHELL-SKRIPTEN 141 4.8.3 SHELL-VARIABLE 142 4.8.4 VORDEFINIERTE VARIABLE 143 4.8.5 PARAMETERZUGRIFF IN SHELL-SKRIPTEN 145 4.8.6 NAMENS- UND PARAMETERERSETZUNG 147 4.8.7 BEARBEITUNG EINER BELIEBIGEN ANZAHL VON PARAMETERN 148 4.8.8 GLTIGKEIT VON KOMMANDOS UND VARIABLEN 148 4.8.9 INTERAKTIVE EINGABEN IN SHELL-SKRIPTEN 149 4.8.10 HIER-DOKUMENTE 150 4.8.11 VERKETTUNG VON KOMMANDOS 150 4.8.12 ZUSAMMENFASSUNG VON KOMMANDOS 151 4.8.13 STRUKTUREN DER SHELL 152 4.8.14 BEDINGUNGEN TESTEN 152 4.8.15 BEDINGTE ANWEISUNG (I F - THEN - EISE) 154 4.8.16 MEHRFACHAUSWAHL MIT CASE 157 4.8.17 DIE F OR-ANWEISUNG 158 4.8.18 ABWEISENDE WIEDERHOLUNGSANWEISUNG (WHI 1 E) 159 4.8.19 UNTI 1-ANWEISUNG 160 4.8.20 WEITERE ANWEISUNGEN 161 4.8.21 EXEC [KOMMANDOZEILE] 164 4.8.22 EVAL [ARGUMENTE] 165 4.8.23 TRAP ' KOMMANDO! I STE' SIGNALE 166 4.8.24 SHELL-FUNKTIONEN 167 4.8.25 XA RGS 169 4.8.26 FIND 170 4.9 BEISPIELE FR SHELL-SKRIPTEN 172 4.9.1 DATEI VERLNGERN 172 4.9.2 TELEFONBUCH 172 4.9.3 ARGUMENTE MIT J/N-ABFRAGE AUSFHREN 172 4.9.4 DATEIEN IM PFAD SUCHEN 173 4.9.5 BERECHNUNG DES OSTERDATUMS NACH C. F. GAUSS 173 4.9.6 WEM DIE STUNDE SCHLGT 175 4.9.7 EINGABE OHNE ENTER-TASTE 176 4.9.8 STNDIG KONTROLLIEREN, WER SICH EIN- UND AUSLOGGT 176 4.9.9 OPTIONEN ERMITTELN 176 4.9.10 RENAME-KOMMANDO 177 4.9.11 REKURSIVES SUCHEN IN DATEIEN 178 4.9.12 DAS LETZTE 179 4.10 REFERENZ SHELL-PROGRAMMIERUNG 179 4.11 REFERENZ ALLER SONDERZEICHEN 187 4.12 AUFGABEN 188 KAPITEL 5 WWW, E-MAIL, NFS, SSH UND SCP 191 5.1 WEBBROWSER 192</subfield>
132
+ </datafield>
133
+ <datafield tag="TXT" ind1=" " ind2=" ">
134
+ <subfield code="a">5.1.1 DIE MOZILLA-FAMILIE 192 5.1.2 KONQUEROR 196 5.1.3 LYNX 198 5.2 E-MAIL 199 5.2.1 GLOSSAR 199 5.2.2 MAIL-KONFIGURATION 200 5.2.3 MAILBOX-FORMATE UND -KONVERTIERUNG 202 5.3 E-MAIL-CLIENTS 203 5.3.1 MOZILLA UND THUNDERBIRD 203 5.3.2 KMAIL 206 5.4 ZUGRIFF AUF LINUX-VERZEICHNISSE IM NETZ (NFS) 209 5.4.1 NFS-CLIENT 209 5.4.2 NFS-SERVER 210 5.5 ZUGRIFF AUF WINDOWS-VERZEICHNISSEIM NETZ (SMB) 212 5.6 FTP-CLIENT 215 5.6.1 FTP-CLIENTS 215 5.6.2 FTP-KOMMANDO 216 5.7 SSH 217 5.7.1 SFTP (SECURE FTP) 220 5.8 VERZEICHNISSE KOPIEREN UND SYNCHRONISIEREN (RSYNC) 220 KAPITEL 6 DRUCKEN MIT CUPS 223 6.1 KONFIGURATION UND ANWENDUNG LOKALER DRUCKER 224 6.1.1 REDHAT- UND FEDORA-DRUCKER-KONFIGURATION 225 6.1.2 SUSE-DRUCKER-KONFIGURATION 226 6.1.3 KDE-DRUCKER-KONFIGURATION 226 6.1.4 DRUCKEN 227 6.2 INTERNA DES DRUCKPROZESSES 229 6.3 SPOOLING-SYSTEME (CUPS) 231 6.3.1 BSD-LPD 231 6.3.2 LPRNG 232 6.3.3 CUPS 232 6.3.4 CUPS-KOMMANDOS 235 6.3.5 CUPS-WEBADMINISTRATION 237 6.4 NETZWERKDRUCKER ANBIETEN (SERVER) 238 6.4.1 BSD-LPD-KOMPATIBILITT 240 6.5 NETZWERKDRUCKER NUTZEN (CLIENT) 241 6.6 POSTSCRIPT- UND PDF-TOOLS 242 6.6.1 POSTSCRIPT- UND PDF-VIEWER 242 6.6.2 KONVERTIERUNG TEXT - POSTSCRIPT 243 6.6.3 KONVERTIERUNG HTML -* POSTSCRIPT 244 6.6.4 KONVERTIERUNG PS + PDF 245 6.6.5 POSTSCRIPT-TOOLS (PSUTILS) 245 6.6.6 GHOSTSCRIPT, GIMP-PRINT UND ANDERE DRUCKERTREIBER 247 KAPITEL 7 AUDIO UND VIDEO 251 7.1 KONFIGURATION DER SOUNDKARTE 252 7.1.1 LAUTSTRKEREGELUNG 253 7.1.2 ERSTER TEST 254 7.1.3 SOUND-KERNEL-MODULE 254 7.1.4 ALSA-KONFIGURATION 254 7.1.5 DIE GSTREAMER-BIBLIOTHEK 256 7.1.6 KDE- UND GNOME-SOUNDSYSTEM 256 7.2 CD-PLAYER 257 7.3 AUDIO-TOOLS 258 7.3.1 MP3-FORMAT 259 7.3.2 OGG-VORBIS-FORMAT 261 7.3.3 AUDIO-PLAYER 261 7.3.4 REALPLAYER 262 7.3.5 AUDIO-KONVERTER 262 7.3.6 CD-TRACKS EINLESEN (RIPPER) 263 7.4 DVDS UND VIDEO-DATEIEN ANSEHEN 264 7.4.1 TIPPS ZUR INSTALLATION UND KONFIGURATION 264 7.4.2 XINE 265 7.4.3 MPLAYER 266 7.4.4 OGLE UND VIDEOLAN 267 7.4.5 CSS 267 7.4.6 TV-ANWENDUNGEN 268</subfield>
135
+ </datafield>
136
+ <datafield tag="TXT" ind1=" " ind2=" ">
137
+ <subfield code="a">7.5 DIGITALKAMERAS, SCANNER, BILDVERARBEITUNG 268 7.5.1 DIGIKAM (KDE) 269 7.5.2 GTKAM (GNOME) 270 7.5.3 GTHUMB (GNOME) 270 7.5.4 GPHOTO2 271 7.5.5 LESEGERTE FR SPEICHERKARTEN 271 7.5.6 SCANNER 271 7.5.7 SCREENSHOTS ERSTELLEN 274 7.5.8 BILDBETRACHTUNG UND -KONVERTIERUNG 275 7.6 CDS UND DVDS BRENNEN 277 7.6.1 CD- UND DVD-LAUFWERKE KORREKT KONFIGURIEREN 279 7.7 BENUTZEROBERFLCHEN 280 7.7.1 K3B (KDE) 280 7.7.2 NAUTILUS (GNOME) 283 7.7.3 BRENNER-TOOLS 284 KAPITEL 8 TEXTBEARBEITUNG MIT LAT^X UND LYX 295 8.1 EINFHRUNG 296 8.1.1 LATEX UND DIE WICHTIGSTEN HILFSPROGRAMME 297 8.1.2 FEHLERSUCHE IN LATGX-TEXTEN 299 8.1.3 EINFHRUNGSBEISPIEL 301 8.1.4 TETEX 303 8.2 ELEMENTARE LATEX-KOMMANDOS 305 8.2.1 FORMALE DETAILS 305 8.2.2 VORSPANN 306 8.2.3 MAANGABEN 308 8.2.4 STRUKTURIERUNG VON TEXTEN 309 8.2.5 GESTALTUNG DES SCHRIFTBILDS 310 8.2.6 SONDERZEICHEN 311 8.2.7 AKZENTE UND BESONDERE BUCHSTABEN 313 8.2.8 EURO-SYMBOL 313 8.2.9 TABULATOREN 314 8.2.10 TABELLEN 315 8.2.11 GLEITOBJEKTE 320 8.2.12 AUFZHLUNGEN 322 8.2.13 BOXEN UND RAHMEN 323 8.3 GESTALTUNG WISSENSCHAFTLICHER TEXTE 327 8.3.1 DIE TITELSEITE 327 8.3.2 BEARBEITUNG UMFANGREICHER TEXTE 328 8.3.3 INHALTSVERZEICHNIS 330 8.3.4 QUERVERWEISE 331 8.3.5 FUNOTEN 331 8.3.6 DER ANHANG 332 8.3.7 LITERATURVERZEICHNIS 332 8.3.8 STICHWORTVERZEICHNIS 333 8.4 ABBILDUNGEN 335 8.5 MATHEMATISCHE FORMELN 338 8.5.1 KLAMMERN 342 8.5.2 MATRIZEN 342 8.5.3 MATHEMATISCHE SONDERZEICHEN 343 8.5.4 GRIECHISCHE UND KALLIGRAFISCHE BUCHSTABEN 344 8.6 STEUERUNG DES LAYOUTS 344 8.6.1 TRENNUNGEN 344 8.6.2 WORTZWISCHENRUME UND HORIZONTALE LEERRUME 345 8.6.3 ZEILENUMBRUCH UND VERTIKALE LEERRUME 346 8.6.4 FESTER SEITENUMBRUCH 347 8.6.5 EIGENE KOPFZEILEN 347 8.6.6 GLOBALE LAYOUTEINSTELLUNG 348 8.7 BRIEFE SCHREIBEN 350 8.8 FARBEN 354 8.9 TEXTE ROTIEREN 357 8.10 FOLIEN UND PRSENTATIONEN ERSTELLEN 358 8.10.1 FOLIEN ERSTELLEN MIT SEMINAR 358 8.10.2 FOLIEN ERSTELLEN MIT BEAMER 361 8.11 LATX-MAKROS SCHREIBEN 368 8.12 LATEX-DOKUMENTE ANZEIGEN UND WEITERVERARBEITEN 373</subfield>
138
+ </datafield>
139
+ <datafield tag="TXT" ind1=" " ind2=" ">
140
+ <subfield code="a">8.12.1 DVI-DATEIEN ANZEIGEN (XDVI, KDVI) 373 8.12.2 POSTSCRIPT-DOKUMENTE ERZEUGEN (DVIPS) 374 8.12.3 PDF-DOKUMENTE ERZEUGEN 375 8.12.4 HTML-DOKUMENTE ERZEUGEN 377 8.13 METAFONT- UND POSTSCRIPT-SCHRIFTEN 377 8.13.1 METAFONT-SCHRIFTEN 377 8.13.2 POSTSCRIPT-SCHRIFTEN (TYPE-1-FONTS) 379 8.14 LYX - IATEX LEICHT GEMACHT 381 8.14.1 WAS IST LYX (UND WAS IST ES NICHT)? 382 8.14.2 LYX-DOKUMENTE ERSTELLEN, BEARBEITEN UND AUSDRUCKEN 383 8.14.3 TEXTFORMATIERUNG 384 8.14.4 BESONDERE TEXTELEMENTE (TABELLEN, FUNOTEN, FORMELN) 385 8.14.5 MATHEMATISCHE FORMELN 386 8.14.6 LYX-BESONDERHEITEN 388 8.15 AUFGABEN 388 KAPITEL 9 ANWENDUNGSPROGRAMME 391 9.1 HOME OFFICE 392 9.1.1 OPENOFFLCE 392 9.1.2 OPENOFFICE-ALTERNATIVEN 394 9.1.3 ABIWORD 395 9.1.4 DTP MIT SCRIBUS 397 9.1.5 SCITE-TEXTEDITOR 399 9.1.6 GLABELS: AUFKLEBER UND VISITENKARTEN 400 9.1.7 RECHTSCHREIBPRFUNG MIT ISPELL 400 9.1.8 TABELLENKALKULATION 401 9.2 MIND MAPPER 402 9.3 PROJEKTPLANUNG 404 9.3.1 PLANNER 404 9.3.2 TASKJUGGLER 404 9.4 GRAFIKPROGRAMME 405 9.4.1 GIMP - DIE PHOTOSHOP-ALTERNATIVE 405 9.4.2 GNUPLOT 409 9.4.3 LABPLOT 412 9.4.4 XFIG - DER VEKTORZEICHEN-KLASSIKER 413 9.4.5 VEKTORZEICHENPROGRAMM DIA 414 9.5 SYMBOLISCHE MATHEMATIK 415 9.5.1 EULER 415 9.5.2 MUPAD 419 9.6 CHEMIE UND BIOLOGIE 420 9.6.1 PERIODENSYSTEM DER ELEMENTE 420 9.6.2 GENTLE 422 9.7 ELEKTROTECHNIK 425 9.7.1 KRELAIS 425 9.7.2 KLOGIC 426 9.7.3 KTECHLAB 427 9.7.4 CHIPMUNK 428 9.7.5 FREEHDL 429 9.7.6 ELECTRIC 430 9.7.7 EAGLE 431 9.8 DATENBANKEN 433 9.8.1 DESKTOP-WIKI MIT ZIM 433 9.8.2 MYSQL 434 KAPITEL 10 PROGRAMMIERUNG 439 10.1 BIBLIOTHEKEN 440 10.2 PROGRAMME SELBST KOMPILIEREN 441 10.3 ENTWICKLUNGSUMGEBUNGEN 443 10.3.1 XWPE 444 10.3.2 C-FORGE 444 10.3.3 ANJUTA 444 10.3.4 KDEVELOP 445 10.3.5 KOMODO VON ACTIVESTATE 447 10.3.6 GEANY 448 10.3.7 ECLIPSE 449 10.3.8 GAMBAS 450 10.4 PROGRAMMIERUNG MIT PERL 451 10.4.1 HELLO WORLD 453 10.4.2 EIN PROGRAMM AUSFHREN 453 10.4.3 AUFRUF 454 10.4.4 SPRACHKONTEXT 454 10.4.5 VARIABLEN 455</subfield>
141
+ </datafield>
142
+ <datafield tag="TXT" ind1=" " ind2=" ">
143
+ <subfield code="a">10.4.6 OPERATIONEN UND ZUWEISUNGEN 458 10.4.7 KONTROLLSTRUKTUREN 466 10.4.8 REGULRE AUSDRCKE 469 10.4.9 UNTERPROGRAMME 474 10.4.10 DATEIEN 480 10.4.11 REFERENZEN 494 10.4.12 DER PERL-DEBUGGER 497 10.5 AUFGABEN 504 KAPITEL 11 BASISKONFIGURATION 507 11.1 KONFIGURATION DER TEXTKONSOLE 509 11.2 DATUM UND UHRZEIT 510 11.3 SPRACHEINSTELLUNG, INTERNATIONALISIERUNG, UNICODE 510 11.3.1 ZEICHENSTZE 510 11.3.2 LOKALISATION UND ZEICHENSATZ EINSTELLEN 512 11.4 BENUTZER- UND GRUPPENVERWALTUNG 513 11.4.1 BENUTZER 513 11.4.2 GRUPPEN 514 11.4.3 PASSWRTER 515 11.4.4 MANUELLE BENUTZER- UND GRUPPENVERWALTUNG 516 11.5 SYSTEMPROZESSE (DMONEN) 517 11.6 PROZESSE AUTOMATISCH STARTEN (CRONTAB) 518 11.7 DAS /PROC-VERZEICHNIS 519 11.8 SOFTWARE- UND PAKETVERWALTUNG 520 11.8.1 RPM (RPM PACKAGE MANAGER) 521 11.8.2 APT-RPM 524 11.8.3 DPKG UND APT (DEBIAN-PAKETVERWALTUNG) 526 11.8.4 TAR 529 11.9 SYSTEMSTART 529 11.9.1 GRUB 529 11.9.2 LILO 531 11.9.3 INIT-V-PROZESS 531 11.10 LOG-DATEIEN UND KERNEL-MELDUNGEN 537 KAPITEL 12 DAS X WINDOW-SYSTEM 539 12.1 MONITOR-HARDWARE 541 12.2 X STARTEN UND BEENDEN 542 12.3 KONFIGURATION DES X-SERVERS 543 12.3.1 MONITOR-ABSCHNITT 544 12.3.2 DEVICE-ABSCHNITT (GRAFIKKARTE) 545 12.3.3 SCREEN-ABSCHNITT (AUFLSUNG, FARBANZAHL) 545 12.3.4 GRAFIKMODUS SELBST DEFINIEREN 546 12.3.5 FILES-ABSCHNITT 548 12.3.6 MODULES-ABSCHNITT 548 12.3.7 SERVERFLAGS-ABSCHNITT 549 12.3.8 UMGANG MIT XFREE86-INKOMPATIBLEN GRAFIKKARTEN 549 12.3.9 VESA- UND FRAMEBUFFER-TREIBER 550 12.3.10 TASTATUR 551 12.3.11 XMODMAP, XEV, SETXKBMAP 552 12.3.12 MAUS 553 12.3.13 KONFIGURATION IN XF86CONFIG 553 12.4 X.ORG 555 12.5 SCHRIFTARTEN (FONTS) 555 12.6 X-START (WINDOW MANAGER) 556 12.6.1 XDM-KONFIGURATION 557 12.6.2 KDM-KONFIGURATION 557 12.6.3 GDM-KONFIGURATION 558 12.7 XTERM UND ANDERE X-UTILITIES 558 12.7.1 XTERM 558 12.7.2 XHOST 559 KAPITEL 13 LINUX IM LOKALEN NETZ 561 13.1 LOOPBACK, IP-ADRESSEN, NETZMASKE 562 13.2 KONFIGURATION VON NETZWERKKARTEN 565 13.2.1 NETZWERKKONFIGURATION 565</subfield>
144
+ </datafield>
145
+ <datafield tag="TXT" ind1=" " ind2=" ">
146
+ <subfield code="a">13.2.2 MANUELLE INBETRIEBNAHME EINER NETZWERKKARTE 566 13.2.3 KONFIGURATIONSDATEIEN UND -INTERNA 569 13.2.4 NETZWERKFUNKTIONEN TESTEN 571 ANHANG A LITERATUR 575 A.L LINUX UND UNIX 575 A.2 IMEX 575 A.3 ANWENDUNGSPROGRAMME 575 A.4 PROGRAMMIEREN IN C, C++ 576 A.5 PROGRAMMIEREN IN PERL 576 A.6 ADMINISTRATION UND NETZWERK 576 A.7 ALLGEMEINE INFORMATIONEN 577 ANHANG B DIE DVDS ZUM BUCH 579 ANHANG C LSUNGEN DER AUFGABEN 581 C.L SHELL (KAPITEL 4) 581 C.2 LATGX (KAPITEL 8) 584 C.3 PROGRAMMIEREN MIT PERL (KAPITEL 10) 588 SACHREGISTER 595</subfield>
147
+ </datafield>
148
+ <datafield tag="LOC" ind1=" " ind2=" ">
149
+ <subfield code="m">BOOK</subfield>
150
+ <subfield code="a">P0001</subfield>
151
+ <subfield code="b">40</subfield>
152
+ <subfield code="d">TWR12765+4</subfield>
153
+ <subfield code="i">07/8116</subfield>
154
+ <subfield code="n">30</subfield>
155
+ <subfield code="k">20070905</subfield>
156
+ <subfield code="5">987705-50</subfield>
157
+ </datafield>
158
+ <datafield tag="LOC" ind1=" " ind2=" ">
159
+ <subfield code="m">BOOK</subfield>
160
+ <subfield code="a">P0001</subfield>
161
+ <subfield code="b">41</subfield>
162
+ <subfield code="d">TWR12765</subfield>
163
+ <subfield code="i">07/8112</subfield>
164
+ <subfield code="n">20</subfield>
165
+ <subfield code="k">20070905</subfield>
166
+ <subfield code="5">987705-10</subfield>
167
+ </datafield>
168
+ <datafield tag="LOC" ind1=" " ind2=" ">
169
+ <subfield code="m">BOOK</subfield>
170
+ <subfield code="a">P0001</subfield>
171
+ <subfield code="b">41</subfield>
172
+ <subfield code="d">TWR12765+1</subfield>
173
+ <subfield code="i">07/8113</subfield>
174
+ <subfield code="n">20</subfield>
175
+ <subfield code="k">20070905</subfield>
176
+ <subfield code="5">987705-20</subfield>
177
+ </datafield>
178
+ <datafield tag="LOC" ind1=" " ind2=" ">
179
+ <subfield code="m">BOOK</subfield>
180
+ <subfield code="a">P0001</subfield>
181
+ <subfield code="b">41</subfield>
182
+ <subfield code="d">TWR12765+2</subfield>
183
+ <subfield code="i">07/8114</subfield>
184
+ <subfield code="n">20</subfield>
185
+ <subfield code="k">20070905</subfield>
186
+ <subfield code="5">987705-30</subfield>
187
+ </datafield>
188
+ <datafield tag="LOC" ind1=" " ind2=" ">
189
+ <subfield code="m">BOOK</subfield>
190
+ <subfield code="a">P0001</subfield>
191
+ <subfield code="b">41</subfield>
192
+ <subfield code="d">TWR12765+3</subfield>
193
+ <subfield code="i">07/8115</subfield>
194
+ <subfield code="n">20</subfield>
195
+ <subfield code="k">20070905</subfield>
196
+ <subfield code="5">987705-40</subfield>
197
+ </datafield>
198
+ <datafield tag="LOC" ind1=" " ind2=" ">
199
+ <subfield code="m">BOOK</subfield>
200
+ <subfield code="a">P0001</subfield>
201
+ <subfield code="i">07/8122</subfield>
202
+ <subfield code="n">40</subfield>
203
+ <subfield code="k">20070905</subfield>
204
+ <subfield code="5">987705-60</subfield>
205
+ </datafield>
206
+ </record>
207
+ </metadata>
208
+ </record>
209
+ </ListRecords>
210
+ </OAI-PMH>
@@ -0,0 +1,37 @@
1
+ describe Metacrunch::Mab2::AlephMabXmlDocumentFactory do
2
+
3
+ context "with default test xml file" do
4
+ let(:factory) { Metacrunch::Mab2::AlephMabXmlDocumentFactory.new(default_test_xml) }
5
+
6
+ describe ".to_document" do
7
+ subject { factory.to_document }
8
+
9
+ it "should return a Mab2::Document" do
10
+ expect(subject).to be_instance_of(Metacrunch::Mab2::Document)
11
+ end
12
+
13
+ it "should find 2 data fields with tag 070" do
14
+ expect(subject.datafields("070").count).to be(2)
15
+ end
16
+
17
+ it "should find 1 data field with tag 100" do
18
+ expect(subject.datafields("100").first).not_to be_nil
19
+ end
20
+
21
+ it "sub field p of data field 100 is not nil" do
22
+ expect(subject.datafields("100").first.subfields("p").first.value).not_to be_nil
23
+ end
24
+
25
+ it "decodes html entities" do
26
+ expect(subject.datafields("331").subfields("a").values.first).to eq("<<Das>> Linux für Studenten")
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def default_test_xml
34
+ File.read(File.join(RSpec.root, "assets", "aleph_mab_xml", "file1.xml"))
35
+ end
36
+
37
+ end
@@ -0,0 +1,51 @@
1
+ describe Metacrunch::Mab2::Document::Controlfield do
2
+
3
+ describe ".initialize" do
4
+ it "creates a new control field when using String values" do
5
+ field = Metacrunch::Mab2::Document::Controlfield.new("050", "a||b")
6
+ expect(field.tag).to eq("050")
7
+ expect(field.values).to eq(["a", nil, nil, "b"])
8
+ end
9
+
10
+ it "creates a new control field when using Array values" do
11
+ field = Metacrunch::Mab2::Document::Controlfield.new("050", ["a", nil, nil, "b"])
12
+ expect(field.tag).to eq("050")
13
+ expect(field.values).to eq(["a", nil, nil, "b"])
14
+ end
15
+ end
16
+
17
+ describe ".values=" do
18
+ let(:field) { Metacrunch::Mab2::Document::Controlfield.new("050", nil) }
19
+
20
+ it "sets field values using String" do
21
+ field.values = "a||b"
22
+ expect(field.values).to eq(["a", nil, nil, "b"])
23
+ end
24
+
25
+ it "sets field values using Array" do
26
+ field.values = ["a", nil, nil, "b"]
27
+ expect(field.values).to eq(["a", nil, nil, "b"])
28
+ end
29
+
30
+ it "fails on arrays that contain elements longer than one char" do
31
+ expect{
32
+ field.values = ["a", "bc"]
33
+ }.to raise_error(ArgumentError)
34
+ end
35
+
36
+ it "converts array values into String" do
37
+ field.values = [8, nil]
38
+ expect(field.values).to eq(["8", nil])
39
+ end
40
+
41
+ it "converts empty string values for arrays into nil" do
42
+ field.values = ["", nil]
43
+ expect(field.values).to eq([nil, nil])
44
+ end
45
+
46
+ it "converts nil into empty array" do
47
+ field.values = nil
48
+ expect(field.values).to eq([])
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,114 @@
1
+ describe Metacrunch::Mab2::Document do
2
+
3
+ describe "#from_aleph_mab_xml" do
4
+ let(:xml) { default_test_xml }
5
+ let(:document) { Metacrunch::Mab2::Document.from_aleph_mab_xml(xml) }
6
+ subject { document }
7
+
8
+ it "should create a Document from Aleph MAB XML" do
9
+ expect(subject).to be_instance_of(Metacrunch::Mab2::Document)
10
+ end
11
+ end
12
+
13
+ describe ".add_controlfield" do
14
+ let(:document) { empty_document }
15
+
16
+ it "should add control fields" do
17
+ document.add_controlfield(create_controlfield("001", "a|a|"))
18
+ expect(document.controlfield("001").values).to eq(["a", nil, "a", nil])
19
+ end
20
+ end
21
+
22
+ describe ".controlfield" do
23
+ let(:document) { default_test_document }
24
+ subject { document.controlfield("050") }
25
+
26
+ it { is_expected.not_to be_nil }
27
+ it { is_expected.to be_instance_of(Metacrunch::Mab2::Document::Controlfield) }
28
+ it "should contain the correct values" do
29
+ expect(subject.values).to eq(["a", nil, "a", nil])
30
+ end
31
+ end
32
+
33
+ describe ".datafields" do
34
+ let(:document) { default_test_document }
35
+
36
+ context "given tag=100" do
37
+ subject { document.datafields("100") }
38
+
39
+ it "returns only datafields with tag=100" do
40
+ expect(subject.count).to eq(2)
41
+ end
42
+ end
43
+
44
+ context "given tag=100 and ind1=-" do
45
+ subject { document.datafields("100", ind1: "-") }
46
+
47
+ it "returns only datafields with tag=100 and ind1=-" do
48
+ expect(subject.count).to eq(1)
49
+ end
50
+ end
51
+
52
+ context "given tag=100 and ind2=2" do
53
+ subject { document.datafields("100", ind2: "2") }
54
+
55
+ it "returns only datafields with tag=100 and ind2=2" do
56
+ expect(subject.count).to eq(1)
57
+ end
58
+ end
59
+
60
+ context "given tag=100 and ind1=a and ind2=2" do
61
+ subject { document.datafields("100", ind2: "2") }
62
+
63
+ it "returns only datafields with tag=100 and ind1=a and ind2=2" do
64
+ expect(subject.count).to eq(1)
65
+ end
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def empty_document
72
+ Metacrunch::Mab2::Document.new
73
+ end
74
+
75
+ def default_test_document
76
+ document = Metacrunch::Mab2::Document.new
77
+ document.add_controlfield(create_controlfield("LDR", "01234"))
78
+ document.add_controlfield(create_controlfield("050", "a|a|"))
79
+ document.add_controlfield(create_controlfield("052", ["a", nil, "b"]))
80
+
81
+ datafield = create_datafield("100", ind1: "-", ind2: "1")
82
+ datafield.add_subfield(create_subfield("p", "Doe, John"))
83
+ datafield.add_subfield(create_subfield("9", "123456789"))
84
+ document.add_datafield(datafield)
85
+
86
+ datafield = create_datafield("100", ind1: "a", ind2: "2")
87
+ datafield.add_subfield(create_subfield("p", "Sprotte, René"))
88
+ datafield.add_subfield(create_subfield("9", "123456789"))
89
+ document.add_datafield(datafield)
90
+
91
+ datafield = create_datafield("331", ind1: "-", ind2: "1")
92
+ datafield.add_subfield(create_subfield("a", "<<The>> art of MAB processing"))
93
+ document.add_datafield(datafield)
94
+
95
+ document
96
+ end
97
+
98
+ def default_test_xml
99
+ File.read(File.join(RSpec.root, "assets", "aleph_mab_xml", "file1.xml"))
100
+ end
101
+
102
+ def create_controlfield(tag, values)
103
+ Metacrunch::Mab2::Document::Controlfield.new(tag, values)
104
+ end
105
+
106
+ def create_datafield(tag, ind1:nil, ind2:nil)
107
+ Metacrunch::Mab2::Document::Datafield.new(tag, ind1: ind1, ind2: ind2)
108
+ end
109
+
110
+ def create_subfield(code, value)
111
+ Metacrunch::Mab2::Document::Datafield::Subfield.new(code, value)
112
+ end
113
+
114
+ end
@@ -0,0 +1,12 @@
1
+ require "metacrunch/mab2"
2
+
3
+ RSpec.configure do |config|
4
+ end
5
+
6
+ # Helper to provide RSpec.root
7
+ module ::RSpec
8
+ module_function
9
+ def root
10
+ @spec_root ||= Pathname.new(__dir__)
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: metacrunch-mab2
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - René Sprotte
8
+ - Michael Sievers
9
+ - Marcel Otto
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-05-07 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: metacrunch
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '2.1'
29
+ - !ruby/object:Gem::Dependency
30
+ name: htmlentities
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '4.3'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '4.3'
43
+ - !ruby/object:Gem::Dependency
44
+ name: ox
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.1'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '2.1'
57
+ description: MAB2 tools for metacrunch
58
+ email: r.sprotte@ub.uni-paderborn.de
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".travis.yml"
66
+ - Gemfile
67
+ - License.txt
68
+ - Rakefile
69
+ - Readme.md
70
+ - benchmarks/mab2_document_parsing.rb
71
+ - benchmarks/mab2_document_query.rb
72
+ - lib/metacrunch/mab2.rb
73
+ - lib/metacrunch/mab2/aleph_mab_xml_document_factory.rb
74
+ - lib/metacrunch/mab2/cli.rb
75
+ - lib/metacrunch/mab2/document.rb
76
+ - lib/metacrunch/mab2/document/controlfield.rb
77
+ - lib/metacrunch/mab2/document/datafield.rb
78
+ - lib/metacrunch/mab2/document/datafield_set.rb
79
+ - lib/metacrunch/mab2/document/subfield.rb
80
+ - lib/metacrunch/mab2/document/subfield_set.rb
81
+ - lib/metacrunch/mab2/version.rb
82
+ - lib/metacrunch_plugin.rb
83
+ - metacrunch-mab2.gemspec
84
+ - spec/assets/aleph_mab_xml/file1.xml
85
+ - spec/document/aleph_mab_xml_document_factory_spec.rb
86
+ - spec/document/control_field_spec.rb
87
+ - spec/document/document_spec.rb
88
+ - spec/spec_helper.rb
89
+ homepage: http://github.com/ubpb/metacrunch-mab2
90
+ licenses:
91
+ - MIT
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: 2.2.0
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 2.4.6
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: MAB2 tools for metacrunch
113
+ test_files:
114
+ - spec/assets/aleph_mab_xml/file1.xml
115
+ - spec/document/aleph_mab_xml_document_factory_spec.rb
116
+ - spec/document/control_field_spec.rb
117
+ - spec/document/document_spec.rb
118
+ - spec/spec_helper.rb
119
+ has_rdoc: