Πρώτο commit
Αυτό το commit περιλαμβάνεται σε:
commit
8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές
211
content/articles/14/04_rpm.md
Κανονικό αρχείο
211
content/articles/14/04_rpm.md
Κανονικό αρχείο
|
@ -0,0 +1,211 @@
|
|||
+++
|
||||
title = 'RPM και ο κόσμος του.'
|
||||
date = '1999-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Παύλος Παρίσσης(mailto:surfking@ath.forthnet.gr)'
|
||||
issue = ['Magaz 14']
|
||||
issue_weight = 4
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Το παρόν άρθρο έχει σαν σκοπό να δώσει συμβουλές και ιδέες για την αντιμετώπιση μερικών προβλημάτων με την εγκατάσταση προγραμμάτων με το Red Hat Package
|
||||
Manager γνωστό σε όλους σαν rpm.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
**1. Προβλήματα\...και \...Λύσεις**
|
||||
---------------------------------------------------------
|
||||
|
||||
**2. Τι είναι τα Dependencies**
|
||||
-----------------------------------------------------
|
||||
|
||||
**3. Tips**
|
||||
---------------------------------
|
||||
|
||||
**4. Πηγή νέων rpms και πληροφοριών.**
|
||||
------------------------------------------------------------
|
||||
|
||||
**5. Επίλογος**
|
||||
-------------------------------------
|
||||
|
||||
|
||||
### [1. Προβλήματα\...και \...Λύσεις]{#s1}
|
||||
|
||||
Λοιπόν μόλις κατεβάσατε την νέα έκδοση του αγαπημένου σας προγράμματος και τρέχετε να την βάλετε. Αλλά δεν μπορείτε διότι δεν έχετε την νέα έκδοση της Ζ
|
||||
βιβλιοθήκης και το πρόγραμμα την ζητάει επίμονα βγάζοντας σας το μήνυμα: \"failed dependencies Ζlib is needed by Υ-program.i386.rpm\". \"Ε, θα πάω κατεβάσω την
|
||||
νέα έκδοση και τέλος\" λέτε. Αμ δε, μόλις πάτε να την βάλετε ένα σωρό προγράμματα φωνάζουν λέγοντας σας ότι αυτά τρέχουν μόνο με την ήδη υπάρχουσα έκδοση της
|
||||
περιβόητης βιβλιοθήκης βγάζοντας σας το μύνημα:\"Ζlib.1 is needed by control-panel-3.7-4\". \'Ετσι μένετε χωρίς την νέα έκδοση και με ένα πρόβλημα να
|
||||
προστίθεται στην λίστα μαζί με τα άλλα. Αλλά το Linux δεν αφήνει κανέναν παραπονεμένο και σας δίνει την λύση. Για να γίνω πιο κατανοητός θα περιγράψω την λύση
|
||||
με ένα παράδειγμα. \'Εχουμε και λέμε, το Υ-program.i386.rpm πακέτο για να δουλέψει θέλει την Ζlib-1.1.5 βιβλιοθήκη και εσείς έχετε την Zlib-1.0.2 και όταν πάτε
|
||||
να βάλετε την νέα βιβλιοθήκη πολλά άλλα πακέτα αρχίζουν να ουρλιάζουν, τι κάνουμε τώρα;\
|
||||
Μια εύκολη λύση είναι να κατεβάσουμε το source του Υ-program.i386.rpm,θα είναι της μορφής Υ-program.src.rpm., και να \"κτίσουμε\" στην έκδοση της βιβλιοθήκης
|
||||
που είδη έχουμε. Το \"κτίσιμο \" γίνετε με τα παρακάτω βήματα:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
rpm --rebuild Υ-program.src.rpm
|
||||
cd /usr/src/redhat/RPMS/i386
|
||||
rpm -Uvh Υ-program.i386.rpm
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Για να γίνει το κτίσιμο ΠΡΕΠΕΙ να έχετε το devel πακέτο της \"Ζlib\" εάν θέλει μια μόνο βιβλιοθήκη εάν θέλει πάνω από μία τότε ΠΡΕΠΕΙ να έχετε τα devel πακέτα
|
||||
των βιβλιοθηκών αυτών. Επιπλέον ΠΡΕΠΕΙ να έχετε το \"patch-2.5-4.i386.rpm\" ή νεώτερη έκδοση. O παραπάνω τρόπος δούλεψε στο \"licq-0.60-3.i386.rpm\" το οποίο
|
||||
θέλει την \"libstdc++2.9.0\" βιβλιοθήκη και εγώ είχα την \"libstdc++2.8.0\", έτσι κατέβασα το \"licq-0.60-3.src.rpm\" και το έκανα rebuild χωρίς να βάλω την
|
||||
\"libstdc++2.9.0\" βιβλιοθήκη. Δυστυχώς αυτός ο τρόπος δεν δουλεύει σε όλες τις περιπτώσεις. Πιο συγκεκριμένα, εάν ένα πρόγραμμα θέλει την Ζ-1.2lib και εσείς
|
||||
έχετε την Ζ-1.0lib το κτίσιμο δεν πρόκειται να γίνει διότι το πρόγραμμα τρέχει με functions ή άλλα σημαντικά στοιχεία που περιέχονται μόνο στην νέα βιβλιοθήκη.
|
||||
π.χ. το \"gftp-1.12.i386.rpm\" θέλει την 1.1.13 έκδοση των gtk+ και glib βιβλιοθηκών και εγώ είχα την 1.0.6 και όταν πήγα να βάλω τις νέες βιβλιοθήκες φώναζαν
|
||||
3-4 πακέτα. Επιπλέον το rebuild με τις υπάρχουσες βιβλιοθήκες δεν έδινε λύση. Σε αυτή τη περίπτωση έκανα τα παρακάτω:
|
||||
|
||||
1. Απεγκατάσταση των πακέτων που φώναζαν όταν προσπάθησα να βάλω τις νέες βιβλιοθήκες
|
||||
|
||||
"rpm -e paketo"
|
||||
|
||||
2. Απεγκατάσταση των βιβλιοθηκών που είχα ήδη στο σύστημα μου, είναι σίγουρο ότι θα πρέπει να δώσετε \"\--nodeps\"
|
||||
|
||||
"rpm -e --nodeps paketo"
|
||||
|
||||
3. Εγκατάσταση των νέων βιβλιοθηκών
|
||||
|
||||
"rpm -ivh paketo"
|
||||
|
||||
4. rebuild των source(καλύτερα είναι να βρείτε τις νέες εκδόσεις των source) πακέτων που φώναζαν και εγκατάσταση των binary που δημιουργούνται.
|
||||
|
||||
5. Εγκατάσταση του προγράμματος που για χάρη του έκανα τα παραπάνω
|
||||
|
||||
"rpm -ivh paketo"
|
||||
|
||||
Αυτός είναι ένας \"γενικός\" τρόπος ΑΛΛΑ για τις νέες gtk+ και glib βιβλιοθήκες χρειάστηκε ειδική μεταχείριση. Εάν θέλετε πληροφορίες σχετικά με αυτές τις
|
||||
βιβλιοθήκες mail me. Εμένα τα gimp-1.0.1, nessus, usermode, usernet, control-panel και imlib μου έλεγαν ότι τρέχουν μόνο με την υπάρχουσες εκδόσεις των
|
||||
βιβλιοθηκών ΑΛΛΑ παρατήρησα ότι το gimp και nessus τρέχουν με την νέα βιβλιοθήκη χωρίς να τα κάνω rebuild και ούτε να τα βγάλω. Τα άλλα όμως δεν το γλίτωσαν την
|
||||
απομάκρυνση τους και κτίσιμο τους με τις νέες βιβλιοθήκες. \'Αρα, πρώτα δοκιμάζουμε να κάνουμε κτίσιμο με τις υπάρχουσες βιβλιοθήκες και μετά τον 2ο τρόπο.
|
||||
Διότι είναι και χρονοβόρος αλλά και μπορεί να ΜΗΝ δουλέψει για αυτό αναλογιστείτε εάν το ένα και μοναδικό νέο πρόγραμμα που θέλετε αξίζει την φασαρία. Το
|
||||
\"gftp\" δεν την άξιζε αλλά εγώ το έκανα επειδή είχα πεισμώσει να βρω την λύση.
|
||||
|
||||
|
||||
### [2. Τι είναι τα Dependencies]{#s2}
|
||||
|
||||
Σε αυτό το σημείο θα προσπαθήσω να εξηγήσω τι ακριβώς είναι το \"failed dependencies\" και σε ποιες περιπτώσεις εμφανίζεται. Δυστυχώς η εμφάνιση του μηνύματος
|
||||
αυτού δεν σημαίνει πάντα ότι έχουμε το ίδιο πρόβλημα άρα και την ίδια αντιμετώπιση. Μερικές φορές υπάρχει διαφορετική εξήγηση και αντιμετώπιση για την κάθε
|
||||
εμφάνιση του μηνύματος \"failed dependencies\".\
|
||||
Λοιπόν αρχίζουμε. Ο κάθε κατασκευαστής πακέτων rpm μέσα στο spec αρχείο του έχει και μία γραμμή
|
||||
|
||||
"Requires: files..."
|
||||
|
||||
έτσι κάθε πακέτο που έχει αυτή την γραμμή πριν γίνει το install ενεργοποιείτε ένας εσωτερικός αλγόριθμος που ψάχνει να βρει τα αρχεία αυτά στην βάση δεδομένων
|
||||
του rpm. πχ το πακέτο Υ-program.i386.rpm έχει στο spec αρχείο την γραμμή\
|
||||
|
||||
"Requires: perl imlib.so.1 /bin/sh"
|
||||
|
||||
έτσι για να γίνει η εγκατάσταση πρέπει να βρεθούν τα αρχεία αυτά στην βάση δεδομένων του rpm.Τα μήνυμα που παίρνουμε σε αυτές τις περιπτώσεις είναι το ακόλουθο:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
"failed dependencies:
|
||||
imlib.so.1 is needed by Υ-program.i386.rpm"
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Ο ίδιος αλγόριθμος ενεργοποιείτε όταν πάμε να βγάλουμε ή να αναβαθμίσουμε ένα πακέτο στο οποίο βασίζεται ένα άλλο, γίνετε ένας έλεγχος στην βάση δεδομένων για
|
||||
να δει εάν με την απομάκρυνση ή την αναβάθμιση του πακέτου θα υπάρξει παραβίαση των dependencies εάν κάποιο άλλο πακέτο απαιτεί κάποια αρχεία που υπάρχουν μόνο
|
||||
στο πακέτο που προσπαθούμε να απομακρύνουμε ή να αναβαθμίσουμε. Το μήνυμα που παίρνουμε όταν πάμε να βγάλουμε ή να αναβαθμίσουμε το \"Fsail-1.2\" πακέτο που
|
||||
περιέχει το \"Fsail.so.1\" αρχείο το οποίο το χεριάζετε ένα άλλο πακέτο για να δουλέψει είναι το:\
|
||||
|
||||
"Fsail.so.1 is need by Gdesk-1.1"
|
||||
|
||||
Το μήνυμα \"failed dependencies Ζlib is needed by Υ-program.i386.rpm\" δεν σημαίνει απαραίτητα ότι δεν έχετε την συγκεκριμένη βιβλιοθήκη αλλά ότι έχετε μια πιο
|
||||
νέα/παλιά βιβλιοθήκη από την οποία το πακέτο κτίστηκε και για αυτό το κτίσιμο με τις υπάρχουσες βιβλιοθήκες δίνει μερικές φορές την λύση. Διότι μπορούμε να
|
||||
κτίσουμε το πακέτο έναντι των βιβλιοθηκών που ήδη έχουμε και το πακέτο να μπορεί να δουλεύει με αυτές.\
|
||||
Για παράδειγμα όταν πήγα να βάλω ένα πακέτο και μου έλεγε ότι θέλει π.χ. \"libkdecore.so.1\" έδινα ένα \"rpm -qp \--requires paketo\" και μου έλεγε \"kdelibs
|
||||
=1.0 και libkdecore.so.1\...\...\.....\" Το \"libkdecore.so.1\" αρχείο περιέχεται μέσα στο \"kdelibs-1.0\" και εγώ είχα \"kdelibs-1.1\" και φυσικά το
|
||||
\"libkdecore.so.2\" και όχι το \"libkdecore.so.1\" έτσι δεν δούλευε το πακέτο , ούτε το \--nodeps έδινε λύση. Η λύση δόθηκε κάνοντας rebuild το πακέτο. Για αυτό
|
||||
το πρόβλημα υπάρχει εξήγηση, όπως σε όλα τα προβλήματα:) Το ότι το spec αρχείο λεει \"kdelibs =1.0\" μπορεί να σημαίνει ότι ο packager έχει το KDE 1.0 στο
|
||||
σύστημα του και με αποτέλεσμα να αναφέρετε σε αυτή την έκδοση της βιβλιοθήκης το spec αρχείο. Διότι το RPM κάνει \"link\" στις υπάρχουσες βιβλιοθήκες που
|
||||
υπάρχουν στο σύστημα όταν το πακέτο κτίζετε, Θυμάστε για το \"licq\" και την \"libstdc++ 2.9.0\" βιβλιοθήκη που όπως αποδείχθηκε δεν χρειαζόταν; Προφανώς το
|
||||
licq κτίστηκε σε σύστημα με την 2.9.0 έκδοση της \"libstdc++\" βιβλιοθήκης. Επιπλέον πολλές φορές νέες εκδόσεις βιβλιοθηκών είναι ασύμβατες προς στις πίσω
|
||||
εκδόσεις πχ η \"Gtk+\" βιβλιοθήκη ειδικά η 1.2 έκδοση στην οποία έχουν διαγράψει μερικές λειτουργίες δεν είναι συμβατή με την 1.0 έκδοση, έτσι το rpm επίτηδες
|
||||
δημιουργεί \"links\" με ένα συγκεκριμένο πακέτο διότι δουλεύει μόνο με αυτήν την έκδοση του πακέτου, θυμάστε το \"gftp\" και την \"gtk+1.13\" βιβλιοθήκη που με
|
||||
τις υπάρχουσες βιβλιοθήκες δεν έδινε λύση το κτίσιμο;
|
||||
|
||||
Πολλές φορές το \"failed dependencies\" είναι \"false alarm\". Τι θέλω να πω, όπως αποδείχθηκε δύο πακέτα δουλεύουν χωρίς προβλήματα με τις νέες βιβλιοθήκες
|
||||
παρόλο ότι έλεγαν το αντίθετο. Για παράδειγμα, το \"XFGreekFNTS-1.1.noarch.rpm\" όταν πάμε να το εγκαταστήσουμε με \"-ivh\" σε S.u.S.E. 5.3 & 6.0 λεει ότι θέλει
|
||||
το \"XFree86 3.3.1\" αλλά εάν δώσουμε \"-ivh \--nodeps\" δουλεύει μια χαρά. Με απλά λόγια κάντε ένα \"rpm -Uvh \--nodeps paketo\" πριν κάνετε οτιδήποτε μπορεί
|
||||
το πρόγραμμα να δουλέψει, ΠΡΟΣΟΧΗ μόνο σε προγράμματα και ΟΧΙ σε βιβλιοθήκες και άλλα σημαντικά πακέτα πχ modutils, initscripts κλπ. \'Αλλωστε το \"\--nodeps\"
|
||||
το χρησιμοποιούμε σπάνια διότι αγνοεί τα dependencies ενός πακέτου και είναι 99% σίγουρο ότι το πακέτο ΔΕΝ θα δουλέψει:(. Η συγκεκριμένη περίπτωση μπορεί να
|
||||
έχει την εξήγηση της στο γεγονός ότι το rpm μερικές φορές δεν κάνει σωστά τις συγκρίσεις με τις εκδόσεις τα \>,\< και = μερικές φορές δεν τα αντιλαμβάνεται
|
||||
σωστά.
|
||||
|
||||
Όλα αυτά είναι τεχνικά θέματα που εμάς τους απλούς θνητούς μας μπερδεύουν και σε τελική ανάλυση δεν θέλουμε να μας απασχολούν. Για αυτό υπάρχουν άνθρωποι σαν
|
||||
τον Ryan Weaver πού λύνουν τέτοιου είδους προβλήματα. Μια βόλτα από <http://www.redhat.com> και θα δείτε τις δουλείες του.
|
||||
|
||||
|
||||
### [3. Tips]{#s3}
|
||||
|
||||
- Όταν κατεβάζετε ένα πακέτο και πριν το κάνετε εγκατάσταση δώστε\
|
||||
|
||||
"rpm -K --nopgp paketo "
|
||||
|
||||
\
|
||||
και πρέπει να πάρετε \"size md5 OK\" εάν πάρετε διάφορα errors ΞΑΝΑ κατεβάστε το από άλλον ftp server διότι το πακέτο έχει αλλοιωθεί και ΔΕΝ πρόκειται να
|
||||
δουλέψει σωστά.
|
||||
|
||||
- Πριν κάνετε εγκατάσταση ή αναβάθμιση ή διαγραφή ενός πακέτο δώστε\
|
||||
|
||||
"rpm -ivh --test onoma_paketou" ή
|
||||
"rpm -Uvh --test onoma_paketou" ή
|
||||
"rpm -e --test onoma_paketou"
|
||||
|
||||
\
|
||||
εάν δεν βγάλει τίποτα τα σκυλιά είναι δεμένα και προχωράτε άφοβα στην εγκατάσταση ή αναβάθμιση ή διαγραφή.
|
||||
|
||||
- Όταν κάνετε διάφορα κόλπα με βιβλιοθήκες ΝΑ ΕΧΕΤΕ ΠΑΝΤΑ τις υπάρχουσες εκδόσεις σε μια γωνία.
|
||||
|
||||
- Εάν θέλετε κατεβάστε το purp (πρέπει να έχετε τα ncurses) δουλεύει σε φιλικό γραφικό περιβάλλον και έχει δύο χαρακτηριστικά που είναι ιδιαίτερα χρήσιμα
|
||||
1. μπορείς και βλέπεις τα script που εκτελούνται πριν την εγκατάσταση και μετά την απομάκρυνση του πακέτου.
|
||||
2. βλέπεις τα dependencies ενός πακέτου.
|
||||
|
||||
τα παραπάνω γίνονται και με εντολές \"rpm -q \--provides \--requires \--scripts paketo\" αλλά είναι πολύ χρήσιμο όταν θέλετε να \"ρωτήσετε\" και δείτε πολλά
|
||||
διαφορετικά πακέτα χωρίς να είστε υποχρεωμένοι να θυμάστε το ακριβές όνομα τους. ΠΡΟΣΟΧΗ ΜΗΝ ΚΑΝΕΤΕ INSTALL, UPGRADE ΚΑΙ ERASE από το purp διότι αγνοεί τα
|
||||
dependencies ενός πακέτου.
|
||||
|
||||
- Όταν κάντε εγκατάσταση ενός πακέτου να δίνετε \"-Uvh\", ξέρω\...ξέρω το \"-U\" είναι για αναβάθμιση αλλά εάν δώσετε \"-i\" αντί \"-U\" θα δημιουργηθεί
|
||||
πρόβλημα όταν έχετε την προηγούμενη έκδοση του πακέτου εγκαταστημένη. Για αυτό δίνετε ΠΑΝΤΑ \"-U\" έχετε δεν έχετε το προηγούμενης έκδοσης πακέτο το νέο θα
|
||||
μπει κανονικά. Εγώ όταν πήγα να βάλω την νέα έκδοση του \"ghostscript\" έδωσα \"-i\" αντί \"-U\" και η \"gs\" εντολή δεν δούλευε καθόλου.
|
||||
|
||||
- Μην κατεβάζετε σαν τρελοί ότι νέο βγει. Να βάζετε νέα πακέτα μόνο και όταν οι εφαρμογές σας το απαιτούν ή οι νέες έχουν bug fixes. Αναφέρομαι σε βιβλιοθήκες
|
||||
OXI σε προγράμματα.
|
||||
|
||||
- Αν αντιμετωπίζετε προβλήματα με πακέτα ρίξτε ένα mail στο κατασκευαστή του rpm διότι πολλές φορές έχουν bugs, με \"rpm -qip paketo\" βλέπουμε τις
|
||||
πληροφορίες ενός πακέτου που ΔΕΝ έχουμε κάνει εγκατάσταση.
|
||||
|
||||
- Πολλές φορές κάποια πακέτα θα χρειάζονται ειδική μεταχείριση όπως XFree86, Gnome, KDE, βιβλιοθήκες κλπ. για αυτό είναι καλό πριν κάνετε κάτι να διαβάζετε τα
|
||||
docs που είδη υπάρχουν στο σύστημα σας ή εάν δεν υπάρχουν στις σχετικές σελίδες των πακέτων αυτών.
|
||||
|
||||
- \'Οταν ένα πακέτο Α απαιτεί το Β και το Β με την σειρά του απαιτεί το Α ο σωστός τρόπος εγκατάστασης είναι να δώσετε \"rpm -ivh \*.rpm\" μέσα σε ένα
|
||||
κατάλογο που έχετε ΜΟΝΟ αυτά τα δύο πακέτα. Με \"\*\" το rpm ψάχνει στον κατάλογο και λύνει τα dependencies που υπάρχουν μεταξύ των πακέτων αυτών.
|
||||
|
||||
- Διαβάστε το manual του rpm για περισσότερα.
|
||||
|
||||
**Ο 2ος ΤΡΟΠΟΣ ΔΟΥΛΕΨΕ ΣΤΟ ΣΥΣΤΗΜΑ ΜΟΥ (REDHAT 5.1) ΔΕΝ ΕΓΓΥΩΜΑΙ ΟΤΙ ΘΑ ΔΟΥΛΕΨΕΙ ΣΕ ΟΛΑ ΤΑ DISTRIBUTIONS**
|
||||
|
||||
|
||||
### [4. Πηγή νέων rpms και πληροφοριών.]{#s4}
|
||||
|
||||
Το rpmfind.net είναι μία καλή πηγή νέων rpm η οποία διαφέρει από τους άλλους τόπους επειδή σου λεει το κάθε πακέτο τι αρχεία παρέχει και τι απαιτεί και εάν δεν
|
||||
έχεις ένα αρχείο που το απαιτεί το πακέτο που θέλετε να κατεβάσετε, κάνοντας κλικ σε αυτό σε πάει στο πακέτο που το έχει! Επιπλέον τα πακέτα είναι και σε
|
||||
αλφαβητική σειρά κάτι που ελαττώνει το χρόνο της αναζήτησης ενός συγκεκριμένου πακέτου. Πριν κατεβάσετε πακέτα \>1.5-2ΜΒ κάντε μία αναζήτηση στο
|
||||
<http://ftpsearch.lycos.com> είναι σχεδόν σίγούρο ότι θα τα βρείτε σε έναν \"κοντινό\" ftp server. Η RedHat έχει μια λίστα για rpm στην οποία μπορείτε να βρείτε
|
||||
σημαντικές πληροφορίες για rpm πακέτα <http://archive.redhat.com> Τέλος το <http://www.rpm.org> είναι ένα καλό σημείο να ξεκινήσετε για να βρείτε πακέτα και
|
||||
πληροφορίες.
|
||||
|
||||
|
||||
### [5. Επίλογος]{#s5}
|
||||
|
||||
Ελπίζω να ξεδιάλυνα μερικά πράγματα σχετικά με τα dependencies και να έδωσα μερικές ιδέες για την σωστή εγκατάσταση των πακέτων rpm. Πάντως όταν παίζετε με
|
||||
βγάλε-βάλε βιβλιοθηκών να είστε ιδιαίτερα προσεκτικοί για να μην κάνετε καμία ζημία. Εγώ έκανα αρκετές αλλά ήμουν τυχερός και τα κόλπα πού έκανα δούλεψαν και
|
||||
κατάφερα να επαναφέρω το σύστημα στην σωστή κατάσταση. Αλλά δεν είναι κάθε μέρα Κυριακή:)
|
||||
|
||||
Πριν κλείσω αυτό το άρθρο θέλω να ευχαριστήσω τον Γιάννη Γαλανομάτη για τις σημαντικές παρατηρήσεις του και τον Troy Engel για τις πολύτιμες συμβουλές που μου
|
||||
έδωσε.
|
||||
|
Φόρτωση…
Προσθήκη πίνακα
Προσθήκη υπερσυνδέσμου
Παράθεση σε νέο ζήτημα