Ας υποθέσουμε πως θέλετε να κάνετε upgrade ένα μέρος μόνο των εγκατεστημένων πακέτων που έχετε. Για παράδειγμα έχετε εγκαταστήσει το mate και θέλετε να το κάνετε upgrade χωρίς όμως ένα μαζικό apt-get update ή ακόμη χειρότερα apt-get dist-upgrade.
Αυτό που θέλουμε είναι
1) ποιά πακέτα του mate έχουν εγκατασταθεί?
αυτό δεν είναι και πολύ δύσκολο, το dpkg -l μπορεί να μας δείξει τι υπάρχει εγκατεστημένο και με ένα pipe σε grep να διαλέξουμε τα mate πακέτα
dpkg - l | grep mate
2)κατάλληλη μορφή της λίστας με τα εγκατεστημένα πακέτα
το πρόβλημα είναι πως θα έχουμε τα αποτελέσματα σε μια μορφή που δεν είναι χρήσιμη για να την περάσουμε στο apt
ii libmate 1.2.0-2~wheezy MATE library
ii libmate-common 1.2.0-2~wheezy MATE library (common files)
ii libmatecanvas 1.2.0-1 powerful object-oriented display engine
τη λύση δίνει η γνωστή-άγνωστη AWK η οποία μπορεί να πάρει input μια συμβολοσειρά και να τη χωρίσει σε πεδία, από τα οποία εμείς θα της πούμε τι να δείξει
awk '{print $2}'
στην περίπτωση του output μας από το dpkg, το $1 αντιστοιχεί στο "ii", το $2 στο εκάστοτε όνομα του πακέτου, το $3 στην έκδοση κ.ο.κ
αν τώρα κάνουμε pipe το ouput του dpkg και της grep στην AWK, θα έχουμε:
dpkg -l | grep mate | awk '{print $2}'
το οποίο δίνει
libmate
libmate-common
libmatecanvas
πολύ καλύτερα αλλά μπορεί να βελτιωθεί κιάλλο!
Από το manual της AWK βλέπουμε πως μπορούμε να αλλάξουμε την εξορισμού "ανά σειρά" απάντηση στο input που της δίνουμε σε ότι θέλουμε, οπότε στην περίπτωσή μας βολεύει το κενό (space)->
awk 'BEGIN {ORS = " "} ; { print $2 }'
όπου ORS = το πως θα ενώσει τις απαντήσεις στο output η AWK
οπότε τώρα η one-liner εντολή μας γίνεται:
dpkg -l | grep mate | awk 'BEGIN {ORS = " " } ; { print $2 }'
το output της οποίας πλέον είναι:
libmate-common mate-applets mate-applets-common ...κοκ
3)apt-get install
Άρα τώρα μπορούμε να χρησιμοποιήσουμε την παραπάνω one-liner σε συνδυασμό με το apt ως εξής:
apt-get install `dpkg -l | grep mate- | awk 'BEGIN {ORS = " " } ; { print $2 }'`
προσέξτε πως έβαλα την one-liner μέσα σε δύο " ` ", αυτό ισοδυναμεί με το output της one-liner δλδ πρώτα θα εκτελεστεί ότι έχουμε στα "`" και μετά θα περαστεί στο apt!
Μετά αρκεί να πατήσουμε ένα "y" και enter :]
Μερικές φορές ακόμη και σε κάποια εγκατάσταση linux, μπορεί να παγώσει το desktop και να μην αποκρίνεται ούτε το πληκτρολόγιο, ούτε το ποντίκι. Οι φίλες/φίλοι που έχουν windows σίγουρα έχουνε άφθονες τέτοιες εμπειρίες, αλλά συμβαίνει και στο linux!
Το καλό με το linux όμως είναι πως υπάρχουν τρόποι αντιμετώπισης του "παγώματος" χάρις στην αρχιτεκτονική του που επιτρέπει στο σύστημα να παγώνει το desktop, αλλά πίσω από αυτό, τα υπόλοιπα να παίζουν κανονικά!
Τι κάνουμε λοιπόν?? Ο σκοπός μας είναι είτε να ξεκολλήσουμε το σύστημα, είτε να κάνουμε επανεκκίνηση χωρίς το "κουμπί"!. Δοκιμάζουμε με την παρακάτω σειρά:
1) πατάμε Alt-Backspace για να κάνουμε restart το γραφικό περιβάλλον
2) πατάμε Alt-F1 για να ανοίξει ένα text-mode και από εκεί να κάνουμε login στην κονσόλα με τα στοιχεία του χρήστη μας. Μετά με sudo bash ή su (αν έχουμε ενεργοποιημένο root χρήστη) μπορούμε να κάνουμε ένα κανονικό reboot χωρίς κίνδυνο να χαθούν αρχεία ή να προκαλέσουμε βλάβη στο σύστημα αρχείων.
3) Αν τα παραπάνω δεν πετυχαίνουν, το κουμπί SysRq (ή αλλιώς Print Screen) μπορεί να μας βοηθήσει να κάνουμε μια καθαρή επανεκκίνηση:
Πατάμε διαδοχικά:
* alt+sysrq+r (επαναφορά του πληκτρολογίου)
* alt+sysrq+s (συγχρονισμός αρχείων)
* alt+sysrq+e (στέλνει το σήμα τερματισμού σε όλες τις διεργασίες εκτός από την "init")
* alt+sysrq+i (στέλνει το σήμα "kill" σε όλες τις διεργασίες εκτός από την "init")
* alt+sysrq+u (κάνει mount το σύστημα αρχείων σε read-only mode, οπότε δε θα γίνει fsck μετά το reboot)
* alt+sysrq+b (κάνει επανεκκίνηση. Χωρίς τα προηγούμενα βήματα κάνει "hard reset").
Σημαντικό είναι να δίνουμε μερικά δευτερόλεπτα μεταξύ των παραπάνω βημάτων, ώστε να ολοκληρώνονται. Για παράδειγμα ο τερματισμός όλων των διεργασιών μπορεί να πάρει ..λιγάκι.
Τα γράμματα μπορούμε εύκολα να τα θυμόμαστε:
"Reboot System Even If Utterly Broken"
Ένας άλλος τρόπος:
"Raising Skinny Elephants Is Utterly Boring"
Μερικές φορές είναι αναγκαίο να σταματήσετε το simplenews από το να στείλει μερικές χιλιάδες mails, λόγω λάθους ή αναθεώρησης στο περιεχόμενο του newsletter που έχετε ήδη αρχίσει να στέλνετε ή για οποιοδήποτε λόγο. Αυτό είναι εφικτό απευθείας από τη βάση δεδομένων:
-
Πάρτε bakcup την βάση δεδομένων του site ή κάντε copy το table simplenews_mail_spool. Για πλήρες backup μπορείτε να χρησιμοποιήσετε το module Backup and Migrate .
- Ανοίχτε το phpMyAdmin, και βρείτε το table simplenews_newsletter table στη βάση του drupal site σας.
-
Ψάξτε για newsletters που είναι σε κατάσταση αποστολής από το field s_status το οποίο θα είναι 1. Μπορείτε να τρέξετε το:
SELECT * FROM simplenews_newsletter WHERE s_status = 1
Από τα αποτελέσματα διαλέξτε ποιο newsletter θέλετε να σταματήσετε, αντιστοιχίζοντας το node id του (μπορείτε να βρείτε το node id κάνοντας edit το εν λόγω newsletter από το admin panel) -
Αλλάξτε το s_status από 1 (αποστέλλεται) είτε σε 0 ( δεν στάλθηκε ) ή 2 ( σταλμένο ).
-
Αδειάστε το simplenews_mail_spool table ( εδώ είναι όλα τα μέηλ που βρίσκονται στην ουρά για αποστολή )
Μπορείτε να το κάνετε με TRUNCATE:
TRUNCATE TABLE simplenews_mail_spool
Έτοιμο!
Τι γίνεται όταν πας να κάνεις extract ένα αρχείο zip και σου επιστρέφει την μούτζα:
unsupported compression method 99??
Καταρχήν τι είναι αυτό το compression method 99?
Ψάχνοντας βρήκα την παρακάτω λίστα που υποστηρίζει το winzip στις πρόσφατες εκδόσεις του:
Enhanced deflate - Compression Method 9
bzip2 - Compression Method 12
WavPack - Compression Method 97
PPMd - Compression Method 98
LZMA - Compression Method 14
Jpeg compression - Compression Method 96
AES encryption - Compression Method 99
Άρα πρόκειται για κρυπτογραφημένο zip αρχείο, το οποίο δεν ανοίγει με το zip utility μιας και δεν υποστηρίζει αυτή την μέθοδο 99.
Η λύση είναι η εγκατάσταση του p7zip:debian: apt-get install p7zip-full
centos/RHEL/fedora: yum install p7zip
και μετά μπορούμε να κάνουμε7z x -pPASSWORD archive.zip
Στο checkout αν κάποιος θέλει να πάει ένα βήμα πίσω έχει δύο επιλογές
1)να πάει από την checkout bar την οποία κανείς δεν βλέπει
2)να πατήσει το back button του browser
για κάποιο λόγο δεν υπάρχει διακριτό back button στο virtuemart οπότε καλό είναι να το ..βάλουμε
Πως???
Ανοίγουμε λοιπόν το αρχείο administrator/components/com_virtuemart/html/checkout.index
βρίσκουμε τη γραμμή με "<input type="submit" class="button" name="formSubmit" value="<?php echo $VM_LANG->_('PHPSHOP_CHECKOUT_NEXT');?> >>" />"
και πριν από αυτή βάζουμε:
<?php
$step_now = (int)$_GET['checkout_last_step'];
if ($step_now >1) {
echo '<a href="index.php?page=checkout.index&checkout_last_step='.($step_now-1).'&option=com_virtuemart&Itemid=1" class="checkout_back">'.$VM_LANG->_('back').'</a>';
}?>
Ας πούμε πως θέλουμε να δείξουμε την ημερομηνία σε κάτι του στυλ:
Τετάρτη, 4 Νοεμβρίου 2010
Χωρίς να βάλουμε κάποιο plugin ή module, αρκεί να κάνουμε τα εξής:
1) εγκαθιστούμε τα ελληνικά στον φάκελο languages
2) βάζουμε τον παρακάτω κώδικα στο template εκεί που θέλουμε ή ίσως με κάποιο mod_custom
jimport('joomla.utilities.date');
$config =& JFactory::getConfig();
$date = new JDate('now',$config->getValue('config.offset'));
echo $date->toFormat(JText::_('DATE_FORMAT_LC'));
και είμαστε έτοιμοι!
Ως γνωστόν στο Virtuemart δεν έχει από default κάποιο module ώστε να μπορούμε να έχουμε κάποια επιλογή όπως "παραλαβή από το χώρο μας" ή κάτι τέτοιο και ο πελάτης να προχωρά στο επόμενο βήμα.
Μια λύση είναι να πάρουμε ένα υπάρχον module και να το φέρουμε στα μέτρα μας ώστε να κάνει τη δουλειά που θέλουμε.
Πάμε λοιπόν στο shipvalue!
To εν λόγω module λειτουργεί με τη λογική όταν το σύνολο των αγορών είναι μικρότερο της τιμής που έχουμε δώσει στο order total value, τότε να χρεώνεται με την τιμή που δώσαμε στο Shipping Charge.
Tα βήματα είναι:
1) πηγαίνουμε στη διαχείριση του Virtuemart->admin->configuration και επιλέγουμε το tab "shipping". Από τη λίστα μαρκάρουμε το "standard shipping based on order totals".
2) μετά στο store->list shipping modules, πηγαίνουμε στο "shipvalue" και πατάμε το "Configure Ship Method".
3) στις ιδιότητες του module σβήνουμε τυχόν τιμές που μπορεί να υπάρχουν και βάζουμε
Order total value 1:10000 (ή κάποιο πολύ μεγάλο ποσό που ποτέ δε θα φτάσουν οι αγορές ενός πελάτη)
και Shipping charge 1: 0
4) ανοίγουμε το αρχείο
administrator/components/com_virtuemart/classes/shipping/shipvalue.php
και βρίσκουμε την 1η γραμμή που έχει το
$html .= "<label for=\"$shipping_rate_id\">Standard Shipping:
όπου αλλάζουμε το "Standard Shipping" με το μήνυμα που θέλουμε να εμφανίζεται στο checkout.
Ωραία, πας να στήσεις ένα android dev environment και όλα πάνε καλά μέχρι που ..δεν μπαίνει με τίποτα το ADT plugin του android για το eclipse με κάτι δυσνόητα errors του στυλ
Cannot complete the install because one or more required items could not be found.
Software being installed: Android Development Tools 12.0.0.v201106281929-138431(com.android.ide.eclipse.adt.feature.group 12.0.0.v201106281929-138431)
Missing requirement: Android Development Tools 12.0.0.v201106281929-138431(com.android.ide.eclipse.adt.feature.group 12.0.0.v201106281929-138431)
requires 'org.eclipse.wst.sse.core 0.0.0' but it could not be found
Το πρόβλημα βρίσκεται στο ότι δεν υπάρχει στο preferences->install/update->additional software sites καμία καταχώρηση του ίδιου του eclipse.
H λύση είναι να πάμε να βάλουμε manually ανάλογα με την έκδοση του eclipse που έχουμε, ένα από τα παρακάτω:
v3.7.x Indigo - http://download.eclipse.org/releases/indigo
v3.6.x Helios - http://download.eclipse.org/releases/helios
v3.5.x Galileo - http://download.eclipse.org/releases/galileo
v3.4.x Ganymede - http://download.eclipse.org/releases/ganymede
στο μέλλον αρκεί να αλλάξει κάποιος το λινκ ανάλογα με το release που έχει
Για να ενεργοποιήσουμε τον root user σε ένα σύστημα linux (πχ ubuntu, mint κλπ) το οποίο δουλεύει με sudo, τα βήματα είναι πολύ απλά:
1) ανοίγουμε ένα τερματικό
2) πατάμε sudo -i (γράφουμε το password του χρήστη μας όταν ζητηθεί)
3) πατάμε passwd root και γράφουμε το νέο pass του root
et voila! έχουμε ενεργό τον root χρήστη :)