[precedente] Ricomp. Kernel - Copertina - Staroffice 4 [successivo]

Articoli


Tips & Tricks

Ecco i Tips & Tricks del mese di Giugno 1998 per il Pluto Journal. Come al solito questi trucchetti sono stati presi: dai news group dedicati a Linux e ad unix, da amici o di mia invenzione... in ogni caso li usate a vostro rischio e pericolo. Comunque se volete contattarmi potete sempre spedirmi una mail.


GCC 2.8 e X11

È ormai noto che X11 e GCC 2.8 non vanno d'amore e d'accordo al primo impatto. Questo è causato dal cambiamento di alcune variabili nel file ioport.c (file appartenente al kernel di Linux). Per risolvere questo problema basta prendere il file ioport.c della versione del tuo kernel e sostituirlo con quello di una versione sperimentale del kernel. O ancora meglio basta passare ad un kernel sperimentale con tutti i pro e i contro.


Scheda di Rete ALN-201

Per far funzionare questa scheda di rete sotto Linux è solamente necessario compilare il kernel con il supporto per la scheda di rete NE2000. Sembra strano ma funziona.


Cambiare gruppo a più file

Questo script è particolarmente utile per chi amministra delle macchine Linux. Molto spesso, quando gli utenti iniziano a diventare sempre più numerosi, si creano nuovi gruppi per dividere, secondo una certa logica, i vari utenti. Però il passaggio dal gruppo vecchio a quello nuovo non è così semplice. Oltre a cambiare il file /etc/passwd e /etc/group si deve cambiare anche il gruppo a tutti i file che appartengo agli utenti che sono passati dal vecchio al nuovo gruppo. Per farlo molto rapidamente basta eseguire

find / -group "old group name" -print | xargs chgrp "new group name"
Meglio di così... ah, e senza le "

Da Macintosh a Unix...

Per chi deve portare un testo da Dos a Unix la cosa è molto semplice, si utilizza il comando dos2unix (è comunque uno script). Ma per chi deve portare un file di testo Machintosh su Unix? dos2unix logicamente non va bene, ma il comando tr sì. Ecco uno script niente male:

#  #Title: mac2unix
#  #Lives: /usr/scripts/mac2unix
#  #Funct: Translate Mac line endings for unix ones
#  #Usage: prompt>mac2unix {filename}
#  #
#  #!/usr/bin/ksh
#
#  #Clear up to start!
#
#  /bin/touch "$1".m
#  /bin/rm "$1".m
#  
#  #Move the Mac file to new file with dot m extention
#
#  /bin/mv "$1" "$1".m
#
#  #Pick up the file and throw it through translate changing
#  #Mac returns (ascii 15) to unix newlines (ascii 12)
#
#  /bin/cat "$1".m | /bin/tr '\015' '\012' > "$1"
#
#exit
ed ecco la sua controparte:
#Title: unix2mac
#  #Lives: /usr/scripts/unix2mac
#  #Funct: Translate unix line endings for mac ones
#  #Usage: prompt>unix2mac {filename}
#  #
#  #!/usr/bin/ksh
#
#  #Clear up to start!
#
#  /bin/touch "$1".u
#  /bin/rm "$1".u
#  
#  #Move the Unix file to new file with dot u extention
#
#  /bin/mv "$1" "$1".u
#
#  #Pick up the file and throw it through translate changing
#  #Mac returns (ascii 15) to unix newlines (ascii 12)
#
#  /bin/cat "$1".u | /bin/tr '\012' '\015' > "$1"
#
#exit
Ehm.. togliete i # all'inizio di ogni riga, grazie.

... e da unix a dos e viceversa

In questo caso non è uno script ma un programma C

#include 

#define CR 13
#define LF 10

int main(int nargs, char *arg[]){
	int state = 0;
	int c;
	unsigned long n=1;
	int newline = 0, echo = 0;

	while((c=fgetc(stdin)) != EOF){
		switch(state){
		case 1: /* seen Carriage Return */
			switch(c){
			case LF:
				state = 0;
			case CR:
				newline = 1;
				break;
			default:
				newline = echo = 1;
				state = 0;
			}
			break;
		case 2: /* seen Line Feed */
			switch(c){
			case CR:
				state = 0;
			case LF:
				newline = 1;
				break;
			default:
				newline = echo = 1;
				state = 0;
			}
			break;
		default: /* any character besides LF or CR */
			switch(c){
			case CR:
				state = 1;
				break;
			case LF:
				state = 2;
				break;
			default:
				echo = 1;
			}
		}
		if(newline){
			if(fputc('\n', stdout) == EOF){
				fprintf(stderr,"Output Error at Character %d\n", n);
				return -1;
			}
			n++;
			newline = 0;
		}
		if(echo){
			if(fputc(c, stdout) == EOF){
				fprintf(stderr,"Output Error at Character %d\n", n);
				return -1;
			}
			n++;
			echo = 0;
		}
	}
	return 0;
}

Finger su ogni utente

Volete fare un finger che inserisca in un file il risultato del comando finger effettuato su ogni utente della vostra macchina? No problema (ma più che altro: a cosa vi serve?)

#!/bin/csh
setenv IGNORETHESE "ftp|lost+found|foo|bar"

foreach i (`ls /home | egrep -v "$IGNORETHESE"`)
finger $i >> /tmp/finger.log
end

Programma che ritorna la data corrente

Ecco un programma in C che ritorna la data corrente. Utile per chi vuole fare un programma di contabilità o di appuntamenti.

#include 
#include 

int main()
{
  struct tm *tmptr;
  time_t lt;
  char buff[256];
 
  time(<);
  tmptr=localtime(<);
  strftime(buff,256,"%A %I:%M %p", tmptr);
  printf("%s\n",buff);
}

Quanta memoria fisica?

Se state realizzando un clone del top ecco un metodo veloce per sapere quanta memoria fisica ha la macchine su cui il vostro programma girerà, e senza passare dalla directory /proc

amout = sysconf (_SC_PHYS_PAGES) * getpagesize ();
Ah, la funzione C sysconf() a seconda del valore passato ritorna cose molto interessanti. (man 3 sysconf)

Compilare il nuovo EGCS

Stufi del GCC 2.7.x.? Ecco come compilare i sorgenti del nuovo compilatore EGCS.

Prendere il file .tgz da http://www.cygnus.com/egcs.

Scompattate i sorgenti ed entrare nella directory dove essi risiedono. A questo punto eseguire lo script/utility configure (lo si trova nella directory dei sorgenti. Nel caso il sistema non lo trovasse eseguire ./configure. Create, ora, una directory chiamata objdir.

Eseguite:
cd objdir
./configure
make bootstrap
make install

A questo punto alcune persone dicono che sono state costrette a rimuovere i seguenti programmi (i nomi fanno riferimento ai .rpm della RedHat):
gcc-2.7.2.1-2
gcc-c++-2.7.2.1-2
gcc-objc-2.7.2.1-2
libg++-devel-2.7.1.4-5

Ora eseguite:

rm -f /usr/bin/gcc /usr/bin/cc
ln -s /opt/egcs-1.0.2/bin/gcc /usr/bin/gcc
ln -s /usr/bin/gcc /usr/bin/cc
ln -s /opt/egcs-1.0.2/bin/g++ /usr/bin/g++
rm -f /usr/bin/g++ /usr/bin/c++
ln -s /opt/egcs-1.0.2/bin/g++ /usr/bin/g++
ln -s /usr/bin/g++ /usr/bin/c++
rm -f /lib/cpp
ln -s /opt/egcs-1.0.2/lib/gcc-lib/i586-pc-linux-gnulibc1/egcs-2.90.27/cpp /lib/cpp

Ah, logicamente /opt/egcs-1.0.2 è la directory dove è stato installato il egcs in questo esempio. Voi potreste averlo installato in un altro posto tramite l'opzione --prefix=/path/dove/installare del comando configure.

Per maggiori info andate al sito http://egcs-www.cygnus.com/install/index.html

HP DJ e salvare il toner

Ecco il codice d'escape per far entrare la stampante HP DJ 520 in ecomode:

Ec(s!Q
oppure
027 040 115 049 081
oppure
1B 28 73 31 51

Telnet e DISPLAY

Stanchi di dover settare a mano voi il display quando effettuate un telnet su un'altra macchina? Allora ecco lo script-soluzione:

#!/bin/sh
xtty=`tty | cut -c6-15`
who | grep -w $xtty | tr -d '()' | awk '{ print $6 }'  

Versione del kernel

Volete sapere che versione del kernel sta' usando la macchina che state utilizzando?

cat /proc/version
oppure
cat /proc/sys/kernel/osrelease

PGP 5.0

È inglese

> I compiled up PGP 5.0i for Unix on a Solaris 2.5.1 box. When I run pgpk
> -g to generate a new key pair I get to the end of the question asking
> but after a bit of time generating the pair the process ends with the
> message:
> 
> Received signal 10.
> 
> And a pair is not generated.  Any ideas?
> 
> 

This is an aligment problem in pgpMem.c. 
If you are using cc do not use the -fast option. 
If you're using gcc use the __attribute__ ((aligned (8))) 
for the struct MemHeader. Here it is:

struct MemHeader
{
#if DEBUG_FIND_LEAKS
        LeakItem        leakItem;      /* Information for the leaks package */
#endif
        size_t          size;          /* Size of the user area of the block *
/
#if DEBUG_MEM_HEAD_MAGIC
        ulong           magic;           /* Trailing magic number */
#endif
} __attribute__ ((aligned (8)));

O anche il fix
My fix is at

http://discus.anu.edu.au/~geoffk/pgp50i-memalign.diff.

Convertire i nomi dei file da maiuscolo a minuscolo

Se dovete convertire i nomi di alcuni files da MAIUSCOLO a minuscolo (DOS?) queste due alternative fanno al caso vostro.

- for i in `find . -type f -print` ; do  mv $i `echo $i | tr '[A-Z]' '[a-z]'` ;
- perl -e 'foreach (<*>) { rename $_, lc $_ }'

conio.h

Per chi proviene dal mondo dos come programmatore, non trovare conio.h è un po' come la pasta scotta da magiare. Beh, ecco la pasta ben cotta:
http://sunsite.unc.edu/pub/Linux/libs/ui/linux-conio-1.02.tgz


Portare a zero la dimensione di un file.

A pensarci su sembra una operazione abbastanza lunga e noiosa: si deve cancellare, ricreare, settare i permessi ed il proprietario. Ma in verità è molto semplice. Basta eseguire un cat di /dev/null sul file desiderato. Ad esempio, prima della ``cura''

-rwxrwxr-x   1 michel   michel    1720320 May 26 21:51 a.out
e dopo la ``cura'' (cat /dev/null > a.out)
-rwxrwxr-x   1 michel   michel          0 May 26 21:51 a.out

/var/log/wtmp

Questo file contiene i dati di chi si è collegato (via console) sulla propria macchina. La cosa brutta è che tende a diventare sempre più grande riducendo quindi lo spazio disponibile. Se necessitate di spazio libero, sapete chi cancellare.


/var/catman

In questa directory sono contenuti tutte le pagine di manuale consultate sul sistema, quindi formattate e pronte per essere visualizzate o stampate. Il fatto è che il sistema non cancella il contenuto e quindi lo spazio su disco non viene mai liberato.


Anche per questo mese i Tips&Tricks sono finiti. Come al solito non mi prendo la responsabilità di nulla nel caso qualche cosa non funzionasse, ma vi sarei grato se mi spedite una mail se avete qualche cosa da farmi notare su qualche T&T. Le mail pervenutemi saranno proposte integralmente il mese prossimo.

di ZioBudda


[precedente] Ricomp. Kernel - Copertina - Staroffice 4 [successivo]