https://wiki.gacq.com/api.php?action=feedcontributions&user=WikiSysop&feedformat=atomgacq wiki - Contribuciones del usuario [es]2024-03-29T11:49:14ZContribuciones del usuarioMediaWiki 1.29.2https://wiki.gacq.com/index.php?title=Patentes_de_Software&diff=3047Patentes de Software2011-04-21T02:48:19Z<p>WikiSysop: /* Otras lecturas */</p>
<hr />
<div>=Introducción=<br />
<br />
Las leyes de copyright regulan la posibilidad de restringir la distribución de software. Las patentes, en cambio, estipulan limitaciones sobre el desarrollo. Ambos marcos son regulaciones jurídicas diferentes en su naturaleza y consecuencias. Por eso, toda persona, organización social, empresa pequeña, mediana o grande, interesadas en el desarrollo de software, sea libre o privativo, debe entender las consecuencias de las patentes sobre ideas y mecanismos implementados en software y cómo defenderse de ellas.<br />
<br />
Las patentes sobre ideas aplicadas al software:<br />
# fijan monopolios sobre ideas abstractas.<br />
# frenan la innovación al permitir concesiones no implementadas, esto evita de hecho que la implementación sea realizada por un tercero sin autorización de quien detenta la patente<br />
# impiden la formación de mercados competitivos ofreciendo a las grandes corporaciones un fuerte control sobre ciertos espacios estratégicos de mercado.<br />
# impiden la interoperabilidad, aumentando la dependencia de un único proveedor.<br />
# trasladan transversalmente sus efectos negativos a otras áreas de la economía [2].<br />
<br />
En este trabajo rastrearemos la historia y el concepto de patentes, analizaremos el marco actual de las negociaciones a nivel global y las razones por las cuales se debe sostener hasta las últimas consecuencias la lucha contra la posibilidad de patentar ideas aplicadas al software.<br />
<br />
=Conceptos Básicos=<br />
<br />
Una patente es un derecho monopólico exclusivo que un gobierno otorga a una empresa, individuo u organización por una invención, definida como un producto o proceso que ofrece una nueva manera de hacer algo, o una nueva solución técnica a un problema. Ese monopolio tiene una duración limitada que suele ser de 20 años. Vencido el plazo estipulado por ley, la invención entra al Dominio Público.<br />
<br />
En síntesis, así como el copyright es el marco que ampara la “expresión” de las ideas (en libros, pinturas, canciones, etc), las patentes amparan las “aplicaciones” de ideas, en tanto tengan uso práctico sean útiles, novedosas, tengan alguna característica nueva que no se conozca en el cuerpo existente de su ámbito de aplicación. Para que la patente sea otorgada, debe estar presente un “paso inventivo” que no podría ser fácilmente deducido por una persona con conocimientos medios del ámbito técnico, es decir, no deben ser “aplicaciones obvias”.<br />
<br />
El sistema preve que las patentes sean concedidas por oficinas nacionales de patentes, o por alguna oficina regional, como es el caso de la Oficina Europea de Patentes. A nivel internacional, existe el “Tratado de Cooperación en materia de Patentes” administrado por la OMPI , que estipula la presentación de una única solicitud internacional de patentes, que tiene el mismo efecto que las solicitudes nacionales presentadas en los países signatarios.<br />
<br />
Cuando pensamos en “patentes de software”, debemos recordar que el software en sí no es otra cosa que procedimientos lógicos implementados. En consecuencia, las patentes de software son monopolios otorgados sobre estos procedimientos. Es importante comprender que esos monopolios no cubren la implementación en sí, que está amparada por copyright, sino el procedimiento lógico subyacente a la implementación.<br />
<br />
Por lo tanto, una patente de software crea un monopolio sobre un método de cálculo específico, poniendo a las leyes matemáticas y reglas lógicas en manos de las empresas que tengan capacidad de solicitar y defender patentes, y eventualmente privando a la sociedad de los beneficios de su corpus de conocimiento adquirido, ya que el registro de patente no implica la inmediata obligación de implementar la idea.<br />
<br />
Existen muchas ideas patentadas que no llegan a ser efectivamente desarrolladas ni explotadas comercialmente por quien las registra. Aquel que que detenta tal monopolio se asegura así que otro tampoco pueda desarrollarlas, al menos por un tiempo estipulado por ley.<br />
<br />
'''Informacion extraida de [http://www.bea.org.ar Patentamiento de Software - Blog de Beatriz Busaniche]'''<br />
<br />
=Otras lecturas=<br />
*http://es.wikipedia.org/wiki/Patente_de_software<br />
*http://swpat.ffii.org/<br />
*http://www.nosoftwarepatents.com/es/m/intro/index.html</div>WikiSysophttps://wiki.gacq.com/index.php?title=Estandares_Libres&diff=3046Estandares Libres2011-04-21T02:44:43Z<p>WikiSysop: </p>
<hr />
<div>= Estándares Libres =<br />
<br />
Los Estándares Libres garantizan la interoperatividad de los agentes tecnológicos, y con ello contribuyen de forma decisiva a la libertad del conocimiento.<br />
<br />
Un estándar libre es aquel que no es propiedad de nadie, y que puede ser utilizado por todos. Cualquiera puede inspeccionarlo y sugerir cambios, que se incluirán por consenso.<br />
<br />
Los Estándares Libres se refieren tanto a especificaciones de protocolos de comunicación y almacenamiento de datos como a lenguajes de programación, sistemas de codificación, etc. El uso de Estándares Libres está en el centro del éxito de Internet y la WWW, que hacen uso extensivo de ellos.<br />
<br />
Los Estándares Libres amplían las oportunidades de la industria en general, y aportan estabilidad a largo plazo.<br />
<br />
Además, suponen una plataforma de compatibilidad sobre la que es posible la libre competencia, en beneficio siempre del usuario final, y en fomento del progreso y la innovación eficaz, evitando la formación de monopolios.<br />
<br />
Por otra parte garantizan la independencia y seguridad de los estados y las administraciones públicas, de las empresas e instituciones y de los ciudadanos, al eliminar cualquier dependencia de terceros ya que aportan una base común de accesibilidad a la información y datos almacenados.<br />
<br />
Con el sistema de estandarización libre o abierta se garantiza la libertad de disposición del conocimiento para todos, ya que supone un consenso estable y documentado de comunicación y trabajo.</div>WikiSysophttps://wiki.gacq.com/index.php?title=Conocimiento_Libre&diff=3045Conocimiento Libre2011-04-21T02:40:51Z<p>WikiSysop: </p>
<hr />
<div>= Conocimiento Libre =<br />
<br />
El Conocimiento Libre es aquel que puede adquirirse libremente, sin requerir ningún permiso, que puede compartirse con otros, puede modificarse de acuerdo a las necesidades, y permite que esas modificaciones se distribuyan de nuevo para beneficiar a todos.<br />
<br />
Para que el conocimiento sea accesible a todos es necesario profundizar en aspectos éticos, técnicos y legales, investigando las posibles vías de transición hacia una sociedad del saber más igualitaria.<br />
<br />
El Conocimiento Libre equilibra las desigualdades entre las zonas ricas y pobres, porque garantiza el acceso a la cultura y a la información, y ofrece la oportunidad a cualquier persona de participar activamente en la sociedad.<br />
<br />
El progreso en el conocimiento se ve impulsado por el modelo libre, en el que toda la información fluye con rapidez y facilidad. Los nuevos descubrimientos e ideas se aprovechan y asimilan sin mayor obstáculo. La eficacia es otro rasgo característico; la posibilidad de modificación y contribución instantáneas garantizan la calidad y depuración de las ideas. Se crea un debate del conocimiento que es imposible en modelos no libres o privativos.<br />
<br />
En la educación los beneficios son muy importantes, dado que el conocimiento es accesible a todos con independencia de sus recursos, fomentándose la participación equitativa.<br />
<br />
La independencia, piedra angular de la libertad, está garantizada por el modelo libre del conocimiento, que propicia la no dependencia de un proveedor, ya que la información y el saber pasan a ser un bien público sin propietarios.<br />
<br />
=Otras lecturas=<br />
*[http://www.vialibre.org.ar/wp-content/uploads/2007/03/mabi.pdf MABI: Monopolios Artificiales sobre Bienes Intangibles]<br />
*[http://www.boell-latinoamerica.org/download_es/Libro_biopolitica.pdf ¿Un mundo patentado? La privatización de la vida y el conocimiento]<br />
*[http://www.vialibre.org.ar/wp-content/uploads/2006/11/prohibidopensarpropiedadprivada.pdf Prohibido Pensar, Propiedad Privada]<br />
*[http://vialibre.org.ar/arcopy.pdf Argentina Copyleft. La crisis del modelo de derecho de autor y las prácticas para democratizar la cultura]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Patentes_de_Software&diff=3044Patentes de Software2011-04-21T02:37:03Z<p>WikiSysop: /* Conceptos Básicos */</p>
<hr />
<div>=Introducción=<br />
<br />
Las leyes de copyright regulan la posibilidad de restringir la distribución de software. Las patentes, en cambio, estipulan limitaciones sobre el desarrollo. Ambos marcos son regulaciones jurídicas diferentes en su naturaleza y consecuencias. Por eso, toda persona, organización social, empresa pequeña, mediana o grande, interesadas en el desarrollo de software, sea libre o privativo, debe entender las consecuencias de las patentes sobre ideas y mecanismos implementados en software y cómo defenderse de ellas.<br />
<br />
Las patentes sobre ideas aplicadas al software:<br />
# fijan monopolios sobre ideas abstractas.<br />
# frenan la innovación al permitir concesiones no implementadas, esto evita de hecho que la implementación sea realizada por un tercero sin autorización de quien detenta la patente<br />
# impiden la formación de mercados competitivos ofreciendo a las grandes corporaciones un fuerte control sobre ciertos espacios estratégicos de mercado.<br />
# impiden la interoperabilidad, aumentando la dependencia de un único proveedor.<br />
# trasladan transversalmente sus efectos negativos a otras áreas de la economía [2].<br />
<br />
En este trabajo rastrearemos la historia y el concepto de patentes, analizaremos el marco actual de las negociaciones a nivel global y las razones por las cuales se debe sostener hasta las últimas consecuencias la lucha contra la posibilidad de patentar ideas aplicadas al software.<br />
<br />
=Conceptos Básicos=<br />
<br />
Una patente es un derecho monopólico exclusivo que un gobierno otorga a una empresa, individuo u organización por una invención, definida como un producto o proceso que ofrece una nueva manera de hacer algo, o una nueva solución técnica a un problema. Ese monopolio tiene una duración limitada que suele ser de 20 años. Vencido el plazo estipulado por ley, la invención entra al Dominio Público.<br />
<br />
En síntesis, así como el copyright es el marco que ampara la “expresión” de las ideas (en libros, pinturas, canciones, etc), las patentes amparan las “aplicaciones” de ideas, en tanto tengan uso práctico sean útiles, novedosas, tengan alguna característica nueva que no se conozca en el cuerpo existente de su ámbito de aplicación. Para que la patente sea otorgada, debe estar presente un “paso inventivo” que no podría ser fácilmente deducido por una persona con conocimientos medios del ámbito técnico, es decir, no deben ser “aplicaciones obvias”.<br />
<br />
El sistema preve que las patentes sean concedidas por oficinas nacionales de patentes, o por alguna oficina regional, como es el caso de la Oficina Europea de Patentes. A nivel internacional, existe el “Tratado de Cooperación en materia de Patentes” administrado por la OMPI , que estipula la presentación de una única solicitud internacional de patentes, que tiene el mismo efecto que las solicitudes nacionales presentadas en los países signatarios.<br />
<br />
Cuando pensamos en “patentes de software”, debemos recordar que el software en sí no es otra cosa que procedimientos lógicos implementados. En consecuencia, las patentes de software son monopolios otorgados sobre estos procedimientos. Es importante comprender que esos monopolios no cubren la implementación en sí, que está amparada por copyright, sino el procedimiento lógico subyacente a la implementación.<br />
<br />
Por lo tanto, una patente de software crea un monopolio sobre un método de cálculo específico, poniendo a las leyes matemáticas y reglas lógicas en manos de las empresas que tengan capacidad de solicitar y defender patentes, y eventualmente privando a la sociedad de los beneficios de su corpus de conocimiento adquirido, ya que el registro de patente no implica la inmediata obligación de implementar la idea.<br />
<br />
Existen muchas ideas patentadas que no llegan a ser efectivamente desarrolladas ni explotadas comercialmente por quien las registra. Aquel que que detenta tal monopolio se asegura así que otro tampoco pueda desarrollarlas, al menos por un tiempo estipulado por ley.<br />
<br />
'''Informacion extraida de [http://www.bea.org.ar Patentamiento de Software - Blog de Beatriz Busaniche]'''<br />
<br />
=Otras lecturas=<br />
*http://es.wikipedia.org/wiki/Patente_de_software<br />
*http://swpat.ffii.org/<br />
*http://lpf.ai.mit.edu/Patents/patents.html<br />
*http://www.nosoftwarepatents.com/es/m/intro/index.html</div>WikiSysophttps://wiki.gacq.com/index.php?title=MediaWiki:Mainpage&diff=3035MediaWiki:Mainpage2010-10-08T04:27:35Z<p>WikiSysop: Página creada con 'Portada'</p>
<hr />
<div>Portada</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2804Installing Debian on Dell M12102009-02-12T19:10:24Z<p>WikiSysop: Revertidas las ediciones realizadas por SitboLipas (Talk); a la última edición de WikiSysop</p>
<hr />
<div>[[Imagen:XPS-foto.jpg|right]]<br />
'''My laptop was stolen :( Unmaintained page from June 2007'''<br />
<br />
'''Now mainteined by me!. This guide is really usefull!...''' --[[Usuario:Yaco|Yaco]] 19:52 19 dic 2007 (ART) <br />
<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || driver linux-uvc only support V4L2<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:green" | Works ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || working for other people<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || working for other people<br />
|-<br />
! S-Video output || style="background:green" | Works ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:green" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:green" | Works || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
=Specifications=<br />
*Dell XPS M1210 Laptop - AR$ 5.200 (1.700 U$S) - July 2006<br />
**Intel Core 2 Duo Processor T2300 @ 1.66GHz<br />
**1GB of Dual Channel DDR2 memory<br />
**12.1" Widescreen WXGA (1280 x 800) display with TrueLife<br />
**256MB NVIDIA GeForceTM Go 7400 TurboCache<br />
**60GB 5400RPM SATA hard drive<br />
**8x DVD/CD Burner (DVD+/-RW)<br />
**Webcam<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build - Kernel source from sid<br />
<br />
==Detected by preinstaled windows (the last words of)==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=Base installation=<br />
;Debian GNU/Linux Lenny (testing) Daily Build Debian Installer<br />
Kernel built in module for lan interface does not work, I used an old Etch (testing) net installer<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Free drivers (nv)==<br />
;Installed during xserver installation<br />
<br />
==Proprietary drivers (nvidia)==<br />
;Only for 3D acceleration and other advanced features, if not use free driver, you'll feel better.<br />
<br />
===Installation===<br />
apt-get install nvidia-kernel-2.6.18-4-686 nvidia-glx nvidia-settings nvidia-xconfig<br />
<br />
==Configuration==<br />
===Automatic===<br />
nvidia-xconfig<br />
<br />
===Manually===<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
apt-get install firmware-ipw3945 ipw3945d ipw3945-modules-`uname -r`<br />
<br />
;Optional<br />
apt-get install network-manager<br />
<br />
network-manager-gnome requires users to be in the group 'netdev' for it to work. If users aren't in the group 'netdev' then it won't automatically appear, and work, in the Notification Area.<br />
<br />
If you're looking for a manual installation procedure see the [[ipw3945 driver manual installation for Debian Etch]]<br />
<br />
=WebCam - Only work with v4l2=<br />
==Manual==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
<br />
==Using packages (not working?)==<br />
apt-get install linux-uvc-source libpt-plugins-v4l2<br />
m-a prepare<br />
m-a a-i linux-uvc<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
<br />
==Testing Webcam==<br />
<br />
===Using Mplayer===<br />
Just run this and you should see the webcam image:<br />
$ mplayer -v tv:// -tv device=/dev/video0:driver=v4l2:outfmt=yuy2 -vc rawyuy2 -fps 15 -vo x11<br />
===Using Luvcview===<br />
Using luvcview we can take pics and record video.<br />
<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20070512.tar.gz<br />
tar -xvf luvcview-20070512.tar.gz<br />
cd luvcview-20070512<br />
make<br />
sudo make install<br />
luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
Now you can use the buttons (a bit ugly) or the following hotkeys while running the program:<br />
<br />
*'''n''' -> BRIGHTNESS UP<br />
*'''b''' -> BRIGHTNESS DOWN<br />
*'''x''' -> CONTRAST UP<br />
*'''w''' -> CONTRAST DOWN<br />
*'''c''' -> SATURATION UP<br />
*'''v''' -> SATURATION DOWN<br />
*'''z''' -> GAIN UP<br />
*'''a''' -> GAIN DOWN<br />
*'''r''' -> SHARPNESS UP<br />
*'''e''' -> SHARPNESS DOWN<br />
*'''s''' -> SCREENSHOT<br />
*'''p''' -> RECORD A VIDEO<br />
*'''l''' -> RESET<br />
*'''q''' -> QUIT<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=Frontal multimedia buttons=<br />
Configure the frontal buttons using [http://lineak.sourceforge.net/ LineAK].<br />
apt-get install lineak<br />
<br />
Then you should add button configurations in '''/etc/lineakd.def'''. Add the following lines to the end of the file:<br />
<br />
# Dell XPS M1210<br />
[DXPS]<br />
brandname = "Laptop/notebook"<br />
odelname = "Dell XPS and Inspiron 9100"<br />
[KEYS]<br />
Play = 162<br />
Previous = 144<br />
Next = 153<br />
Stop = 164<br />
VolumeUp = 176<br />
VolumeDown = 174<br />
Mute = 160<br />
[END KEYS]<br />
[END DXPS]<br />
# end Dell XPS/I9100 Laptop<br />
<br />
Now do:<br />
<br />
$ lineakd -c DXPS<br />
<br />
Then you can attach a command to the different buttons. Make your changes in '''$HOME/.lineakd/lineakd.conf'''. This is just an example using Amarok (media player) and Aumix for volume control:<br />
<br />
Mute = "aumix -v 0"<br />
Next = "amarok -f"<br />
Play = "amarok -t"<br />
Previous = "amarok -r"<br />
Stop = "amarok -s"<br />
VolumeDown = "aumix -v -5"<br />
VolumeUp = "aumix -v +5"<br />
<br />
Finally, you have to run the lineak daemon:<br />
<br />
$ lineakd&<br />
<br />
Add this to any start script (like .xinitrc) to run it on start up.<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
*[http://criadoindomable.wordpress.com/2008/01/09/modem-para-las-dell-inspiron-en-ubuntu-710/ Modem para las Dell Inspiron en Ubuntu 7.10]<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://www.centre-cired.fr/forum/article441.html<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]<br />
<br />
==Others==<br />
*[http://mundogeek.net/archivos/2007/04/23/temperatura-de-portatiles-dell-en-ubuntu/ Temperatura de portátiles Dell en Ubuntu]<br />
*[http://mundogeek.net/archivos/2007/04/23/desactivar-touchpad-mientras-se-escribe-en-linux/ Desactivar touchpad mientras se escribe en Linux]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2781Installing Debian on Dell M12102009-01-11T15:01:03Z<p>WikiSysop: </p>
<hr />
<div>[[Imagen:XPS-foto.jpg|right]]<br />
'''My laptop was stolen :( Unmaintained page from June 2007'''<br />
<br />
'''Now mainteined by me!. This guide is really usefull!...''' --[[Usuario:Yaco|Yaco]] 19:52 19 dic 2007 (ART) <br />
<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || driver linux-uvc only support V4L2<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:green" | Works ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || working for other people<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || working for other people<br />
|-<br />
! S-Video output || style="background:green" | Works ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:green" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:green" | Works || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
=Specifications=<br />
*Dell XPS M1210 Laptop - AR$ 5.200 (1.700 U$S) - July 2006<br />
**Intel Core 2 Duo Processor T2300 @ 1.66GHz<br />
**1GB of Dual Channel DDR2 memory<br />
**12.1" Widescreen WXGA (1280 x 800) display with TrueLife<br />
**256MB NVIDIA GeForceTM Go 7400 TurboCache<br />
**60GB 5400RPM SATA hard drive<br />
**8x DVD/CD Burner (DVD+/-RW)<br />
**Webcam<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build - Kernel source from sid<br />
<br />
==Detected by preinstaled windows (the last words of)==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=Base installation=<br />
;Debian GNU/Linux Lenny (testing) Daily Build Debian Installer<br />
Kernel built in module for lan interface does not work, I used an old Etch (testing) net installer<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Free drivers (nv)==<br />
;Installed during xserver installation<br />
<br />
==Proprietary drivers (nvidia)==<br />
;Only for 3D acceleration and other advanced features, if not use free driver, you'll feel better.<br />
<br />
===Installation===<br />
apt-get install nvidia-kernel-2.6.18-4-686 nvidia-glx nvidia-settings nvidia-xconfig<br />
<br />
==Configuration==<br />
===Automatic===<br />
nvidia-xconfig<br />
<br />
===Manually===<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
apt-get install firmware-ipw3945 ipw3945d ipw3945-modules-`uname -r`<br />
<br />
;Optional<br />
apt-get install network-manager<br />
<br />
network-manager-gnome requires users to be in the group 'netdev' for it to work. If users aren't in the group 'netdev' then it won't automatically appear, and work, in the Notification Area.<br />
<br />
If you're looking for a manual installation procedure see the [[ipw3945 driver manual installation for Debian Etch]]<br />
<br />
=WebCam - Only work with v4l2=<br />
==Manual==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
<br />
==Using packages (not working?)==<br />
apt-get install linux-uvc-source libpt-plugins-v4l2<br />
m-a prepare<br />
m-a a-i linux-uvc<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
<br />
==Testing Webcam==<br />
<br />
===Using Mplayer===<br />
Just run this and you should see the webcam image:<br />
$ mplayer -v tv:// -tv device=/dev/video0:driver=v4l2:outfmt=yuy2 -vc rawyuy2 -fps 15 -vo x11<br />
===Using Luvcview===<br />
Using luvcview we can take pics and record video.<br />
<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20070512.tar.gz<br />
tar -xvf luvcview-20070512.tar.gz<br />
cd luvcview-20070512<br />
make<br />
sudo make install<br />
luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
Now you can use the buttons (a bit ugly) or the following hotkeys while running the program:<br />
<br />
*'''n''' -> BRIGHTNESS UP<br />
*'''b''' -> BRIGHTNESS DOWN<br />
*'''x''' -> CONTRAST UP<br />
*'''w''' -> CONTRAST DOWN<br />
*'''c''' -> SATURATION UP<br />
*'''v''' -> SATURATION DOWN<br />
*'''z''' -> GAIN UP<br />
*'''a''' -> GAIN DOWN<br />
*'''r''' -> SHARPNESS UP<br />
*'''e''' -> SHARPNESS DOWN<br />
*'''s''' -> SCREENSHOT<br />
*'''p''' -> RECORD A VIDEO<br />
*'''l''' -> RESET<br />
*'''q''' -> QUIT<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=Frontal multimedia buttons=<br />
Configure the frontal buttons using [http://lineak.sourceforge.net/ LineAK].<br />
apt-get install lineak<br />
<br />
Then you should add button configurations in '''/etc/lineakd.def'''. Add the following lines to the end of the file:<br />
<br />
# Dell XPS M1210<br />
[DXPS]<br />
brandname = "Laptop/notebook"<br />
odelname = "Dell XPS and Inspiron 9100"<br />
[KEYS]<br />
Play = 162<br />
Previous = 144<br />
Next = 153<br />
Stop = 164<br />
VolumeUp = 176<br />
VolumeDown = 174<br />
Mute = 160<br />
[END KEYS]<br />
[END DXPS]<br />
# end Dell XPS/I9100 Laptop<br />
<br />
Now do:<br />
<br />
$ lineakd -c DXPS<br />
<br />
Then you can attach a command to the different buttons. Make your changes in '''$HOME/.lineakd/lineakd.conf'''. This is just an example using Amarok (media player) and Aumix for volume control:<br />
<br />
Mute = "aumix -v 0"<br />
Next = "amarok -f"<br />
Play = "amarok -t"<br />
Previous = "amarok -r"<br />
Stop = "amarok -s"<br />
VolumeDown = "aumix -v -5"<br />
VolumeUp = "aumix -v +5"<br />
<br />
Finally, you have to run the lineak daemon:<br />
<br />
$ lineakd&<br />
<br />
Add this to any start script (like .xinitrc) to run it on start up.<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
*[http://criadoindomable.wordpress.com/2008/01/09/modem-para-las-dell-inspiron-en-ubuntu-710/ Modem para las Dell Inspiron en Ubuntu 7.10]<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://www.centre-cired.fr/forum/article441.html<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]<br />
<br />
==Others==<br />
*[http://mundogeek.net/archivos/2007/04/23/temperatura-de-portatiles-dell-en-ubuntu/ Temperatura de portátiles Dell en Ubuntu]<br />
*[http://mundogeek.net/archivos/2007/04/23/desactivar-touchpad-mientras-se-escribe-en-linux/ Desactivar touchpad mientras se escribe en Linux]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2780Installing Debian on Dell M12102009-01-11T14:57:20Z<p>WikiSysop: Revertidas las ediciones realizadas por WikiSysop (Talk); a la última edición de EltelTsitr</p>
<hr />
<div>[http://mahohmie.qsh.eu/resource711.htm showcase video missoula mt] [http://huruple.qsh.eu/20081231-ngage-video.htm ngage video format] [http://lofaako.strefa.pl/article1821.html scarey movie site myspace.com] [http://caraines.qsh.eu/csednrv.htm aaron clip mtv neville video] [http://dronoubr.0lx.net/movie-trailesr.html movie trailesr] <br />
[http://bukgetert.0lx.net/article-775.htm ass and thong video] [http://tulilre.strefa.pl/2008-12-28-mega-man-music.html mega man music video] [http://qasletop.is-the-boss.com/mexsitrel.html picture of lady pirate] [http://sakonze.qsh.eu/henbrzr-1906.html secretary sex video] [http://dronoubr.0lx.net/arnold-schwarzenegger.html arnold schwarzenegger video clip] <br />
[http://zelgetgo.0lx.net/new501.htm los angeles train crash video] [http://hencnac4t.is-the-boss.com/news-river-past-screen-2008-12-25.html river past screen recorder serial] [http://relquaca.is-the-boss.com/20081229-pirate-dinner.html pirate dinner adventure] [http://acsitzar.0lx.net/sitemap.html site] [http://vihencbr.0lx.net/mitch-hedburg.html mitch hedburg video clips] <br />
[http://sedplxca.is-the-boss.com/march-madness-06-2009-01-05.htm march madness 06 torrent] [http://licawol.strefa.pl/sitemap.htm link] [http://mahohmie.qsh.eu/resource43.htm pretty woman movie] [http://fademon.0lx.net/article-1392.htm rowan atkinson live video] [http://betheres.qsh.eu/comment-1952.htm mcdonalds video game] <br />
[http://golxando.0lx.net/1085013430.html joe kanes digital video essentials] [http://dronoubr.0lx.net/latin-movie-ass.html latin movie ass] [http://lofaako.strefa.pl/article1950.html movie waiting to exhale] [http://tulilre.strefa.pl/2008-12-26-avatar-video-game.html avatar cheat game video] [http://vihencbr.0lx.net/rake-video.html rake video] <br />
[http://naceceli.qsh.eu/page932.html im just kid music video] [http://roladarh.strefa.pl/news-1103.html ae86 videos] [http://sedplxca.is-the-boss.com/peak-expiratory-2009-01-01.htm peak expiratory flow rate chart] [http://mahohmie.qsh.eu/sitemap.htm top] [http://caraines.qsh.eu/sitemap.htm url] <br />
[http://cnavieltz.strefa.pl/sitemap.htm link] [http://caraines.qsh.eu/trocmo.htm sling blade movie review] [http://flheddin.qsh.eu/rolsitdar-587.html actress adult japan video] [http://lifokdron.0lx.net/1111.html minutemen movie] [http://brc4tdro.is-the-boss.com/page773.html idaily diary crack] <br />
[http://flheddin.qsh.eu/noquadaro-887.html amc regency movies] [http://licawol.strefa.pl/resource473.htm against britney music spear video] [http://zelgetgo.0lx.net/new328.htm meg ryan and nicolas cage movie] [http://vihencbr.0lx.net/audition-child.html audition child movie] [http://cnavieltz.strefa.pl/comment-1602.htm liquid dream music video] <br />
[http://ettaelt.strefa.pl/news-1090.html mature sample video] [http://sematild.qsh.eu/resource992.htm single use video camera] [http://fispruil.qsh.eu/news73.html numa video] [http://spfortne.qsh.eu/sitemap.html map] [http://ettaelt.strefa.pl/news-984.html erotic porn video] <br />
[http://qasletop.is-the-boss.com/sitemap.html http] [http://varpasz.is-the-boss.com/article696.htm perpetual license definition] [http://releltl.0lx.net/20081118-ampalnd-movies.html ampalnd movies] [http://lifokdron.0lx.net/1594.html real life dragonball z movie] [http://sakonze.qsh.eu/oloacel-569.html js love angel music video] <br />
[http://bukgetert.0lx.net/article-694.htm star wars episode 3 movie trailors] [http://lifokdron.0lx.net/1681.html eve navarro videos] [http://faquafav.is-the-boss.com/text-979.htm licence plate number] [http://golxando.0lx.net/1045433029.html international film and video festival] [http://sedplxca.is-the-boss.com/airlink-usb-serial-2008-12-26.htm airlink usb serial] <br />
[http://spfortne.qsh.eu/sitemap.html http] [http://ettaelt.strefa.pl/sitemap.html domain] [http://naceceli.qsh.eu/page1351.html killer whale attack video] [http://zelfibu.strefa.pl/fufevq-1395.html jade marcela free movies] [http://licawol.strefa.pl/resource290.htm mature home movies] <br />
[http://flheddin.qsh.eu/dartac-1991.html man masturbation movie] [http://dronoubr.0lx.net/lasermax-video.html lasermax video] [http://sematild.qsh.eu/resource1299.htm jackass the movie soundtrack lyrics] [http://cnavieltz.strefa.pl/comment-453.htm michael jordan movie] [http://acsitzar.0lx.net/news-recommended-movies-2008-11-15.html recommended movies comedy] <br />
[http://licawol.strefa.pl/resource1168.htm mature movie thumbnails] [http://zelgetgo.0lx.net/new1913.htm so me videos of michelle trachtenberg nude] [http://acsitzar.0lx.net/news-elijah-wood-videos-2008-11-10.html elijah wood videos] [http://sematild.qsh.eu/resource1615.htm sponge bob square pants movie trailer] [http://zelfibu.strefa.pl/vihend-1976.html mazzy star music videos] <br />
[http://lifokdron.0lx.net/1552.html night watch movie] [http://mahohmie.qsh.eu/resource809.htm line dance video tapes] [http://betheres.qsh.eu/comment-806.htm need video] [http://acsitzar.0lx.net/news-mad-music-ne-2008-11-15.html mad music ne video when yo] [http://sakonze.qsh.eu/rolfiro-1737.html it takes two movie soundtrack] <br />
[http://tacataca.strefa.pl/comment-1229.htm movie schedule in the philippine] [http://dronoubr.0lx.net/nenu-telugu-movie.html nenu telugu movie review] [http://cnavieltz.strefa.pl/comment-1324.htm anacondas movie cast] [http://cnavieltz.strefa.pl/comment-112.htm movie theater fishers indiana] [http://lifokdron.0lx.net/259.html seaside oregon movie theater] <br />
[http://sedplxca.is-the-boss.com/nutcracker-ballet-2008-12-26.htm nutcracker ballet phptographs] [http://saererg.0lx.net/20081108-kansen-movie.htm kansen movie review] [http://indronrol.is-the-boss.com/cagetfik.html pitchshifter torrent] [http://fademon.0lx.net/article-765.htm alice in wonderland the movie pictures] [http://fademon.0lx.net/article-1985.htm live arabic movie] <br />
[[Imagen:XPS-foto.jpg|right]]<br />
'''My laptop was stolen :( Unmaintained page from June 2007'''<br />
<br />
'''Now mainteined by me!. This guide is really usefull!...''' --[[Usuario:Yaco|Yaco]] 19:52 19 dic 2007 (ART) <br />
<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || driver linux-uvc only support V4L2<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:green" | Works ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || working for other people<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || working for other people<br />
|-<br />
! S-Video output || style="background:green" | Works ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:green" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:green" | Works || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
=Specifications=<br />
*Dell XPS M1210 Laptop - AR$ 5.200 (1.700 U$S) - July 2006<br />
**Intel Core 2 Duo Processor T2300 @ 1.66GHz<br />
**1GB of Dual Channel DDR2 memory<br />
**12.1" Widescreen WXGA (1280 x 800) display with TrueLife<br />
**256MB NVIDIA GeForceTM Go 7400 TurboCache<br />
**60GB 5400RPM SATA hard drive<br />
**8x DVD/CD Burner (DVD+/-RW)<br />
**Webcam<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build - Kernel source from sid<br />
<br />
==Detected by preinstaled windows (the last words of)==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=Base installation=<br />
;Debian GNU/Linux Lenny (testing) Daily Build Debian Installer<br />
Kernel built in module for lan interface does not work, I used an old Etch (testing) net installer<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Free drivers (nv)==<br />
;Installed during xserver installation<br />
<br />
==Proprietary drivers (nvidia)==<br />
;Only for 3D acceleration and other advanced features, if not use free driver, you'll feel better.<br />
<br />
===Installation===<br />
apt-get install nvidia-kernel-2.6.18-4-686 nvidia-glx nvidia-settings nvidia-xconfig<br />
<br />
==Configuration==<br />
===Automatic===<br />
nvidia-xconfig<br />
<br />
===Manually===<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
apt-get install firmware-ipw3945 ipw3945d ipw3945-modules-`uname -r`<br />
<br />
;Optional<br />
apt-get install network-manager<br />
<br />
network-manager-gnome requires users to be in the group 'netdev' for it to work. If users aren't in the group 'netdev' then it won't automatically appear, and work, in the Notification Area.<br />
<br />
If you're looking for a manual installation procedure see the [[ipw3945 driver manual installation for Debian Etch]]<br />
<br />
=WebCam - Only work with v4l2=<br />
==Manual==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
<br />
==Using packages (not working?)==<br />
apt-get install linux-uvc-source libpt-plugins-v4l2<br />
m-a prepare<br />
m-a a-i linux-uvc<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
<br />
==Testing Webcam==<br />
<br />
===Using Mplayer===<br />
Just run this and you should see the webcam image:<br />
$ mplayer -v tv:// -tv device=/dev/video0:driver=v4l2:outfmt=yuy2 -vc rawyuy2 -fps 15 -vo x11<br />
===Using Luvcview===<br />
Using luvcview we can take pics and record video.<br />
<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20070512.tar.gz<br />
tar -xvf luvcview-20070512.tar.gz<br />
cd luvcview-20070512<br />
make<br />
sudo make install<br />
luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
Now you can use the buttons (a bit ugly) or the following hotkeys while running the program:<br />
<br />
*'''n''' -> BRIGHTNESS UP<br />
*'''b''' -> BRIGHTNESS DOWN<br />
*'''x''' -> CONTRAST UP<br />
*'''w''' -> CONTRAST DOWN<br />
*'''c''' -> SATURATION UP<br />
*'''v''' -> SATURATION DOWN<br />
*'''z''' -> GAIN UP<br />
*'''a''' -> GAIN DOWN<br />
*'''r''' -> SHARPNESS UP<br />
*'''e''' -> SHARPNESS DOWN<br />
*'''s''' -> SCREENSHOT<br />
*'''p''' -> RECORD A VIDEO<br />
*'''l''' -> RESET<br />
*'''q''' -> QUIT<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=Frontal multimedia buttons=<br />
Configure the frontal buttons using [http://lineak.sourceforge.net/ LineAK].<br />
apt-get install lineak<br />
<br />
Then you should add button configurations in '''/etc/lineakd.def'''. Add the following lines to the end of the file:<br />
<br />
# Dell XPS M1210<br />
[DXPS]<br />
brandname = "Laptop/notebook"<br />
odelname = "Dell XPS and Inspiron 9100"<br />
[KEYS]<br />
Play = 162<br />
Previous = 144<br />
Next = 153<br />
Stop = 164<br />
VolumeUp = 176<br />
VolumeDown = 174<br />
Mute = 160<br />
[END KEYS]<br />
[END DXPS]<br />
# end Dell XPS/I9100 Laptop<br />
<br />
Now do:<br />
<br />
$ lineakd -c DXPS<br />
<br />
Then you can attach a command to the different buttons. Make your changes in '''$HOME/.lineakd/lineakd.conf'''. This is just an example using Amarok (media player) and Aumix for volume control:<br />
<br />
Mute = "aumix -v 0"<br />
Next = "amarok -f"<br />
Play = "amarok -t"<br />
Previous = "amarok -r"<br />
Stop = "amarok -s"<br />
VolumeDown = "aumix -v -5"<br />
VolumeUp = "aumix -v +5"<br />
<br />
Finally, you have to run the lineak daemon:<br />
<br />
$ lineakd&<br />
<br />
Add this to any start script (like .xinitrc) to run it on start up.<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
*[http://criadoindomable.wordpress.com/2008/01/09/modem-para-las-dell-inspiron-en-ubuntu-710/ Modem para las Dell Inspiron en Ubuntu 7.10]<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://www.centre-cired.fr/forum/article441.html<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]<br />
<br />
==Others==<br />
*[http://mundogeek.net/archivos/2007/04/23/temperatura-de-portatiles-dell-en-ubuntu/ Temperatura de portÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂátiles Dell en Ubuntu]<br />
*[http://mundogeek.net/archivos/2007/04/23/desactivar-touchpad-mientras-se-escribe-en-linux/ Desactivar touchpad mientras se escribe en Linux]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2779Installing Debian on Dell M12102009-01-11T14:56:46Z<p>WikiSysop: Revertidas las ediciones realizadas por EltelTsitr (Talk); a la última edición de SitboLipas</p>
<hr />
<div>[http://bukgetert.0lx.net/article-775.htm ass and thong video] [http://tulilre.strefa.pl/2008-12-28-mega-man-music.html mega man music video] [http://qasletop.is-the-boss.com/mexsitrel.html picture of lady pirate] [http://sakonze.qsh.eu/henbrzr-1906.html secretary sex video] [http://dronoubr.0lx.net/arnold-schwarzenegger.html arnold schwarzenegger video clip] <br />
[http://zelgetgo.0lx.net/new501.htm los angeles train crash video] [http://hencnac4t.is-the-boss.com/news-river-past-screen-2008-12-25.html river past screen recorder serial] [http://relquaca.is-the-boss.com/20081229-pirate-dinner.html pirate dinner adventure] [http://acsitzar.0lx.net/sitemap.html site] [http://vihencbr.0lx.net/mitch-hedburg.html mitch hedburg video clips] <br />
[http://sedplxca.is-the-boss.com/march-madness-06-2009-01-05.htm march madness 06 torrent] [http://licawol.strefa.pl/sitemap.htm link] [http://mahohmie.qsh.eu/resource43.htm pretty woman movie] [http://fademon.0lx.net/article-1392.htm rowan atkinson live video] [http://betheres.qsh.eu/comment-1952.htm mcdonalds video game] <br />
[http://golxando.0lx.net/1085013430.html joe kanes digital video essentials] [http://dronoubr.0lx.net/latin-movie-ass.html latin movie ass] [http://lofaako.strefa.pl/article1950.html movie waiting to exhale] [http://tulilre.strefa.pl/2008-12-26-avatar-video-game.html avatar cheat game video] [http://vihencbr.0lx.net/rake-video.html rake video] <br />
[http://naceceli.qsh.eu/page932.html im just kid music video] [http://roladarh.strefa.pl/news-1103.html ae86 videos] [http://sedplxca.is-the-boss.com/peak-expiratory-2009-01-01.htm peak expiratory flow rate chart] [http://mahohmie.qsh.eu/sitemap.htm top] [http://caraines.qsh.eu/sitemap.htm url] <br />
[http://cnavieltz.strefa.pl/sitemap.htm link] [http://caraines.qsh.eu/trocmo.htm sling blade movie review] [http://flheddin.qsh.eu/rolsitdar-587.html actress adult japan video] [http://lifokdron.0lx.net/1111.html minutemen movie] [http://brc4tdro.is-the-boss.com/page773.html idaily diary crack] <br />
[http://flheddin.qsh.eu/noquadaro-887.html amc regency movies] [http://licawol.strefa.pl/resource473.htm against britney music spear video] [http://zelgetgo.0lx.net/new328.htm meg ryan and nicolas cage movie] [http://vihencbr.0lx.net/audition-child.html audition child movie] [http://cnavieltz.strefa.pl/comment-1602.htm liquid dream music video] <br />
[http://ettaelt.strefa.pl/news-1090.html mature sample video] [http://sematild.qsh.eu/resource992.htm single use video camera] [http://fispruil.qsh.eu/news73.html numa video] [http://spfortne.qsh.eu/sitemap.html map] [http://ettaelt.strefa.pl/news-984.html erotic porn video] <br />
[http://qasletop.is-the-boss.com/sitemap.html http] [http://varpasz.is-the-boss.com/article696.htm perpetual license definition] [http://releltl.0lx.net/20081118-ampalnd-movies.html ampalnd movies] [http://lifokdron.0lx.net/1594.html real life dragonball z movie] [http://sakonze.qsh.eu/oloacel-569.html js love angel music video] <br />
[http://bukgetert.0lx.net/article-694.htm star wars episode 3 movie trailors] [http://lifokdron.0lx.net/1681.html eve navarro videos] [http://faquafav.is-the-boss.com/text-979.htm licence plate number] [http://golxando.0lx.net/1045433029.html international film and video festival] [http://sedplxca.is-the-boss.com/airlink-usb-serial-2008-12-26.htm airlink usb serial] <br />
[http://spfortne.qsh.eu/sitemap.html http] [http://ettaelt.strefa.pl/sitemap.html domain] [http://naceceli.qsh.eu/page1351.html killer whale attack video] [http://zelfibu.strefa.pl/fufevq-1395.html jade marcela free movies] [http://licawol.strefa.pl/resource290.htm mature home movies] <br />
[http://flheddin.qsh.eu/dartac-1991.html man masturbation movie] [http://dronoubr.0lx.net/lasermax-video.html lasermax video] [http://sematild.qsh.eu/resource1299.htm jackass the movie soundtrack lyrics] [http://cnavieltz.strefa.pl/comment-453.htm michael jordan movie] [http://acsitzar.0lx.net/news-recommended-movies-2008-11-15.html recommended movies comedy] <br />
[http://licawol.strefa.pl/resource1168.htm mature movie thumbnails] [http://zelgetgo.0lx.net/new1913.htm so me videos of michelle trachtenberg nude] [http://acsitzar.0lx.net/news-elijah-wood-videos-2008-11-10.html elijah wood videos] [http://sematild.qsh.eu/resource1615.htm sponge bob square pants movie trailer] [http://zelfibu.strefa.pl/vihend-1976.html mazzy star music videos] <br />
[http://lifokdron.0lx.net/1552.html night watch movie] [http://mahohmie.qsh.eu/resource809.htm line dance video tapes] [http://betheres.qsh.eu/comment-806.htm need video] [http://acsitzar.0lx.net/news-mad-music-ne-2008-11-15.html mad music ne video when yo] [http://sakonze.qsh.eu/rolfiro-1737.html it takes two movie soundtrack] <br />
[http://tacataca.strefa.pl/comment-1229.htm movie schedule in the philippine] [http://dronoubr.0lx.net/nenu-telugu-movie.html nenu telugu movie review] [http://cnavieltz.strefa.pl/comment-1324.htm anacondas movie cast] [http://cnavieltz.strefa.pl/comment-112.htm movie theater fishers indiana] [http://lifokdron.0lx.net/259.html seaside oregon movie theater] <br />
[http://sedplxca.is-the-boss.com/nutcracker-ballet-2008-12-26.htm nutcracker ballet phptographs] [http://saererg.0lx.net/20081108-kansen-movie.htm kansen movie review] [http://indronrol.is-the-boss.com/cagetfik.html pitchshifter torrent] [http://fademon.0lx.net/article-765.htm alice in wonderland the movie pictures] [http://fademon.0lx.net/article-1985.htm live arabic movie] <br />
[[Imagen:XPS-foto.jpg|right]]<br />
'''My laptop was stolen :( Unmaintained page from June 2007'''<br />
<br />
'''Now mainteined by me!. This guide is really usefull!...''' --[[Usuario:Yaco|Yaco]] 19:52 19 dic 2007 (ART) <br />
<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || driver linux-uvc only support V4L2<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:green" | Works ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || working for other people<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || working for other people<br />
|-<br />
! S-Video output || style="background:green" | Works ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:green" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:green" | Works || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
=Specifications=<br />
*Dell XPS M1210 Laptop - AR$ 5.200 (1.700 U$S) - July 2006<br />
**Intel Core 2 Duo Processor T2300 @ 1.66GHz<br />
**1GB of Dual Channel DDR2 memory<br />
**12.1" Widescreen WXGA (1280 x 800) display with TrueLife<br />
**256MB NVIDIA GeForceTM Go 7400 TurboCache<br />
**60GB 5400RPM SATA hard drive<br />
**8x DVD/CD Burner (DVD+/-RW)<br />
**Webcam<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build - Kernel source from sid<br />
<br />
==Detected by preinstaled windows (the last words of)==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=Base installation=<br />
;Debian GNU/Linux Lenny (testing) Daily Build Debian Installer<br />
Kernel built in module for lan interface does not work, I used an old Etch (testing) net installer<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Free drivers (nv)==<br />
;Installed during xserver installation<br />
<br />
==Proprietary drivers (nvidia)==<br />
;Only for 3D acceleration and other advanced features, if not use free driver, you'll feel better.<br />
<br />
===Installation===<br />
apt-get install nvidia-kernel-2.6.18-4-686 nvidia-glx nvidia-settings nvidia-xconfig<br />
<br />
==Configuration==<br />
===Automatic===<br />
nvidia-xconfig<br />
<br />
===Manually===<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
apt-get install firmware-ipw3945 ipw3945d ipw3945-modules-`uname -r`<br />
<br />
;Optional<br />
apt-get install network-manager<br />
<br />
network-manager-gnome requires users to be in the group 'netdev' for it to work. If users aren't in the group 'netdev' then it won't automatically appear, and work, in the Notification Area.<br />
<br />
If you're looking for a manual installation procedure see the [[ipw3945 driver manual installation for Debian Etch]]<br />
<br />
=WebCam - Only work with v4l2=<br />
==Manual==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
<br />
==Using packages (not working?)==<br />
apt-get install linux-uvc-source libpt-plugins-v4l2<br />
m-a prepare<br />
m-a a-i linux-uvc<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
<br />
==Testing Webcam==<br />
<br />
===Using Mplayer===<br />
Just run this and you should see the webcam image:<br />
$ mplayer -v tv:// -tv device=/dev/video0:driver=v4l2:outfmt=yuy2 -vc rawyuy2 -fps 15 -vo x11<br />
===Using Luvcview===<br />
Using luvcview we can take pics and record video.<br />
<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20070512.tar.gz<br />
tar -xvf luvcview-20070512.tar.gz<br />
cd luvcview-20070512<br />
make<br />
sudo make install<br />
luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
Now you can use the buttons (a bit ugly) or the following hotkeys while running the program:<br />
<br />
*'''n''' -> BRIGHTNESS UP<br />
*'''b''' -> BRIGHTNESS DOWN<br />
*'''x''' -> CONTRAST UP<br />
*'''w''' -> CONTRAST DOWN<br />
*'''c''' -> SATURATION UP<br />
*'''v''' -> SATURATION DOWN<br />
*'''z''' -> GAIN UP<br />
*'''a''' -> GAIN DOWN<br />
*'''r''' -> SHARPNESS UP<br />
*'''e''' -> SHARPNESS DOWN<br />
*'''s''' -> SCREENSHOT<br />
*'''p''' -> RECORD A VIDEO<br />
*'''l''' -> RESET<br />
*'''q''' -> QUIT<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=Frontal multimedia buttons=<br />
Configure the frontal buttons using [http://lineak.sourceforge.net/ LineAK].<br />
apt-get install lineak<br />
<br />
Then you should add button configurations in '''/etc/lineakd.def'''. Add the following lines to the end of the file:<br />
<br />
# Dell XPS M1210<br />
[DXPS]<br />
brandname = "Laptop/notebook"<br />
odelname = "Dell XPS and Inspiron 9100"<br />
[KEYS]<br />
Play = 162<br />
Previous = 144<br />
Next = 153<br />
Stop = 164<br />
VolumeUp = 176<br />
VolumeDown = 174<br />
Mute = 160<br />
[END KEYS]<br />
[END DXPS]<br />
# end Dell XPS/I9100 Laptop<br />
<br />
Now do:<br />
<br />
$ lineakd -c DXPS<br />
<br />
Then you can attach a command to the different buttons. Make your changes in '''$HOME/.lineakd/lineakd.conf'''. This is just an example using Amarok (media player) and Aumix for volume control:<br />
<br />
Mute = "aumix -v 0"<br />
Next = "amarok -f"<br />
Play = "amarok -t"<br />
Previous = "amarok -r"<br />
Stop = "amarok -s"<br />
VolumeDown = "aumix -v -5"<br />
VolumeUp = "aumix -v +5"<br />
<br />
Finally, you have to run the lineak daemon:<br />
<br />
$ lineakd&<br />
<br />
Add this to any start script (like .xinitrc) to run it on start up.<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
*[http://criadoindomable.wordpress.com/2008/01/09/modem-para-las-dell-inspiron-en-ubuntu-710/ Modem para las Dell Inspiron en Ubuntu 7.10]<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://www.centre-cired.fr/forum/article441.html<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]<br />
<br />
==Others==<br />
*[http://mundogeek.net/archivos/2007/04/23/temperatura-de-portatiles-dell-en-ubuntu/ Temperatura de portÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂátiles Dell en Ubuntu]<br />
*[http://mundogeek.net/archivos/2007/04/23/desactivar-touchpad-mientras-se-escribe-en-linux/ Desactivar touchpad mientras se escribe en Linux]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Linux_tips&diff=2778Linux tips2009-01-11T14:55:23Z<p>WikiSysop: Revertidas las ediciones realizadas por C4tboCcdro (Talk); a la última edición de WikiSysop</p>
<hr />
<div><pre><nowiki><br />
Mike Chirico (mchirico@users.sourceforge.net) or (mchirico@comcast.net)<br />
Copyright (C) 2004 (GNU Free Documentation License)<br />
Last Updated: Thu Dec 28 16:42:50 EST 2006<br />
<br />
The latest version of this document can be found at:<br />
http://souptonuts.sourceforge.net/how_to_linux_and_open_source.htm<br />
or text version ( if you have trouble downloading the full document: over 140 pages )<br />
http://prdownloads.sourceforge.net/souptonuts/How_to_Linux_and_Open_Source.txt?download<br />
<br />
<br />
<br />
<br />
For tips on Gmail with Postix and Fetchmail<br />
http://souptonuts.sourceforge.net/postfix_tutorial.html<br />
<br />
For tips on using SQLite (over 25 pages)<br />
http://prdownloads.sourceforge.net/souptonuts/README_sqlite_tutorial.html?download<br />
<br />
<br />
For tips on MySQL reference:<br />
http://prdownloads.sourceforge.net/souptonuts/README_mysql.txt?download<br />
<br />
<br />
For a recommended reading list<br />
http://prdownloads.sourceforge.net/souptonuts/Recommended_Reading.html?download<br />
<br />
<br />
For tips on upgrading RedHat 9 or 8.0 to 2.6.x src kernel<br />
http://prdownloads.sourceforge.net/souptonuts/README_26.txt?download<br />
<br />
<br />
For tips on Comcast Email with Home Linux Box<br />
http://prdownloads.sourceforge.net/souptonuts/README_COMCAST_EMAIL.txt?download<br />
<br />
<br />
<br />
**Note, if you want email notification after every 50 new tips have been<br />
added, then, click on the following link:<br />
https://sourceforge.net/project/filemodule_monitor.php?filemodule_id=120838<br />
<br />
<br />
<br />
TIP 1:<br />
<br />
Is NTP Working?<br />
<br />
STEP 1 (Test the current server):<br />
<br />
Try issuing the following command:<br />
<br />
$ ntpq -pn<br />
<br />
remote refid st t when poll reach delay offset jitter<br />
===================================================<br />
tock.usno.navy 0.0.0.0 16 u - 64 0 0.000 0.000 4000.00<br />
<br />
The above is an example of a problem.<br />
Compare it to a working configuration.<br />
<br />
$ ntpq -pn<br />
<br />
remote refid st t when poll reach delay offset jitter<br />
========================================================<br />
+128.4.40.12 128.4.40.10 2 u 107 128 377 25.642 3.350 1.012<br />
127.127.1.0 127.127.1.0 10 l 40 64 377 0.000 0.000 0.008<br />
+128.91.2.13 128.4.40.12 3 u 34 128 377 21.138 6.118 0.398<br />
*192.5.41.41 .USNO. 1 u 110 128 377 33.69 9.533 3.534<br />
<br />
STEP 2 (Configure the /etc/ntp.conf):<br />
<br />
$ cat /etc/ntp.conf<br />
<br />
# My simple client-only ntp configuration.<br />
server timeserver1.upenn.edu<br />
# ping -a timeserver1.upenn.edu shows the IP address 128.91.2.13<br />
# which is used in the restrict below<br />
restrict 128.91.2.13<br />
server tock.usno.navy.mil<br />
restrict 192.5.41.41<br />
server 128.4.40.12<br />
restrict 128.4.40.12<br />
server 127.127.1.0 # local clock<br />
fudge 127.127.1.0 stratum 10<br />
driftfile /etc/ntp/drift<br />
restrict default ignore<br />
restrict 127.0.0.0 mask 255.0.0.0<br />
authenticate no<br />
<br />
STEP 3 (Configure /etc/ntp/step-tickers):<br />
<br />
The values for server above are placed in the "/etc/ntp/step-tickers" file<br />
<br />
$ cat /etc/ntp/step-tickers<br />
<br />
timeserver1.upenn.edu<br />
tock.usno.navy.mil<br />
128.4.40.12<br />
<br />
The startup script /etc/rc.d/init.d/ntpd will grab the servers in this<br />
file and execute the ntpdate command as follows:<br />
<br />
/usr/sbin/ntpdate -s -b -p 8 timeserver1.upenn.edu<br />
<br />
Why? Because if the time is off ntpd will not start. The command above set the<br />
clock. If System Time deviates from true time by more than 1000 seconds, then,<br />
the ntpd daemon will enter panic mode and exit.<br />
<br />
STEP 4 (Restart the service and check):<br />
<br />
Issue the restart command<br />
<br />
/etc/init.d/ntpd restart<br />
<br />
check the values for "ntpq -pn",<br />
which should match step 1.<br />
<br />
ntpq -pn<br />
<br />
SPECIAL NOTE:<br />
<br />
Time is always stored in the kernel as the number of seconds since<br />
midnight of the 1st of January 1970 UTC, regardless of whether the<br />
hardware clock is stored as UTC or not. Conversions to local time<br />
are done at run-time. So, it's easy to get the time in different<br />
timezones for only the current session as follows:<br />
<br />
<br />
$ export TZ=EST<br />
$ date<br />
Mon Aug 2 10:34:04 EST 2004<br />
<br />
$ export TZ=NET<br />
$ date<br />
Mon Aug 2 15:34:18 NET 2004<br />
<br />
The following are possible values for TZ:<br />
<br />
Hours From Greenwich Mean Time (GMT) Value Description<br />
0 GMT Greenwich Mean Time<br />
+1 ECT European Central Time<br />
+2 EET European Eastern Time<br />
+2 ART<br />
+3 EAT Saudi Arabia<br />
+3.5 MET Iran<br />
+4 NET<br />
+5 PLT West Asia<br />
+5.5 IST India<br />
+6 BST Central Asia<br />
+7 VST Bangkok<br />
+8 CTT China<br />
+9 JST Japan<br />
+9.5 ACT Central Australia<br />
+10 AET Eastern Australia<br />
+11 SST Central Pacific<br />
+12 NST New Zealand<br />
-11 MIT Samoa<br />
-10 HST Hawaii<br />
-9 AST Alaska<br />
-8 PST Pacific Standard Time<br />
-7 PNT Arizona<br />
-7 MST Mountain Standard Time<br />
-6 CST Central Standard Time<br />
-5 EST Eastern Standard Time<br />
-5 IET Indiana East<br />
-4 PRT Atlantic Standard Time<br />
-3.5 CNT Newfoundland<br />
-3 AGT Eastern South America<br />
-3 BET Eastern South America<br />
-1 CAT Azores<br />
<br />
DST timezone<br />
<br />
<br />
0 BST for British Summer.<br />
+400 ADT for Atlantic Daylight.<br />
+500 EDT for Eastern Daylight.<br />
+600 CDT for Central Daylight.<br />
+700 MDT for Mountain Daylight.<br />
+800 PDT for Pacific Daylight.<br />
+900 YDT for Yukon Daylight.<br />
+1000 HDT for Hawaii Daylight.<br />
-100 MEST for Middle European Summer,<br />
MESZ for Middle European Summer,<br />
SST for Swedish Summer and FST for French Summer.<br />
-700 WADT for West Australian Daylight.<br />
-1000 EADT for Eastern Australian Daylight.<br />
-1200 NZDT for New Zealand Daylight.<br />
<br />
The following is an example of setting the TZ environment variable<br />
for the timezone, only when timezone changes go into effect.<br />
<br />
$ export TZ=EST+5EDT,M4.1.0/2,M10.5.0/2<br />
<br />
Take a look at the last line "M10.5.0/2". What does it mean? Here is the<br />
documentation<br />
<br />
<br />
Mm.w.d This specifies day d (0 <= d <= 6) of week w (1 <= w <= 5) of<br />
month m (1 <= m <= 12). Week 1 is the first week in which day d<br />
occurs and week 5 is the last week in which day d occurs. Day 0<br />
is a Sunday.<br />
<br />
The time fields specify when, in the local time currently in<br />
effect, the change to the other time occurs. If omitted,<br />
the default is 02:00:00.<br />
<br />
So this is what it means. M10 stands for October, the 5 is the fifth week<br />
that includes a Sunday (note 0 in M10.5.0/2 is Sunday). To see that it is<br />
the fifth week see the calendar below. The time change occurs a 2am in<br />
the morning.<br />
<br />
October<br />
Su Mo Tu We Th Fr Sa<br />
1 2<br />
3 4 5 6 7 8 9<br />
10 11 12 13 14 15 16<br />
17 18 19 20 21 22 23<br />
24 25 26 27 28 29 30<br />
31<br />
<br />
Prove it. Take the following program sunrise, which can calcuates sunrise<br />
and sunset for an latitude and longitude. This program can be downloaded<br />
from the following location:<br />
http://sourceforge.net/direct-dl/mchirico/souptonuts/working_with_time.tar.gz<br />
<br />
Below is a bash script that will run the program for the next 100 days.<br />
<br />
#!/bin/bash<br />
# program: next100days Mike Chirico<br />
# download:<br />
# http://sourceforge.net/direct-dl/mchirico/souptonuts/working_with_time.tar.gz<br />
#<br />
# This will calculate the sunrise and sunset for<br />
# latitude 39.95 Note must convert to degrees<br />
# longitude 75.15 Note must convert to degrees<br />
lat=39.95<br />
long=75.15<br />
for (( i=0; i <= 100; i++))<br />
do<br />
sunrise `date -d "+$i day" "+%Y %m %d"` $lat $long<br />
done<br />
<br />
Take a look at the following sample output.<br />
<br />
$ export TZ=EST+5EDT,M4.1.0/2,M10.5.0/2<br />
$ ./next100days<br />
<br />
Sunrise 08-24-2004 06:21:12 Sunset 08-24-2004 19:43:42<br />
Sunrise 08-25-2004 06:22:09 Sunset 08-25-2004 19:42:12<br />
Sunrise 08-26-2004 06:23:06 Sunset 08-26-2004 19:40:41<br />
Sunrise 08-27-2004 06:24:03 Sunset 08-27-2004 19:39:09<br />
Sunrise 08-28-2004 06:25:00 Sunset 08-28-2004 19:37:37<br />
Sunrise 08-29-2004 06:25:56 Sunset 08-29-2004 19:36:04<br />
Sunrise 08-30-2004 06:26:53 Sunset 08-30-2004 19:34:31<br />
Sunrise 08-31-2004 06:27:50 Sunset 08-31-2004 19:32:57<br />
Sunrise 09-01-2004 06:28:46 Sunset 09-01-2004 19:31:22<br />
Sunrise 09-02-2004 06:29:43 Sunset 09-02-2004 19:29:47<br />
..[values omitted ]<br />
Sunrise 10-28-2004 07:25:31 Sunset 10-28-2004 18:02:34<br />
Sunrise 10-29-2004 07:26:38 Sunset 10-29-2004 18:01:19<br />
Sunrise 10-30-2004 07:27:46 Sunset 10-30-2004 18:00:06<br />
Sunrise 10-31-2004 06:28:53 Sunset 10-31-2004 16:58:54<br />
Sunrise 11-01-2004 06:30:01 Sunset 11-01-2004 16:57:44<br />
Sunrise 11-02-2004 06:31:10 Sunset 11-02-2004 16:56:35<br />
<br />
Compare 10-30-2004 with 10-31-2004. Sunrise is an hour earlier because<br />
daylight saving time has ended, just as predicted.<br />
<br />
There is an easier way to switch between timezones. Take a look at the<br />
directory zoneinfo as follows:<br />
<br />
$ ls /usr/share/zoneinfo<br />
<br />
Africa Chile Factory Iceland Mexico posix UCT<br />
America CST6CDT GB Indian Mideast posixrules Universal<br />
Antarctica Cuba GB-Eire Iran MST PRC US<br />
Arctic EET GMT iso3166.tab MST7MDT PST8PDT UTC<br />
Asia Egypt GMT0 Israel Navajo right WET<br />
Atlantic Eire GMT-0 Jamaica NZ ROC W-SU<br />
Australia EST GMT+0 Japan NZ-CHAT ROK zone.tab<br />
Brazil EST5EDT Greenwich Kwajalein Pacific Singapore Zulu<br />
Canada Etc Hongkong Libya Poland SystemV<br />
CET Europe HST MET Portugal Turkey<br />
<br />
TZ can be set to any one of these files. Some of these are directories and contain<br />
subdirectories, such as ./posix/America. This way you don not have to enter the<br />
timezone, offset, and range for dst, since it has already been calculated.<br />
<br />
$ export TZ=:/usr/share/zoneinfo/posix/America/Aruba<br />
$ export TZ=:/usr/share/zoneinfo/Egypt<br />
<br />
<br />
Reference:<br />
http://prdownloads.sourceforge.net/cpearls/date_calc.tar.gz?download<br />
<br />
Also see (TIP 27).<br />
Also see (TIP 103) using chrony which is very similiar to ntpd.<br />
Note time settings can usually be found in /etc/sysconfig/clock<br />
<br />
<br />
<br />
<br />
TIP 2:<br />
<br />
cpio works like tar, only better.<br />
<br />
STEP 1 (Create two directories with data ../dir1 an ../dir2)<br />
<br />
mkdir -p ../dir1<br />
mkdir -p ../dir2<br />
cp /etc/*.conf ../dir1/.<br />
cp /etc/*.cnf ../dir2/.<br />
<br />
Which will backup all your cnf and conf files.<br />
<br />
STEP 2 (Piping the files to tar)<br />
<br />
cpio works like tar but can take input<br />
from the "find" command.<br />
<br />
$ find ../dir1/ | cpio -o --format=tar > test.tar<br />
or<br />
$ find ../dir1/ | cpio -o -H tar > test2.tar<br />
<br />
Same command without the ">"<br />
<br />
$ find ../dir1/ | cpio -o --format=tar -F test.tar<br />
or<br />
$ find ../dir1/ | cpio -o -H tar -F test2.tar<br />
<br />
Using append<br />
<br />
$ find ../dir1/ | cpio -o --format=tar -F test.tar<br />
or<br />
$ find ../dir2/ | cpio -o --format=tar --append -F test.tar<br />
<br />
STEP 3 (List contents of the tar file)<br />
<br />
$ cpio -it < test.tar<br />
or<br />
$ cpio -it -F test.tar<br />
<br />
STEP 4 (Extract the contents)<br />
<br />
$ cpio -i -F test.tar<br />
<br />
<br />
<br />
TIP 3:<br />
<br />
Working with tar. The basics with encryption.<br />
<br />
STEP 1 (Using the tar command on the directory /stuff)<br />
<br />
Suppose you have a directory /stuff<br />
To tar everything in stuff to create a ".tar" file.<br />
<br />
$ tar -cvf stuff.tar stuff<br />
<br />
Which will create "stuff.tar".<br />
<br />
STEP 2 (Using the tar command to create a ".tar.gz" of /stuff)<br />
<br />
$ tar -czf stuff.tar.gz stuff<br />
<br />
STEP 3 (List the files in the archive)<br />
<br />
$ tar -tzf stuff.tar.gz<br />
or<br />
$ tar -tf stuff.tar<br />
<br />
STEP 4 (A way to list specific files)<br />
<br />
Note, pipe the results to a file and edit<br />
<br />
$ tar -tzf stuff.tar.gz > mout<br />
<br />
Then, edit mout to only include the files you want<br />
<br />
$ tar -T mout -xzf stuff.tar.gz<br />
<br />
The above command will only get the files in mout.<br />
Of couse, if you want them all<br />
<br />
$ tar -xzf stuff.tar.gz<br />
<br />
STEP 5 (ENCRYPTION)<br />
<br />
$ tar -zcvf - stuff|openssl des3 -salt -k secretpassword | dd of=stuff.des3<br />
<br />
This will create stuff.des3...don't forget the password you<br />
put in place of secretpassword. This can be done interactively as<br />
well.<br />
<br />
$ dd if=stuff.des3 |openssl des3 -d -k secretpassword|tar zxf -<br />
<br />
NOTE: above there is a "-" at the end... this will<br />
extract everything.<br />
<br />
<br />
<br />
TIP 4:<br />
<br />
Creating a Virtual File System and Mounting it with a Loopback Device.<br />
<br />
STEP 1 (Construct a 10MB file)<br />
<br />
$ dd if=/dev/zero of=/tmp/disk-image count=20480<br />
<br />
By default dd uses block of 512 so the size will be 20480*512<br />
<br />
STEP 2 (Make an ext2 or ext3 file system) -- ext2 shown here.<br />
<br />
$ mke2fs -q<br />
<br />
or if you want ext3<br />
<br />
$ mkfs -t ext3 -q /tmp/disk-image<br />
<br />
yes, you can even use reiser, but you'll need to create a bigger<br />
disk image. Something like "dd if=/dev/zero of=/tmp/disk-image count=50480".<br />
<br />
$ mkfs -t reiserfs -q /tmp/disk-image<br />
<br />
Hit yes for confirmation. It only asks this because it's a file<br />
<br />
<br />
STEP 3 (Create a directory "virtual-fs" and mount. This has to be done as root)<br />
<br />
$ mkdir /virtual-fs<br />
$ mount -o loop=/dev/loop0 /tmp/disk-image /virtual-fs<br />
<br />
SPECIAL NOTE: if you mount a second device you will have to increase the<br />
loop count: loop=/dev/loop1, loop=/dev/loop2, ... loop=/dev/loopn<br />
<br />
Now it operates just like a disk. This virtual filesystem can be mounted<br />
when the system boots by adding the following to the "/etc/fstab" file. Then,<br />
to mount, just type "mount /virtual-fs".<br />
<br />
/tmp/disk-image /virtual-fs ext2 rw,loop=/dev/loop0 0 0<br />
<br />
STEP 4 (When done, umount it)<br />
<br />
$ umount /virtual-fs<br />
<br />
<br />
SPECIAL NOTE: If you are using Fedora core 2, in the /etc/fstab you can take<br />
advantage of acl properties for this mount. Note the acl next to the<br />
rw entry. This is shown here with ext3.<br />
<br />
/tmp/disk-image /virtual-fs ext3 rw,acl,loop=/dev/loop1 0 0<br />
<br />
Also, if you are using Fedora core 2 and above, you can mount the file<br />
on a cryptoloop.<br />
<br />
$ dd if=/dev/urandom of=disk-aes count=20480<br />
<br />
<br />
$ modprobe loop<br />
$ modprobe cryptoloop<br />
$ modprobe aes<br />
<br />
$ losetup -e aes /dev/loop0 disk-aes<br />
$ mkfs -t ext2 /dev/loop0<br />
$ mount -o loop,encryption=aes disk-aes <mount point><br />
<br />
<br />
If you do not have Fedora core 2, then, you can build the kernel from source<br />
with some of the following options (not complete, yet)<br />
reference:<br />
http://cvs.sourceforge.net/viewcvs.py/cpearls/cpearls/src/posted_on_sf/acl/ehd.pdf?rev=1.1&view=log<br />
<br />
Cryptographic API Support (CONFIG_CRYPTO)<br />
generic loop cryptographic (CONFIG_CRYPTOLOOP)<br />
Cryptographic ciphers (CONFIG_CIPHERS)<br />
Enable one or more ciphers (CONFIG CIPHER .*) such as AES.<br />
<br />
<br />
HELPFUL INFORMATION: It is possible to bind mount partitions, or associate the<br />
mounted partition to a directory name.<br />
<br />
# mount --bind /virtual-fs /home/mchirico/vfs<br />
<br />
Also, if you want to see what filesystems are currently mounted, "cat" the<br />
file "/etc/mtab"<br />
<br />
$ cat /etc/mtab<br />
<br />
Also see TIP 91.<br />
<br />
<br />
<br />
TIP 5:<br />
<br />
Setting up 2 IP address on "One" NIC. This example is on ethernet.<br />
<br />
STEP 1 (The settings for the initial IP address)<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0<br />
<br />
DEVICE=eth0<br />
BOOTPROTO=static<br />
BROADCAST=192.168.99.255<br />
IPADDR=192.168.1.155<br />
NETMASK=255.255.252.0<br />
NETWORK=192.168.1.0<br />
ONBOOT=yes<br />
<br />
STEP 2 (2nd IP address: )<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0:1<br />
<br />
DEVICE=eth0:1<br />
BOOTPROTO=static<br />
BROADCAST=192.168.99.255<br />
IPADDR=192.168.1.182<br />
NETMASK=255.255.252.0<br />
NETWORK=192.168.1.0<br />
ONBOOT=yes<br />
<br />
SUMMARY Note, in STEP 1 the filename is "ifcfg-eth0", whereas in<br />
STEP 2 it's "ifcfg-eth0:1" and also not the matching<br />
entries for "DEVICE=...". Also, obviously, the<br />
"IPADDR" is different as well.<br />
<br />
<br />
<br />
TIP 6:<br />
<br />
Sharing Directories Among Several Users.<br />
<br />
Several people are working on a project in "/home/share"<br />
and they need to create documents and programs so that<br />
others in the group can edit and execute these documents<br />
as needed. Also see (TIP 186) for adding existing users<br />
to groups.<br />
<br />
$ /usr/sbin/groupadd share<br />
$ chown -R root.share /home/share<br />
$ /usr/bin/gpasswd -a <username> share<br />
$ chmod 2775 /home/share<br />
<br />
$ ls -ld /home/share<br />
drwxrwsr-x 2 root share 4096 Nov 8 16:19 /home/share<br />
^---------- Note the s bit, which was set with the chmod 2775<br />
<br />
$ cat /etc/group<br />
...<br />
share:x:502:chirico,donkey,zoe<br />
... ^------- users are added to this group.<br />
<br />
The user may need to login again to get access. Or, if the user is currently<br />
logged in, they can run the following command:<br />
<br />
$ su - <username><br />
<br />
Note, the above step is recommended over "newgrp - share" since currently<br />
newgrp in FC2,FC3, and FC4 gets access to the group but the umask is not<br />
correctly formed.<br />
<br />
As root you can test their account.<br />
<br />
$ su - <username> "You need to '-' to pickup thier environment '$ su - chirico' "<br />
<br />
Note: SUID, SGID, Sticky bit. Only the left most octet is examined, and "chmod 755" is used<br />
as an example of the full command. But, anything else could be used as well. Normally<br />
you'd want executable permissions.<br />
<br />
Octal digit Binary value Meaning Example usage<br />
0 000 all cleared $ chmod 0755 or chmod 755<br />
1 001 sticky $ chmod 1755<br />
2 010 setgid $ chmod 2755<br />
3 011 setgid, sticky $ chmod 3755<br />
4 100 setuid $ chmod 4755<br />
5 101 setuid, sticky $ chmod 5755<br />
6 110 setuid, setgid $ chmod 6755<br />
7 111 setuid, setgid, sticky $ chmod 7755<br />
<br />
A few examples applied to a directory below. In the first example all users in the group can<br />
add files to directory "dirA" and they can delete their own files. Users cannot delete other<br />
user's files.<br />
<br />
Sticky bit:<br />
$ chmod 1770 dirA<br />
<br />
Below files created within the directory have the group ID of the directory, rather than that<br />
of the default group setting for the user who created the file.<br />
<br />
Set group ID bit:<br />
$ chmod 2755 dirB<br />
<br />
<br />
<br />
<br />
TIP 7:<br />
<br />
Getting Infomation on Commands<br />
<br />
The "info" is a great utility for getting information about the system.<br />
Here's a quick key on using "info" from the terminal prompt.<br />
<br />
'q' exits.<br />
'u' moves up to the table of contents of the current section.<br />
'n' moves to the next chapter.<br />
'p' moves to the previous chapter.<br />
'space' goes into the selected section.<br />
<br />
<br />
The following is a good starting point:<br />
<br />
$ info coreutils<br />
<br />
Need to find out what a certain program does?<br />
<br />
$ whatis open<br />
open (2) - open and possibly create a file or device<br />
open (3) - perl pragma to set default PerlIO layers for input and output<br />
open (3pm) - perl pragma to set default PerlIO layers for input and output<br />
open (n) - Open a file-based or command pipeline channel<br />
<br />
To get specific information about the open commmand<br />
<br />
$ man 2 open<br />
<br />
also try 'keyword' search, which is the same as the apropos command.<br />
For example, to find all the man pages on selinux, type the following:<br />
<br />
$ man -k selinux<br />
<br />
or the man full word search. Same as whatis command.<br />
<br />
$ man -f <some string><br />
<br />
This is a hint once you are inside man.<br />
<br />
space moves forward one page<br />
b moves backward<br />
y scrolls up one line "yikes, I missed it!"<br />
g goes to the beginning<br />
q quits<br />
/<string> search, repeat seach n<br />
m mark, enter a letter like "a", then, ' to go back<br />
' enter a letter that is marked.<br />
<br />
<br />
<br />
To get section numbers<br />
<br />
$ man 8 ping<br />
<br />
Note the numbers are used as follows<br />
(This is OpenBSD)<br />
<br />
1 General Commands<br />
2 System Calls and Error Numbers<br />
3 C Libraries<br />
3p perl<br />
4 Devices and device drivers<br />
5 File Formats and config files<br />
6 Game instructions<br />
7 Miscellaneous information<br />
8 System maintenance<br />
9 Kernel internals<br />
<br />
To find the man page directly, "ls" command:<br />
<br />
$ whereis -m ls<br />
ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1/ls.1 /usr/share/man/man1p/ls.1p<br />
<br />
To read this file directly, do the following:<br />
<br />
$ man /usr/share/man/man1/ls.1.gz<br />
<br />
If you want to know the manpath, execute manpath.<br />
<br />
$ manpath<br />
/usr/share/man:/usr/X11R6/man:/usr/local/share/man:/usr/local/pgsql/man:/usr/man:/usr/local/man<br />
<br />
<br />
<br />
TIP 8:<br />
<br />
How to Put a "Running Job" in the Background.<br />
<br />
You're running a job at the terminal prompt, and it's taking<br />
a very long time. You want to put the job in the backgroud.<br />
<br />
"CTL - z" Temporarily suspends the job<br />
$ jobs This will list all the jobs<br />
$ bg %jobnumber (bg %1) To run in the background<br />
$ fg %jobnumber To bring back in the foreground<br />
<br />
Need to kill all jobs -- say you're using several suspended<br />
emacs sessions and you just want everything to exit.<br />
<br />
$ kill -9 `jobs -p`<br />
<br />
The "jobs -p" gives the process number of each job, and the<br />
kill -9 kills everything. Yes, sometimes "kill -9" is excessive<br />
and you should issue a "kill -15" that allows jobs to clean-up.<br />
However, for exacs session, I prefer "kill -9" and haven't had<br />
a problem.<br />
<br />
Sometimes you need to list the process id along with job<br />
information. For instance, here's process id with the listing.<br />
<br />
$ jobs -l<br />
<br />
Note you can also renice a job, or give it lower priority.<br />
<br />
$ nice -n +15 find . -ctime 2 -type f -exec ls {} \; > last48hours<br />
^z<br />
$ bg<br />
<br />
So above that was a ctl-z to suppend. Then, bg to run it in<br />
the background. Now, if you want to change the priority lower<br />
you just renice it, once you know the process id.<br />
<br />
$ jobs -pl<br />
[1]+ 29388 Running nice -n +15 find . -ctime 2 -exec ls -l {} \; >mout &<br />
<br />
$ renice +30 -p 29388<br />
29388: old priority 15, new priority 19<br />
<br />
19 was the lowest priority for this job. You cannot increase<br />
the priority unless you are root.<br />
<br />
<br />
<br />
TIP 9:<br />
<br />
Need to Delete a File for Good -- not even GOD can recover.<br />
<br />
You have a file "secret". The following makes it so no one<br />
can read it. If the file was 12 bytes, it's now 4096 after it<br />
has been over written 100 times. There's no way to recover this.<br />
<br />
$ shred -n 100 -z secret<br />
<br />
Want to remove the file? Use the "u" option.<br />
<br />
$ shred -n 100 -z -u test2<br />
<br />
It can be applied to a device<br />
<br />
$ shred -n 100 -z -u /dev/fd0<br />
<br />
<br />
CAUTION: Note that shred relies on a very important assumption: that the file system overwrites data<br />
in place. This is the traditional way to do things, but many modern file system designs do not sat-<br />
isfy this assumption. The following are examples of file systems on which shred is not effective, or<br />
is not guaranteed to be effective in all file system modes:<br />
<br />
* log-structured or journaled file systems, such as those supplied with<br />
<br />
AIX and Solaris (and JFS, ReiserFS, XFS, Ext3, etc.)<br />
<br />
<br />
<br />
Also see (TIP 52).<br />
<br />
<br />
<br />
TIP 10:<br />
<br />
Who and What is doing What on Your System - finding open sockets,<br />
files etc.<br />
<br />
$ lsof<br />
or as root<br />
$ watch lsof -i<br />
<br />
To list all open Internet files, use:<br />
<br />
$ lsof -i -U<br />
<br />
(See TIP 118)<br />
<br />
Also try fuser. Suppose you have a mounted file-system, and you need<br />
to umount it. To list the users on the file-system /work<br />
<br />
$ fuser -u /work<br />
<br />
To kill all processes accessing the file system /work in any way.<br />
<br />
$ fuser -km /work<br />
<br />
Or better yet, maybe you want to eject a cdrom on /mnt/cdrom<br />
<br />
$ fuser -km /mnt/cdrom<br />
<br />
<br />
If you need IO load information about your system, you can execute<br />
iostat. But note, the very first iostat gives a snapshot since<br />
the last boot. You typically want the following command, which gives<br />
you 3 outputs every 5 seconds.<br />
<br />
$ iostat -xtc 5 3<br />
Linux 2.6.12-1.1376_FC3smp (squeezel.squeezel.com) 10/05/2005<br />
<br />
Time: 07:05:04 PM<br />
avg-cpu: %user %nice %system %iowait %idle<br />
0.97 0.06 1.94 0.62 96.41<br />
<br />
Time: 07:05:09 PM<br />
avg-cpu: %user %nice %system %iowait %idle<br />
0.60 0.00 1.70 0.00 97.70<br />
<br />
Time: 07:05:14 PM<br />
avg-cpu: %user %nice %system %iowait %idle<br />
1.00 0.00 1.60 0.00 97.39<br />
<br />
vmstat reports memory statistics.<br />
<br />
<br />
$ vmstat<br />
$ ifconfig<br />
$ cat /proc/sys/vm/.. (entries under here)<br />
<br />
<br />
*NOTE: (TIP 77) shows sample usage of "ifconfig". Also<br />
(TIP 84) shows sample output of "$ cat /proc/cpuinfo". You can download iostat<br />
and other packages from (http://perso.wanadoo.fr/sebastien.godard/download_en.html).<br />
You also may want to look at iozone (TIP 178).<br />
<br />
Also<br />
<br />
$ cat /proc/meminfo<br />
$ cat /proc/stat<br />
<br />
$ cat /proc/uptime<br />
1078623.55 1048008.34 First number is the number of seconds since boot.<br />
The second number is the number of idle seconds.<br />
<br />
$ cat /proc/loadavg<br />
0.25 0.14 0.10 1/166 7778 This shows load at 1,5, and 15 minutes,<br />
a total of 1 current running process out<br />
from a total of 166. The 7778 is the last<br />
process id used.<br />
Ref: http://www.teamquest.com/resources/gunther/ldavg1.shtml<br />
<br />
Or current process open file descriptors<br />
<br />
$ ls -l /proc/self/fd/0<br />
lrwx------ 1 chirico chirico 64 Jun 29 13:17 0 -> /dev/pts/51<br />
lrwx------ 1 chirico chirico 64 Jun 29 13:17 1 -> /dev/pts/51<br />
lrwx------ 1 chirico chirico 64 Jun 29 13:17 2 -> /dev/pts/51<br />
lr-x------ 1 chirico chirico 64 Jun 29 13:17 3 -> /proc/26667/fd<br />
<br />
So you could, $ echo "stuff" > /dev/pts/51, to get output. Note, tree is also<br />
helpful here:<br />
<br />
$ tree /proc/self<br />
<br />
/proc/self<br />
|-- auxv<br />
|-- cmdline<br />
|-- cwd -> /work/souptonuts/documentation/theBook<br />
|-- environ<br />
|-- exe -> /usr/bin/tree<br />
|-- fd<br />
| |-- 0 -> /dev/pts/51<br />
| |-- 1 -> /dev/pts/51<br />
| |-- 2 -> /dev/pts/51<br />
| `-- 3 -> /proc/26668/fd<br />
|-- maps<br />
|-- mem<br />
|-- mounts<br />
|-- root -> /<br />
|-- stat<br />
|-- statm<br />
|-- status<br />
|-- task<br />
| `-- 26668<br />
| |-- auxv<br />
| |-- cmdline<br />
| |-- cwd -> /work/souptonuts/documentation/theBook<br />
| |-- environ<br />
| |-- exe -> /usr/bin/tree<br />
| |-- fd<br />
| | |-- 0 -> /dev/pts/51<br />
| | |-- 1 -> /dev/pts/51<br />
| | |-- 2 -> /dev/pts/51<br />
| | `-- 3 -> /proc/26668/task/26668/fd<br />
| |-- maps<br />
| |-- mem<br />
| |-- mounts<br />
| |-- root -> /<br />
| |-- stat<br />
| |-- statm<br />
| |-- status<br />
| `-- wchan<br />
`-- wchan<br />
<br />
10 directories, 28 files<br />
<br />
Need a listing of the system settings?<br />
<br />
$ sysctl -a<br />
<br />
Need IPC (Shared Memory Segments, Semaphore Arrays, Message Queue) status<br />
etc?<br />
<br />
$ ipcs<br />
$ ipcs -l "This gives limits"<br />
<br />
Need to "watch" everything a user does? The following watches donkey.<br />
<br />
$ watch lsof -u donkey<br />
<br />
Or, to see what in going on in directory "/work/junk"<br />
<br />
$ watch lsof +D /work/junk<br />
<br />
<br />
<br />
TIP 11:<br />
<br />
How to make a File "immutable" or "unalterable" -- it cannot be changed<br />
or deleted even by root. Note this works on (ext2/ext3) filesystems.<br />
And, yes, root can delete after it's changed back.<br />
<br />
As root:<br />
<br />
$ chattr +i filename<br />
<br />
And to change it back:<br />
<br />
$ chattr -i filename<br />
<br />
List attributes<br />
<br />
$ lsattr filename<br />
<br />
<br />
<br />
TIP 12:<br />
<br />
SSH - How to Generate the Key Pair.<br />
<br />
<br />
On the local server<br />
<br />
$ ssh-keygen -t dsa -b 2048<br />
<br />
This will create the two files:<br />
<br />
.ssh/id_dsa (Private key)<br />
.ssh/id_dsa.pub (Public key you can share)<br />
<br />
Next insert ".ssh/id_dsa.pub" on the remote server<br />
in the file ".ssh/authorized_keys" and ".ssh/authorized_keys2"<br />
and change the permission of each file to (chmod 600). Plus, make<br />
sure the directory ".ssh" exists on the remote computer with 700 rights.<br />
Ok, assuming 192.168.1.155 is the remote server and "donkey" is the<br />
account on that remote server.<br />
<br />
$ ssh donkey@192.168.1.155 "mkdir -p .ssh"<br />
$ ssh donkey@192.168.1.155 "chmod 700 .ssh"<br />
$ scp ./.ssh/id_dsa.pub donkey@192.168.1.155:.ssh/newkey.pub<br />
<br />
Now connect to that remote server "192.168.1.155" and add .ssh/newkey.pub<br />
to both "authorized_keys" and "authorized_keys2". When done, the permission<br />
on<br />
(This is on the remote server)<br />
<br />
$chmod 600 .ssh/authorized_key*<br />
<br />
Next, go back to the local server and issue the following:<br />
<br />
$ ssh-agent $SHELL<br />
$ ssh-add<br />
<br />
The "ssh-add" will allow you to enter the passphrase and it will<br />
save it for the current login session.<br />
<br />
You don't have to enter a password when running "ssh-keygen" above. But,<br />
remember anyone with root access can "su - <username>" and then connect<br />
to your computers. It's harder, however, not impossible, for root to do<br />
this if you have a password.<br />
<br />
(Reference TIP 151)<br />
<br />
<br />
<br />
TIP 13:<br />
<br />
Securing the System: Don't allow root to login remotely. Instead,<br />
the admin could login as another account, then, "su -". However,<br />
root can still login "from the local terminal".<br />
<br />
In the "/etc/ssh/sshd_config" file change the following lines:<br />
<br />
Protocol 2<br />
PermitRootLogin no<br />
PermitEmptyPasswords no<br />
<br />
Then, restart ssh<br />
<br />
/etc/init.d/sshd restart<br />
<br />
Why would you want to do this? It's not possible for anyone to guess<br />
or keep trying the root account. This is especially good for computers<br />
on the Internet. So, even if the "root" passwords is known, they can't<br />
get access to the system remotely. Only from the terminal, which is locked<br />
in your computer room. However, if anyone has a account on the server,<br />
then, they can login under their account then "su -".<br />
<br />
Suppose you only want a limited number of users: "mchirico" and "donkey".<br />
Add the following line to "/etc/ssh/sshd_config". Note, this allows access<br />
for chirico and donkey, but everyone else is denied.<br />
<br />
# Once you add AllowUsers - everyone else is denied.<br />
AllowUsers mchirico donkey<br />
<br />
<br />
<br />
TIP 14:<br />
<br />
Keep Logs Longer with Less Space.<br />
<br />
Normally logs rotate monthly, over writing all the old data. Here's a<br />
sample "/etc/logrotate.conf" that will keep 12 months of backup<br />
compressing the logfiles<br />
<br />
$ cat /etc/logrotate.conf<br />
<br />
# see "man logrotate" for details<br />
# rotate log files weekly<br />
#chirico changes to monthly<br />
monthly<br />
<br />
# keep 4 weeks worth of backlogs<br />
# keep 12 months of backup<br />
rotate 12<br />
<br />
# create new (empty) log files after rotating old ones<br />
create<br />
<br />
# uncomment this if you want your log files compressed<br />
compress<br />
<br />
# RPM packages drop log rotation information into this directory<br />
include /etc/logrotate.d<br />
<br />
# no packages own wtmp -- we'll rotate them here<br />
/var/log/wtmp {<br />
monthly<br />
create 0664 root utmp<br />
rotate 1<br />
}<br />
<br />
# system-specific logs may be also be configured here.<br />
<br />
<br />
Note: see tip 1. The clock should always be correctly set.<br />
<br />
<br />
<br />
TIP 15:<br />
<br />
What Network Services are Running?<br />
<br />
$ netstat -atup<br />
<br />
or<br />
<br />
$ netstat -ap|grep LISTEN|less<br />
<br />
This can be helpful to determine the services running.<br />
<br />
Need stats on dropped UDP packets?<br />
<br />
$ netstat -s -u<br />
<br />
or TCP<br />
<br />
$ netstat -s -t<br />
<br />
or summary of everything<br />
<br />
$ netstat -s<br />
<br />
or looking for error rates on the interface?<br />
<br />
$ netstat -i<br />
<br />
Listening interfaces?<br />
<br />
$ netstat -l<br />
<br />
(Tip above provided by Amos Shapira)<br />
<br />
Also see TIP 77.<br />
<br />
<br />
<br />
TIP 16:<br />
<br />
Apache: Creating and Using an ".htaccess" File<br />
<br />
<br />
Below is a sample ".htaccess" file which goes in<br />
"/usr/local/apache/htdocs/chirico/alpha/.htaccess" for this<br />
example<br />
<br />
<br />
AuthUserFile /usr/local/apache/htdocs/chirico/alpha/.htpasswd<br />
AuthGroupFile /dev/null<br />
AuthName "Your Name and regular password required"<br />
AuthType Basic<br />
<br />
<Limit GET POST><br />
require valid-user<br />
</Limit><br />
<br />
In order for this to work /usr/local/apache/conf/httpd.conf must<br />
have the following line in it:<br />
<br />
<br />
#<br />
<Directory /usr/local/apache/htdocs/chirico/alpha><br />
AllowOverride FileInfo AuthConfig Limit<br />
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec<br />
<Limit GET POST OPTIONS PROPFIND><br />
Order allow,deny<br />
Allow from all<br />
</Limit><br />
<LimitExcept GET POST OPTIONS PROPFIND><br />
Order deny,allow<br />
Deny from all<br />
</LimitExcept><br />
</Directory><br />
<br />
<br />
<br />
Also, a password file must be created<br />
<br />
$ /usr/local/apache/bin/htpasswd -c .htpasswd chirico<br />
<br />
And enter the user names and passwords.<br />
<br />
Next Reload Apache:<br />
<br />
$ /etc/init.d/httpd reload<br />
<br />
(Reference TIP 213 limit access to certain directories based on IP address).<br />
<br />
<br />
<br />
TIP 17:<br />
<br />
Working with "mt" Commands: reading and writing to tape.<br />
<br />
The following assumes the tape device is "/dev/st0"<br />
<br />
STEP 1 ( rewind the tape)<br />
<br />
# mt -f /dev/nst0 rewind<br />
<br />
STEP 2 (check to see if you are at block 0)<br />
<br />
# mt -f /dev/nst0 tell<br />
At block 0.<br />
<br />
STEP 3 (Backup "tar compress" directories "one" and "two")<br />
<br />
# tar -czf /dev/nst0 one two<br />
<br />
STEP 4 (Check to see what block you are at)<br />
<br />
# mt -f /dev/nst0 tell<br />
<br />
You should get something like block 2 at this point.<br />
<br />
STEP 5 (Rewind the tape)<br />
<br />
# mt -f /dev/nst0 rewind<br />
<br />
STEP 6 (List the files)<br />
<br />
# tar -tzf /dev/nst0<br />
one/<br />
one/test<br />
two/<br />
<br />
STEP 7 (Restore directory "one" into directory "junk"). Note, you<br />
have to first rewind the tape, since the last operation moved<br />
ahead 2 blocks. Check this with "mt -f /dev/nst0".<br />
<br />
# cd junk<br />
# mt -f /dev/nst0 rewind<br />
# mt -f /dev/nst0 tell<br />
At block 0.<br />
# tar -xzf /dev/nst0 one<br />
<br />
STEP 8 (Next, take a look to see what block the tape is at)<br />
<br />
# mt -f /dev/nst0 tell<br />
At block 2.<br />
<br />
STEP 9 (Now backup directories three and four)<br />
<br />
# tar -czf /dev/nst0 three four<br />
<br />
After backing up the files, the tape should be past block 2.<br />
Check this.<br />
<br />
# mt -f /dev/nst0 tell<br />
At block 4.<br />
<br />
Currently the following exist:<br />
<br />
At block 1:<br />
one/<br />
one/test<br />
two/<br />
<br />
At block 2:<br />
three/<br />
three/samplehere<br />
four/<br />
<br />
At block 4:<br />
(* This is empty *)<br />
<br />
A few notes. You can set the blocking factor and a label<br />
with tar. For example:<br />
<br />
$ tar --label="temp label" --create --blocking-factor=128 --file=/dev/nst0 Notes<br />
<br />
But note if you try to read it with the default, incorrect blocking<br />
factor, then, you will get the following error:<br />
<br />
$ tar -t --file=/dev/nst0<br />
tar: /dev/nst0: Cannot read: Cannot allocate memory<br />
tar: At beginning of tape, quitting now<br />
tar: Error is not recoverable: exiting now<br />
<br />
However this is easily fixed with the correct blocking factor<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ tar -t --blocking-factor=128 --file=/dev/nst0<br />
temp label<br />
Notes<br />
<br />
Take advantage of the label command.<br />
<br />
$ MYCOMMENTS="Big_important_tape"<br />
$ tar --label="$(date +%F)"+"${MYCOMMENTS}"<br />
<br />
Writing to tape on a remote 192.168.1.155 computer<br />
<br />
$ tar cvzf - ./tmp | ssh -l chirico 192.168.1.155 '(mt -f /dev/nst0 rewind; dd of=/dev/st0 )'<br />
<br />
Restoring the contents from tape on a remote computer<br />
<br />
$ ssh -l chirico 192.168.1.155 '(mt -f /dev/nst0 rewind; dd if=/dev/st0 )'|tar xzf -<br />
<br />
Getting data off of tape with dd command with odd blocking factor. Just set ibs very high<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ tar --label="Contenets of Notes" --create --blocking-factor=128 --file=/dev/nst0 Notes<br />
$ mt -f /dev/nst0 rewind<br />
$ dd ibs=1048576 if=/dev/st0 of=notes.tar<br />
<br />
The above will probably work with ibs=64k as well<br />
<br />
(Also see TIP 136)<br />
<br />
<br />
<br />
TIP 18:<br />
<br />
Encrypting Data to Tape using "tar" and "openssl".<br />
<br />
The following shows an example of writing the contents of "tapetest" to tape:<br />
<br />
$ tar zcvf - tapetest|openssl des3 -salt -k secretpassword | dd of=/dev/st0<br />
<br />
Reading the data back:<br />
<br />
$ dd if=/dev/st0|openssl des3 -d -k secretpassword|tar xzf -<br />
<br />
<br />
<br />
TIP 19:<br />
<br />
Mounting an ISO Image as a Filesystem -- this is great if you don't have the DVD<br />
hardware, but, need to get at the data. The following show an example of<br />
mounting the Fedora core 2 as a file.<br />
<br />
$ mkdir /iso0<br />
$ mount -o loop -t iso9660 /FC2-i386-DVD.iso /iso0<br />
<br />
Or to mount automatically at boot, add the following to "/etc/fstab"<br />
<br />
/FC2-i386-DVD.iso /iso0 iso9660 rw,loop 0 0<br />
<br />
<br />
Reference: http://umn.dl.sourceforge.net/sourceforge/souptonuts/README_fedora.txt<br />
<br />
<br />
<br />
TIP 20:<br />
<br />
Getting Information about the Hard drive and list all PCI devices.<br />
<br />
$ hdparm /dev/hda<br />
<br />
/dev/hda:<br />
multcount = 16 (on)<br />
IO_support = 0 (default 16-bit)<br />
unmaskirq = 0 (off)<br />
using_dma = 1 (on)<br />
keepsettings = 0 (off)<br />
readonly = 0 (off)<br />
readahead = 256 (on)<br />
geometry = 16383/255/63, sectors = 234375000, start = 0<br />
<br />
or for SCSI<br />
<br />
$ hdparm /dev/sda<br />
<br />
Try it with the -i option for information<br />
<br />
$ hdparm -i /dev/hda<br />
<br />
/dev/hda:<br />
<br />
Model=IC35L120AVV207-1, FwRev=V24OA66A, SerialNo=VNVD09G4CZ6E0T<br />
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }<br />
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=52<br />
BuffType=DualPortCache, BuffSize=7965kB, MaxMultSect=16, MultSect=16<br />
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=234375000<br />
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}<br />
PIO modes: pio0 pio1 pio2 pio3 pio4<br />
DMA modes: mdma0 mdma1 mdma2<br />
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5<br />
AdvancedPM=yes: disabled (255) WriteCache=enabled<br />
Drive conforms to: ATA/ATAPI-6 T13 1410D revision 3a: 2 3 4 5 6<br />
<br />
How fast is your drive?<br />
<br />
$ hdparm -tT /dev/hda<br />
<br />
/dev/hda:<br />
Timing buffer-cache reads: 128 MB in 0.41 seconds =315.32 MB/sec<br />
Timing buffered disk reads: 64 MB in 1.19 seconds = 53.65 MB/sec<br />
<br />
Need to find your device?<br />
<br />
$ mount<br />
or<br />
$ cat /proc/partitions<br />
or<br />
$ dmesg | egrep '^(s|h)d'<br />
<br />
which for my system lists:<br />
<br />
hda: IC35L120AVV207-1, ATA DISK drive<br />
hdc: Lite-On LTN486S 48x Max, ATAPI CD/DVD-ROM drive<br />
hda: max request size: 1024KiB<br />
hda: 234375000 sectors (120000 MB) w/7965KiB Cache, CHS=16383/255/63, UDMA(100)<br />
<br />
By the way, if you want to turn on dma<br />
<br />
$ hdparm -d1 /dev/hda<br />
setting using_dma to 1 (on)<br />
using_dma = 1 (on)<br />
<br />
(Also see TIP 122 )<br />
<br />
List all PCI devices<br />
<br />
$ lspci -v<br />
<br />
00:00.0 Host bridge: Intel Corp. 82845G/GL [Brookdale-G] Chipset Host Bridge (rev<br />
Subsystem: Dell Computer Corporation: Unknown device 0160<br />
Flags: bus master, fast devsel, latency 0<br />
Memory at f0000000 (32-bit, prefetchable) [size=128M]<br />
Capabilities: <available only to root><br />
<br />
... lots more ...<br />
<br />
Note, there is also lspci -vv for even more information.<br />
<br />
(Also see TIP 200)<br />
<br />
TIP 21:<br />
<br />
Setting up "cron" Jobs.<br />
<br />
If you want to use the emacs editor for editing cron jobs, then,<br />
set the following in your "/home/user/.bash_profile"<br />
<br />
EDITOR=emacs<br />
<br />
Then, to edit cron jobs<br />
<br />
$ crontab -e<br />
<br />
You may want to put in the following header<br />
<br />
#MINUTE(0-59) HOUR(0-23) DAYOFMONTH(1-31) MONTHOFYEAR(1-12) DAYOFWEEK(0-6) Note 0=Sun and 7=Sun<br />
#<br />
#14,15 10 * * 0 /usr/bin/somecommmand >/dev/null 2>&1<br />
<br />
The sample "commented out command" will run at 10:14 and 10:15 every Sunday. There will<br />
be no "mail" sent to the user because of the ">/dev/null 2>&1" entry.<br />
<br />
$ crontab -l<br />
<br />
The above will list all cron jobs. Or if you're root<br />
<br />
$ crontab -l -u <username><br />
$ crontab -e -u <username><br />
<br />
Reference "man 5 crontab":<br />
<br />
The time and date fields are:<br />
<br />
field allowed values<br />
----- --------------<br />
minute 0-59<br />
hour 0-23<br />
day of month 1-31<br />
month 1-12 (or names, see below)<br />
day of week 0-7 (0 or 7 is Sun, or use names)<br />
<br />
A field may be an asterisk (*), which always stands for ``first-last''.<br />
<br />
Ranges of numbers are allowed. Ranges are two numbers separated with a<br />
hyphen. The specified range is inclusive. For example, 8-11 for an<br />
``hours'' entry specifies execution at hours 8, 9, 10 and 11.<br />
<br />
Lists are allowed. A list is a set of numbers (or ranges) separated by<br />
commas. Examples: ``1,2,5,9'', ``0-4,8-12''.<br />
<br />
Ranges can include "steps", so "1-9/2" is the same as "1,3,5,7,9".<br />
<br />
Note, you can run just every 5 minutes as follows:<br />
<br />
*/5 * * * * /etc/mrtg/domrtg >/dev/null 2>&1<br />
<br />
To run jobs hourly,daily,weekly or monthly you can add shell scripts into the<br />
appropriate directory:<br />
<br />
/etc/cron.hourly/<br />
/etc/cron.daily/<br />
/etc/cron.weekly/<br />
/etc/cron.monthly/<br />
<br />
Note that the above are pre-configured schedules set in "/etc/crontab", so<br />
if you want, you can change the schedule. Below is my /etc/crontab:<br />
<br />
$ cat /etc/crontab<br />
SHELL=/bin/bash<br />
PATH=/sbin:/bin:/usr/sbin:/usr/bin<br />
MAILTO=root<br />
HOME=/<br />
<br />
# run-parts<br />
01 * * * * root run-parts /etc/cron.hourly<br />
02 4 * * * root run-parts /etc/cron.daily<br />
22 4 * * 0 root run-parts /etc/cron.weekly<br />
42 4 1 * * root run-parts /etc/cron.monthly<br />
<br />
<br />
<br />
TIP 22:<br />
<br />
Keeping Files in Sync Between Servers.<br />
<br />
The remote computer is "192.168.1.171" and has the account "donkey". You want<br />
to "keep in sync" the files under "/home/cu2000/Logs" on the remote computer<br />
with files on "/home/chirico/dev/MEDIA_Server" on the local computer.<br />
<br />
$ rsync -Lae ssh donkey@192.168.1.171:/home/cu2000/Logs /home/chirico/dev/MEDIA_Server<br />
<br />
"rsync" is a convient command for keeping files in sync, and as shown here will work<br />
through ssh. The -L option tells rsync to treat symbolic links like ordinary files.<br />
<br />
Also see [http://www.rsnapshot.org/]<br />
<br />
<br />
<br />
TIP 23:<br />
<br />
Looking up the Spelling of a Word.<br />
<br />
$ look <partial spelling><br />
<br />
so the following will list all words that<br />
start with stuff<br />
<br />
$ look stuff<br />
stuff<br />
stuffage<br />
stuffata<br />
stuffed<br />
stuffender<br />
stuffer<br />
stuffers<br />
stuffgownsman<br />
stuffier<br />
stuffiest<br />
stuffily<br />
stuffiness<br />
stuffinesses<br />
stuffiness's<br />
stuffing<br />
stuffings<br />
stuffing's<br />
stuffless<br />
stuffs<br />
stuffy<br />
<br />
It helps to have a large "linuxwords" dictionary. You can download<br />
a much bigger dictionary from the following:<br />
<br />
http://prdownloads.sourceforge.net/souptonuts/linuxwords.1.tar.gz?download<br />
<br />
Note: vim users can setup the .vimrc file with the following. Now when you type <br />
CTL-X CTL-T in insert mode, you'll get a thesaurus lookup.<br />
<br />
set dictionary+=/usr/share/dict/words<br />
set thesaurus+=/usr/share/dict/words<br />
<br />
Or, you can call aspell with the F6 command after putting the folling entry in your<br />
.vimrc file<br />
<br />
:nmap <F6> :w<CR>:!aspell -e -c %<CR>:e<CR><br />
<br />
Now, hit F6 when you're in vim, and you'll get a spell checker.<br />
<br />
<br />
There is also an X Windows dictionary that runs with the following command.<br />
<br />
$ gnome-dictionary<br />
<br />
<br />
<br />
TIP 24:<br />
<br />
Find out if a Command is Aliased.<br />
<br />
$ type -all <command><br />
<br />
Example:<br />
<br />
$ type -all ls<br />
ls is aliased to `ls --color=tty'<br />
ls is /bin/ls<br />
<br />
<br />
<br />
TIP 25:<br />
<br />
Create a Terminal Calculator<br />
<br />
Put the following in your .bashrc file<br />
<br />
function calc<br />
{<br />
echo "${1}"|bc -l;<br />
}<br />
<br />
Or, run it at the shell prompt. Now<br />
"calc" from the shell will work as follows:<br />
<br />
$ calc 3+45<br />
48<br />
<br />
All functions with a "(" or ")" must be enclosed<br />
in quotes. For instance, to get the sin of .4<br />
<br />
$ calc "s(.4)"<br />
.38941834230865049166<br />
<br />
(See TIP 115 using the expr command)<br />
<br />
<br />
<br />
TIP 26:<br />
<br />
Kill a User and All Their Current Processes.<br />
<br />
<br />
#!/bin/bash<br />
# This program will kill all processes from a<br />
# user. The user name is read from the command line.<br />
#<br />
# This program also demonstrates reading a bash variable<br />
# into an awk script.<br />
#<br />
# Usage: kill9user <user><br />
#<br />
kill -9 `ps aux|awk -v var=$1 '$1==var { print $2 }'`<br />
<br />
or if you want want to create the above script the command<br />
below will kill the user "donkey" and all of his processes.<br />
<br />
$ kill -9 `ps aux|awk -v var="donkey" '$1==var { print $2 }'`<br />
<br />
Check their cron jobs and "at" jobs, if you have a security issue.<br />
<br />
$ crontab -u <user> -e<br />
<br />
Lock the account:<br />
<br />
$ passwd -l <user><br />
<br />
Remove all authorized_keys<br />
<br />
$ rm /home/user/.shosts<br />
$ rm /home/user/.rhosts<br />
$ rm -rf /home/user/.ssh<br />
$ rm /home/user/.forward<br />
<br />
or consider<br />
<br />
$ mv /home/user /home/safeuser<br />
<br />
<br />
Change the shell<br />
<br />
$ chsh -s /bin/true <user><br />
<br />
Do an inventory<br />
<br />
$ find / -user <user> > list_of_user_files<br />
<br />
NOTE: Also see (TIP 10).<br />
<br />
To see all users, except the current user. Do not use the<br />
dash "ps -aux" is wrong but the following is correct:<br />
<br />
$ ps aux| awk '!/'${USER}'/{printf("%s \n",$0)}'<br />
<br />
or (ww = wide, wide output)<br />
<br />
$ ps auwwx| awk '!/'${USER}'/{printf("%s \n",$0)}'<br />
<br />
<br />
The following codes may be useful:<br />
<br />
D Uninterruptible sleep (usually IO)<br />
R Running or runnable (on run queue)<br />
S Interruptible sleep (waiting for an event to complete)<br />
T Stopped, either by a job control signal or because it is being traced.<br />
W paging (not valid since the 2.6.xx kernel)<br />
X dead (should never be seen)<br />
Z Defunct ("zombie") process, terminated but not reaped by its parent.<br />
<br />
For BSD formats and when the stat keyword is used, additional<br />
characters may be displayed:<br />
<br />
< high-priority (not nice to other users)<br />
N low-priority (nice to other users)<br />
L has pages locked into memory (for real-time and custom IO)<br />
s is a session leader<br />
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)<br />
+ is in the foreground process group<br />
<br />
<br />
Also see TIP 28. and TIP 89.<br />
<br />
<br />
<br />
TIP 27:<br />
<br />
Format Dates for Logs and Files<br />
<br />
$ date "+%m%d%y %A,%B %d %Y %X"<br />
061704 Thursday,June 17 2004 07:13:40 PM<br />
<br />
$ date "+%m%d%Y"<br />
06172004<br />
<br />
$ date -d '1 day ago' "+%m%d%Y"<br />
06162004<br />
<br />
$ date -d '3 months 1 day 2 hour 15 minutes 2 seconds ago'<br />
<br />
or to go into the future remove the "ago"<br />
<br />
$ date -d '3 months 1 day 2 hour 15 minutes 2 seconds '<br />
<br />
Also the following works:<br />
<br />
$ date -d '+2 year +1 month -1 week +3 day -8 hour +2 min -5 seconds'<br />
<br />
Quick question: If there are 100,000,000 stars in the visible sky, and you can<br />
count them, round the clock, at a rate of a star per second starting now, when<br />
would you finish counting? Would you still be alive?<br />
<br />
$ date -d '+100000000 seconds'<br />
<br />
Sooner than you think!<br />
<br />
This can be assigned to variables<br />
<br />
$ mdate=`date -d '3 months 1 day 2 hour 15 minutes 2 seconds ' "+%m%d%Y_%A_%B_%D_%Y_%X" `<br />
$ echo $mdate<br />
09182004_Saturday_September_09/18/04_2004_09:40:41 PM<br />
^---- Easy to sort ^-------^----- Easy to read<br />
<br />
See TIP 28 below.<br />
<br />
See TIP 87 when working with large delta time changes -40 years, or -200 years ago, or even<br />
1,000,000 days into the future.<br />
<br />
Also see (TIP 1) for working with time zones.<br />
<br />
<br />
<br />
TIP 28:<br />
<br />
Need Ascii Codes? For instance, for printing quotes:<br />
<br />
awk 'BEGIN { msg = "Don\047t Panic!"; printf "%s \n",msg }'<br />
or<br />
awk 'BEGIN { msg = "Don\x027t Panic!"; printf "%s \n",msg }'<br />
<br />
It's better to use \047, because certain characters that follow \x027 may cause problems.<br />
<br />
For example, take a look at the following two lines. The first line prints a "}" caused<br />
by the extra D in \x027D. The the line immediately below does not work as expected.<br />
<br />
awk 'BEGIN {printf("The D causes problems \x027D\n")}'<br />
<br />
However, the line below works fine:<br />
<br />
awk 'BEGIN {printf("The D does not cause problems \047D\n")}'<br />
<br />
Or if you wanted to use the date command in "awk" to print date.time.nanosecond.timezone for<br />
each line of a file "test".<br />
<br />
The following date can be used in awk because the single quotes are enclosed within the<br />
double quotes.<br />
<br />
date '+%m%d%Y.%H%M%S.%N%z'<br />
<br />
$ awk 'BEGIN { "date '+%m%d%Y.%H%M%S.%N%z'" | getline MyDate } { print MyDate,$0 }' < data<br />
<br />
But it's also possible to replace "+" with \x2B, "%" with \x25, and "d" with \x64 as follows:<br />
<br />
$ awk 'BEGIN { "date \x27\x2B\x25m\x25\x64\x25Y.\x25H\x25M\x25S.\x25N\x25z\x27" | getline MyDate } { print MyDate,$0 }' < test<br />
<br />
07062004.113820.346033000-0400 bob 71<br />
07062004.113820.346033000-0400 tom 43<br />
07062004.113820.346033000-0400 sal 34<br />
07062004.113820.346033000-0400 bob 89<br />
07062004.113820.346033000-0400 tom 66<br />
07062004.113820.346033000-0400 sal 99<br />
<br />
For this example it's not needed because single quotes are used inside of double quotes; however, there may be times when<br />
hex replacement is easier.<br />
<br />
<br />
$ man ascii<br />
<br />
Oct Dec Hex Char Oct Dec Hex Char<br />
-----------------------------------------------------------<br />
000 0 00 NUL '\0' 100 64 40 @<br />
001 1 01 SOH 101 65 41 A<br />
002 2 02 STX 102 66 42 B<br />
003 3 03 ETX 103 67 43 C<br />
004 4 04 EOT 104 68 44 D<br />
005 5 05 ENQ 105 69 45 E<br />
006 6 06 ACK 106 70 46 F<br />
007 7 07 BEL '\a' 107 71 47 G<br />
010 8 08 BS '\b' 110 72 48 H<br />
011 9 09 HT '\t' 111 73 49 I<br />
012 10 0A LF '\n' 112 74 4A J<br />
013 11 0B VT '\v' 113 75 4B K<br />
014 12 0C FF '\f' 114 76 4C L<br />
015 13 0D CR '\r' 115 77 4D M<br />
016 14 0E SO 116 78 4E N<br />
017 15 0F SI 117 79 4F O<br />
020 16 10 DLE 120 80 50 P<br />
021 17 11 DC1 121 81 51 Q<br />
022 18 12 DC2 122 82 52 R<br />
023 19 13 DC3 123 83 53 S<br />
024 20 14 DC4 124 84 54 T<br />
025 21 15 NAK 125 85 55 U<br />
026 22 16 SYN 126 86 56 V<br />
027 23 17 ETB 127 87 57 W<br />
030 24 18 CAN 130 88 58 X<br />
031 25 19 EM 131 89 59 Y<br />
032 26 1A SUB 132 90 5A Z<br />
033 27 1B ESC 133 91 5B [<br />
034 28 1C FS 134 92 5C \ '\\'<br />
035 29 1D GS 135 93 5D ]<br />
036 30 1E RS 136 94 5E ^<br />
037 31 1F US 137 95 5F _<br />
040 32 20 SPACE 140 96 60 `<br />
041 33 21 ! 141 97 61 a<br />
042 34 22 " 142 98 62 b<br />
043 35 23 # 143 99 63 c<br />
044 36 24 $ 144 100 64 d<br />
045 37 25 % 145 101 65 e<br />
046 38 26 & 146 102 66 f<br />
047 39 27 ' 147 103 67 g<br />
050 40 28 ( 150 104 68 h<br />
051 41 29 ) 151 105 69 i<br />
052 42 2A * 152 106 6A j<br />
053 43 2B + 153 107 6B k<br />
054 44 2C , 154 108 6C l<br />
055 45 2D - 155 109 6D m<br />
056 46 2E . 156 110 6E n<br />
057 47 2F / 157 111 6F o<br />
060 48 30 0 160 112 70 p<br />
061 49 31 1 161 113 71 q<br />
062 50 32 2 162 114 72 r<br />
063 51 33 3 163 115 73 s<br />
064 52 34 4 164 116 74 t<br />
065 53 35 5 165 117 75 u<br />
066 54 36 6 166 118 76 v<br />
067 55 37 7 167 119 77 w<br />
070 56 38 8 170 120 78 x<br />
071 57 39 9 171 121 79 y<br />
072 58 3A : 172 122 7A z<br />
073 59 3B ; 173 123 7B {<br />
074 60 3C < 174 124 7C |<br />
075 61 3D = 175 125 7D }<br />
076 62 3E > 176 126 7E ~<br />
077 63 3F ? 177 127 7F DEL<br />
<br />
<br />
<br />
TIP 29:<br />
<br />
Need a WWW Browser for the Terminal Session? Try lynx or elinks.<br />
<br />
$ lynx<br />
<br />
Or to read all these tips, with the latest updates<br />
<br />
$ lynx http://umn.dl.sourceforge.net/sourceforge/souptonuts/How_to_Linux_and_Open_Source.txt<br />
<br />
<br />
Or, better yet elinks.<br />
<br />
$ elinks http://somepage.<br />
<br />
You can get elinks at the following site:<br />
<br />
http://elinks.or.cz/<br />
<br />
<br />
<br />
TIP 30:<br />
<br />
screen - screen manager with VT100/ANSI terminal emulation<br />
<br />
This is an excellent utility. But if you work a lot in Emacs,<br />
then, you should place the following in your ~./.bashrc<br />
<br />
alias s='screen -e^Pa -D -R'<br />
<br />
After loging in again (or source .bashrc) ,<br />
type the following to load "screen":<br />
<br />
$ s<br />
<br />
If you're using the not using the alias command above, substitute<br />
CTL-a for CTL-p below. :<br />
<br />
CTL-p CTL-C To get a new session<br />
CTL-p " To list sessions, and arrow keys to move<br />
CTL-p SHFT-A To name sessions<br />
CTL-p S To split screens<br />
CLT-p Q To unsplit screens<br />
CLT-p TAB To switch between screens<br />
CLT-p :resize n To resize screen to n rows, on split screen<br />
<br />
<br />
Screen is very powerful. Should you become disconneced, you can<br />
still resume work after loggin in.<br />
<br />
$ man screen<br />
<br />
The above command will give you more information.<br />
<br />
<br />
<br />
TIP 31:<br />
<br />
Need to Find the Factors of a Number?<br />
<br />
$ factor 2345678992<br />
2345678992: 2 2 2 2 6581 22277<br />
<br />
It's a quick way to find out if a number is prime<br />
<br />
$ factor 7867<br />
7867: 7867<br />
<br />
<br />
<br />
TIP 32:<br />
<br />
Less is More -- piping to less to scroll backword and forward<br />
<br />
For large "ls" listings try the followin, then, use the arrow key<br />
to move up and down the list.<br />
<br />
$ ls /some_large_dir/ | less<br />
<br />
or<br />
<br />
$ cat some_large_file | less<br />
<br />
or<br />
<br />
$ less some_large_file<br />
<br />
<br />
<br />
TIP 33:<br />
<br />
C "indent" Settings for Kernel Development<br />
<br />
$ indent -kr -i8 program.c<br />
<br />
<br />
<br />
TIP 34:<br />
<br />
FTP auto-login. "ftp" to a site and have the password stored.<br />
<br />
For instance, here's a sample ".net" file in a user's home<br />
directory for uploading to sourceforge. Note, sourceforge will<br />
take any password, so m@temp.com is used here for login "anonymous".<br />
<br />
$ cat ~/.netrc<br />
machine upload.sourceforge.net login anonymous password m@temp.com<br />
default login anonymous password user@site<br />
<br />
It might be a good idea to change the rights on this file<br />
<br />
$ chmod 0400 ~/.netrc<br />
<br />
<br />
#!/bin/bash<br />
#<br />
# Sample ftp automated script to download<br />
# file to ${dwnld}<br />
#<br />
dwnld="/work/faq/unix-faq"<br />
cd ${dwnld}<br />
ftp << FTPSTRING<br />
prompt off<br />
open rtfm.mit.edu<br />
cd /pub/usenet-by-group/news.answers/unix-faq/faq<br />
mget contents<br />
mget diff<br />
mget part*<br />
bye<br />
FTPSTRING<br />
<br />
<br />
(Also see TIP 114 for ncftpget, which is a very powerful restarting<br />
ftp program)<br />
<br />
<br />
<br />
TIP 35:<br />
<br />
Bash Brace Expansion<br />
<br />
$ echo f{ee,ie,oe,um}<br />
fee fie foe fum<br />
<br />
This works with almost any command<br />
<br />
$ mkdir -p /work/junk/{one,two,three,four}<br />
<br />
<br />
<br />
TIP 36:<br />
<br />
Getting a List of Users on the System<br />
<br />
$ cut -d: -f1 /etc/passwd | sort<br />
<br />
<br />
<br />
TIP 37:<br />
<br />
Editing a Bash Command<br />
<br />
Try typing a long command say, then, type "fc" for an easy way<br />
to edit the command.<br />
<br />
$ find /etc -iname '*.cnf' -exec grep -H 'log' {} \;<br />
$ fc<br />
<br />
"fc" will bring the last command typed into an editor, "emacs" if<br />
that's the default editor. Type "fc -l" to list last few commands.<br />
<br />
To seach for a command, try typing "CTL-r" at the shell prompt for<br />
searching. "CTL-t" to transpose, say "sl" was typed by you want "ls".<br />
<br />
<br />
<br />
Hints when using "fc: in emacs:<br />
<br />
ESC-b move one word backward<br />
ESC-f move one word forward<br />
ESC-DEL kill one word backward<br />
CTL-k kill point to end<br />
CTL-y un-yank killed region at point<br />
<br />
<br />
<br />
TIP 38:<br />
<br />
Moving around Directories.<br />
<br />
Change to the home directory:<br />
$ cd ~<br />
or<br />
$ cd<br />
<br />
To go back to the last directory<br />
$ cd -<br />
<br />
Instead of "cd" to a directory try "pushd" and look<br />
at the heading...you can see a list of directories.<br />
<br />
$ pushd /etc<br />
$ pushd /usr/local<br />
<br />
Then, to get back "popd" or "popd 1"<br />
<br />
To list all the directories pushed on the stack<br />
use the "dirs -v" command.<br />
<br />
$ dirs -v<br />
0 /usr/local<br />
1 /etc<br />
2 /work/souptonuts/documentation/theBook<br />
<br />
Now, if you "pushd +1" you will be moved to "/etc", since<br />
is number "1" on the stack, and this directory will become<br />
"0".<br />
<br />
$ pwd<br />
/usr/local<br />
$ pushd +1<br />
$ pwd<br />
/etc<br />
<br />
$ dirs -v<br />
0 /etc<br />
1 /work/souptonuts/documentation/theBook<br />
2 /usr/local<br />
<br />
<br />
<br />
TIP 39:<br />
<br />
Need an Underscore after a Variable?<br />
<br />
Enclose the variable in "{}".<br />
<br />
$echo ${UID}_<br />
<br />
Compare to<br />
<br />
$echo $UID_<br />
<br />
Also try the following:<br />
<br />
<br />
$ m="my stuff here"<br />
$ echo -e ${m// /'\n'}<br />
my<br />
stuff<br />
here<br />
<br />
<br />
<br />
TIP 40:<br />
<br />
Bash Variable Offset and String Operators<br />
<br />
$ r="this is stuff"<br />
$ echo ${r:3}<br />
$ echo ${r:5:2}<br />
<br />
Note, ${varname:offset:length}<br />
<br />
<br />
${varname:?message} If varname exist and isn't null return value, else,<br />
print var and message.<br />
<br />
$ r="new stuff"<br />
$ echo ${r:? "that's r for you"}<br />
new stuff<br />
$ unset r<br />
$ echo ${r:? "that's r for you"}<br />
bash: r: that's r for you<br />
<br />
${varname:+word} If varname exist and not null return word. Else, return null.<br />
<br />
${varname:-word} If varname exist and not null return value. Else, return word.<br />
<br />
Working with arrays in bash - bash arrays.<br />
<br />
$ unset p<br />
$ p=(one two three)<br />
<br />
$ echo -e "${p[@]}"<br />
one two three<br />
<br />
or<br />
<br />
$ echo -e "${p[*]}"<br />
one two three<br />
<br />
$ echo -e "${#p[@]}"<br />
3<br />
<br />
$ echo -e "${p[0]}"<br />
one<br />
<br />
$ echo -e "${p[1]}"<br />
two<br />
<br />
Also see (TIP 95)<br />
<br />
<br />
<br />
TIP 41:<br />
<br />
Loops in Bash<br />
<br />
<br />
The command below loops through directories listed in $PATH.<br />
<br />
$ path=$PATH:<br />
$ while [ $path ]; do echo " ${path%%:*} "; path=${path#*:}; done<br />
<br />
The command below will also loop through directories in your path.<br />
<br />
$IFS=:<br />
$ for dir in $PATH<br />
> do<br />
> ls -ld $dir<br />
> done<br />
drwxr-xr-x 2 root root 4096 Jun 10 20:16 /usr/local/bin<br />
drwxr-xr-x 2 root root 4096 Jun 13 23:12 /bin<br />
drwxr-xr-x 3 root root 40960 Jun 12 08:00 /usr/bin<br />
drwxr-xr-x 2 root root 4096 Feb 14 03:12 /usr/X11R6/bin<br />
drwxrwxr-x 2 chirico chirico 4096 Jun 6 13:06 /home/chirico/bin<br />
<br />
Other ways of doing loops:<br />
<br />
for (( i=1; i <= 20; i++))<br />
do<br />
echo -n "$i "<br />
done<br />
<br />
Note, to do it all on one line, do the following:<br />
<br />
$ for (( i=1; i <= 20; i++)); do echo -n "$i"; done<br />
<br />
Below, is an example of declaring i an integer so that you do not<br />
have to preface with let.<br />
<br />
$ declare -i i<br />
$ i=5;<br />
$ while (( $i > 1 )); do<br />
> i=i-1<br />
> echo $i<br />
> done<br />
4<br />
3<br />
2<br />
<br />
You can also use "while [ $i -gt 1 ]; do" in place of "while (( $i > 1 )); do"<br />
<br />
To get a listing of all declared values<br />
<br />
$ declare -i<br />
<br />
<br />
Try putting a few words in the file "test"<br />
<br />
$ while read filename; do echo "- $filename "; done < test |nl -w1<br />
<br />
Or, using an array<br />
<br />
declare -a Array<br />
Array[0]="zero"<br />
Array[1]="one"<br />
Array[2]="two"<br />
for i in `seq ${#Array[@]}`<br />
do<br />
echo $Array[$i-1]<br />
done<br />
<br />
Also see (TIP 95 and TIP 133).<br />
<br />
<br />
<br />
TIP 42:<br />
<br />
"diff" and "patch".<br />
<br />
You have created a program "prog.c", saved as this name and also copied<br />
to "prog.c.old". You post "prog.c" to users. Next, you make changes<br />
to prog.c<br />
<br />
$ diff -c prog.c.old prog.c > prog.patch<br />
<br />
Now, users can get the latest updates by running.<br />
<br />
$ patch < prog.patch<br />
<br />
By the way, you can make backups of your data easily.<br />
<br />
$ cp /etc/fstab{,.bak}<br />
<br />
Now, you do your edits to "/etc/fstab" and if you need<br />
to go back to the original, you can find it at<br />
"/etc/fstab.bak".<br />
<br />
<br />
<br />
TIP 43:<br />
<br />
"cat" the Contents of Files Listed in a File, in That Order.<br />
<br />
SETUP (Assume you have the following)<br />
<br />
$ cat file_of_files<br />
file1<br />
file2<br />
<br />
$ cat file1<br />
This is the data in file1<br />
<br />
$ cat file 2<br />
This is the data in file2<br />
<br />
So there are 3 files here "file_of_files" which contains the name of<br />
other files. In this case "file1" and "file2". And the contents of<br />
"file1" and "file2" is shown above.<br />
<br />
$ cat file_of_files|xargs cat<br />
This is the data in file1<br />
This is the data in file2<br />
<br />
<br />
<br />
<br />
TIP 44:<br />
<br />
Columns and Rows -- getting anything you want.<br />
<br />
Assume you have the following file.<br />
<br />
$ cat data<br />
1 2 3<br />
4 5<br />
6 7 8 9 10<br />
11 12<br />
13 14<br />
<br />
How to you get everything in 2 columns?<br />
<br />
$ cat data|tr ' ' '\n'|xargs -l2<br />
1 2<br />
3 4<br />
5 6<br />
7 8<br />
9 10<br />
11 12<br />
13 14<br />
<br />
Three columns?<br />
<br />
$ cat data|tr ' ' '\n'|xargs -l3<br />
1 2 3<br />
4 5 6<br />
7 8 9<br />
10 11 12<br />
13 14<br />
<br />
What's the row sum of the "three columns?"<br />
<br />
$ cat data|tr ' ' '\n'|xargs -l3|tr ' ' '+'|bc<br />
6<br />
15<br />
24<br />
33<br />
27<br />
<br />
or<br />
<br />
$ tr ' ' '\n' < data |xargs -l3|tr ' ' '+'|bc<br />
<br />
NOTE "Steven Heiner's rule":<br />
<br />
cat one_file | program<br />
<br />
can always be rewritten as<br />
<br />
program < one_file<br />
<br />
Note: thanks to Steven Heiner (http://www.shelldorado.com/) the above can be<br />
shortened as follows:<br />
<br />
$ tr ' ' '\n' < data|xargs -l3|tr ' ' '+'|bc<br />
<br />
Need to "tr" from the stdin?<br />
<br />
$ tr "xy" "yx"| ... | ...<br />
<br />
But there is a the "Stephane CHAZELAS" condition here<br />
<br />
"Note that tr, sed, and awk mail fail on files containing '\0'<br />
sed and awk have unspecified behaviors if the input<br />
doesn't end in a '\n' (or to sum up, cat works for<br />
binary and text files, text utilities such as sed or awk<br />
work only for text files).<br />
<br />
<br />
<br />
TIP 45:<br />
<br />
Auto Directory Spelling Corrections.<br />
<br />
To turn this on:<br />
<br />
$ shopt -s cdspell<br />
<br />
Now mispell a directory in the cd command.<br />
<br />
$ cd /usk/local<br />
^-------- still gets you to --<br />
|<br />
/usr/local<br />
<br />
What other options can you set? The following will list<br />
all the options:<br />
<br />
$ shopt -p<br />
<br />
<br />
<br />
TIP 46:<br />
<br />
Record Eveything Printed on Your Terminal Screen.<br />
<br />
$ script -a <filename><br />
<br />
Now start doing stuff and "everything" is appended to <filename>.<br />
For example<br />
<br />
$ script installation<br />
<br />
$ (command)<br />
<br />
$ (result)<br />
<br />
$ ...<br />
<br />
$ ...<br />
<br />
$ (command)<br />
<br />
$ (result)<br />
<br />
$ exit<br />
<br />
The whole session log is in the installation file that you can later<br />
read and/or cleanup and add to a documentation.<br />
<br />
This command can also be used to redirect the contents to another user,<br />
but you must be root to do this.<br />
<br />
Step 1 - find out what pts they are using.<br />
<br />
$ w<br />
<br />
Step 2 - Run script on that pts. After running this command below<br />
everything you type will appear on their screen.<br />
<br />
$ script /dev/pts/4<br />
<br />
<br />
Thanks to Jacques.GARNIER-EXTERIEUR@EU.RHODIA.COM for his contribution<br />
to this tip.<br />
<br />
Also reference TIP 208.<br />
<br />
<br />
<br />
TIP 47:<br />
<br />
Monitor all Network Traffic Except Your Current ssh Connection.<br />
<br />
$ tcpdump -i eth0 -nN -vvv -xX -s 1500 port not 22<br />
<br />
Or to filter out port 123 as well getting the full length of the packet<br />
(-s 0), use the following:<br />
<br />
$ tcpdump -i eth0 -nN -vvv -xX -s 0 port not 22 and port not 123<br />
<br />
Or to filter only a certain host say 81.169.158.205<br />
<br />
$ tcpdump -i eth0 -nN -vvv -xX port not 22 and host 81.169.158.205<br />
<br />
Just want ip addresses and a little bit of data, then,<br />
use this. The "-c 20" is to stop after 20 packets.<br />
<br />
$ tcpdump -i eth0 -nN -s 1500 port not 22 -c 20<br />
<br />
If you're looking for sign of DOS attacks, the following show just the SYN<br />
packets on all interfaces:<br />
<br />
$ tcpdump 'tcp[13] & 2 == 2'<br />
<br />
<br />
<br />
TIP 48:<br />
<br />
Where are the GNU Reference Manuals?<br />
<br />
http://www.gnu.org/manual/manual.html<br />
<br />
Also worth a look the "Linux Documentation Project"<br />
<br />
http://en.tldp.org/<br />
<br />
and Red Hat manuals<br />
<br />
http://www.redhat.com/docs/manuals/enterprise/<br />
<br />
<br />
<br />
TIP 49:<br />
<br />
Setting or Changing the Library Path.<br />
<br />
The following contains the settings to be added or deleted<br />
<br />
/etc/ld.so.conf<br />
<br />
After this file is edited, you must run the following:<br />
<br />
$ ldconfig<br />
<br />
See "man ldconfig" for more information.<br />
<br />
<br />
<br />
TIP 50:<br />
<br />
Working with Libraries in C<br />
<br />
Assume the following 3 programs:<br />
<br />
$ cat ./src/test.c<br />
<br />
int test(int t)<br />
{<br />
printf("%d\n",t);<br />
return t;<br />
}<br />
<br />
<br />
$ cat ./src/prog1.c<br />
<br />
/*<br />
program: prog1.c<br />
dependences: test.c<br />
<br />
compiling this program:<br />
gcc -o prog test.c prog1.c<br />
<br />
Note the libpersonal include<br />
should be remove if NOT using the<br />
library<br />
*/<br />
<br />
#include <libpersonal.h><br />
#include <stdio.h><br />
int<br />
main(int argc, char **argv)<br />
{<br />
test(45);<br />
}<br />
<br />
$ cat ./include/libpersonal.h<br />
<br />
extern int test(int);<br />
<br />
<br />
Prog1.c needs the test function in test.c<br />
To compile, so that both programs work together, do the following:<br />
<br />
$ cd src<br />
$ gcc -o prog test.c prog1.c -I../include<br />
<br />
However, if you want to create your own static library, then, run the following:<br />
<br />
$ mkdir -p ../lib<br />
$ gcc -c test.c -o ../lib/test.o<br />
$ cd ../lib<br />
$ ar r libpersonal.a test.o<br />
$ ranlib libpersonal.a<br />
<br />
or, the ar and ranlib command can be combined as follows:<br />
<br />
$ ar rs libpersonal.a test.o<br />
<br />
To compile the program with the static library:<br />
<br />
$ cd ../src<br />
$ gcc -I../include -L../lib -o prog1 prog1.c -lpersonal<br />
<br />
<br />
The -I../include tells gcc to look in the ../include directory for<br />
libpersonal.h. and -L../lib, tells gcc to look for the<br />
"libpersonal.a" library.<br />
<br />
$ cd ..<br />
$ tree src lib include<br />
src<br />
|-- prog<br />
|-- prog1<br />
|-- prog1.c<br />
`-- test.c<br />
lib<br />
|-- libpersonal.a<br />
`-- test.o<br />
include<br />
`-- libpersonal.h<br />
<br />
This was a STATIC library. Often times you will want to use a SHARED<br />
or dynamic library.<br />
<br />
SHARED LIBRARY:<br />
<br />
You must recompile test.c with -fpic option.<br />
<br />
$ cd ../lib<br />
$ gcc -c -fpic ../src/test.c -o test.o<br />
<br />
Next create the libpersonal.so file.<br />
<br />
$ gcc -shared -o libpersonal.so test.o<br />
<br />
Now, compile the source prog1.c as follows:<br />
<br />
$ cd ../src<br />
$ gcc -Wl,-R../lib -L../lib -I../include -o prog2 prog1.c -lpersonal<br />
<br />
This should work fine. But, take a look at prog2 using the ldd command.<br />
<br />
$ ldd prog2<br />
<br />
libpersonal.so => ../lib/libpersonal.so (0x40017000)<br />
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)<br />
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)<br />
<br />
If you move the program prog2 to a different location, it will not run.<br />
Instead you will get the following error:<br />
<br />
prog2: error while loading shared libraries: libpersonal.so:<br />
cannot open shared object file: No such file or directory<br />
<br />
To fix this, you should specify the direct path to the library. And in my<br />
case it is rather long<br />
<br />
$ gcc -Wl,-R/work/souptonuts/documentation/theBook/lib -L../lib -I../include -o prog2 prog1.c -lpersonal<br />
<br />
SPECIAL NOTE: The -R must always follow the -Wl. (-Wl,-R<directory>) They always go together<br />
<br />
<br />
<br />
TIP 51:<br />
<br />
Actively Monitor a File and Send Email when Expression Occurs.<br />
<br />
This is a way to monitor "/var/log/messages" or any file for certain changes.<br />
The example below actively monitors "stuff" for the work "now" and as soon as<br />
"now" is added to the file, the contents of msg are sent to the user<br />
mikechirico@hotmail.com<br />
<br />
$ tail -f stuff | \<br />
awk ' /now/ { system("mail -s \"This is working\" mikechirico@hotmail.com < msg") }'<br />
<br />
Or, you can run a program, say get headings on slashdot from the program "getslash.php" which<br />
runs on "192.168.1.155" with account "chirico". Assuming you have ssh keys setup, then, the following<br />
will send mail from the output:<br />
<br />
$ ssh chirico@192.168.1.155 "./bin/getslash.php"|mail -s "Slash cron Headlines" mchirico@comcast.net<br />
<br />
See (TIP 80) for scraping the headings on slash dot and how to get a copy of "getslash.php". If you still<br />
want to use awk:<br />
<br />
$ ssh chirico@192.168.1.155 "./bin/getslash.php"| \<br />
awk '{ print $0 | "mail -s \x27 Slash Topics \x27 mchirico@comcast.net "}'<br />
<br />
Note the "\x27" is a quote. Maybe you only want articles dealing with "Linux":<br />
<br />
$ ssh chirico@192.168.1.155 "./bin/getslash.php"| \<br />
awk '/Linux/{ print $0 | "mail -s \x27 Slash Topics \x27 mchirico@comcast.net "}'<br />
<br />
For $60, you can get a numeric display from "delcom engineering" that you can send messages and<br />
data to. I get weather information off the internet and send it to this device.<br />
<br />
http://sourceforge.net/projects/delcom/<br />
<br />
(Reference TIP 151 for ssh tips)<br />
<br />
<br />
<br />
TIP 52:<br />
<br />
Need to Keep Secrets? Encrypt it.<br />
<br />
To Encrypt:<br />
<br />
$ openssl des3 -salt -in file.txt -out file.des3<br />
<br />
The above will prompt for a password, or you can put it in<br />
with a -k option, assuming you're on a trusted server.<br />
<br />
To Decrypt<br />
<br />
$ openssl des3 -d -salt -in file.des3 -out file.txt -k mypassword<br />
<br />
Need to encrypt what you type? Enter the following, then start typing<br />
and ^D to end.<br />
<br />
$ openssl des3 -salt -out stuff.txt<br />
<br />
<br />
<br />
TIP 53:<br />
<br />
Check that a File has Not Been Tampered With: Use Cryptographic Hashing Function.<br />
<br />
The md5sum is popular but dated<br />
<br />
$ md5sum file<br />
<br />
Instead, use one of the following;<br />
<br />
$ openssl dgst -sha1 -c file<br />
<br />
$ openssl dgst -ripemd160 -c file<br />
<br />
All calls give a fixed length string or "message digest".<br />
<br />
<br />
<br />
TIP 54:<br />
<br />
Need to View Information About a Secure Web Server? A SSL/TLS test.<br />
<br />
$ openssl s_client -connect www.sourceforge.net:443<br />
<br />
Above will give a long listing of certificates.<br />
<br />
Note, it is also possible to get certificate information about a mail server<br />
<br />
$ openssl s_client -connect mail.comcast.net:995 -showcerts<br />
<br />
When you do the above command you get two certificates. If you copy<br />
past both certificates by taking the following contents include the<br />
begin and end show below:<br />
<br />
-----BEGIN CERTIFICATE-----<br />
....<br />
-----END CERTIFICATE-----<br />
<br />
Then create files "comcast0.pem" and "comcast1.pem" out of these certificaties and<br />
put them in a directory "/home/donkey/.certs", then, with the openssl src package, in<br />
the "./tools/c_rehash" run<br />
<br />
$ c_rehash .certs<br />
Doing .certs<br />
comcast0.pem => 72f90dc0.0<br />
comcast1.pem => f73e89fd.0<br />
<br />
Now it's possible to have fetchmail work with these certs.<br />
<br />
#<br />
#<br />
# Sample .fetchmailrc file for Comcast<br />
#<br />
# Check mail every 90 seconds<br />
set daemon 90<br />
set syslog<br />
set postmaster donkey<br />
#set bouncemail<br />
#<br />
# Comcast email is zdonkey but computer account is just donkey<br />
#<br />
poll mail.comcast.net with proto POP3 and options no dns<br />
user 'zdonkey' with pass "somethin35" is 'donkey' here options ssl sslcertck sslcertpath '/home/donkey/.certs'<br />
smtphost comcast.net<br />
# currently not used<br />
mda '/usr/bin/procmail -d %T'<br />
<br />
<br />
REFERENCE: http://www.openssl.org/<br />
http://www.catb.org/~esr/fetchmail/fetchmail-6.2.5.tar.gz<br />
http://www.madboa.com/geek/openssl/<br />
<br />
<br />
<br />
TIP 55:<br />
<br />
cp --parents. What does this option do?<br />
<br />
Assume you have the following directory structure<br />
<br />
.<br />
|-- a<br />
| `-- b<br />
| `-- c<br />
| `-- d<br />
| |-- file1<br />
| `-- file2<br />
`-- newdir<br />
<br />
<br />
Issue the following command:<br />
<br />
$ cp --parents ./a/b/c/d/* ./newdir/<br />
<br />
Now you have the following:<br />
<br />
.<br />
|-- a<br />
| `-- b<br />
| `-- c<br />
| `-- d<br />
| |-- file1<br />
| `-- file2<br />
`-- newdir<br />
`-- a<br />
`-- b<br />
`-- c<br />
`-- d<br />
|-- file1<br />
`-- file2<br />
<br />
<br />
<br />
<br />
TIP 56:<br />
<br />
Quickly Locating files.<br />
<br />
The "locate" command quickly searches the indexed database for files. It just<br />
gives the name of the files; but, if you need more information use it as follows<br />
<br />
$ locate document|xargs ls -l<br />
<br />
The "locate" database may only get updated every 24 hours. For more recent finds,<br />
use the "find" command.<br />
<br />
<br />
<br />
TIP 57:<br />
<br />
Using the "find" Command.<br />
<br />
List only directories, max 2 nodes down that have "net" in the name<br />
<br />
$ find /proc -type d -maxdepth 2 -iname '*net*'<br />
<br />
Find all *.c and *.h files starting from the current "." position.<br />
<br />
$ find . \( -iname '*.c' -o -iname '*.h' \) -print<br />
<br />
Find all, but skip what's in "/CVS" and "/junk". Start from "/work"<br />
<br />
<br />
$ find /work \( -iregex '.*/CVS' -o -iregex '.*/junk' \) -prune -o -print<br />
<br />
Note -regex and -iregex work on the directory as well, which means<br />
you must consider the "./" that comes before all listings.<br />
<br />
Here is another example. Find all files except what is under the CVS, including<br />
CVS listings. Also exclude "#" and "~".<br />
<br />
$ find . -regex '.*' ! \( -regex '.*CVS.*' -o -regex '.*[#|~].*' \)<br />
<br />
Find a *.c file, then run grep on it looking for "stdio.h"<br />
<br />
$ find . -iname '*.c' -exec grep -H 'stdio.h' {} \;<br />
sample output --> ./prog1.c:#include <stdio.h><br />
./test.c:#include <stdio.h><br />
<br />
Looking for the disk-hog on the whole system?<br />
<br />
$ find / -size +10000k 2>/dev/null<br />
<br />
Looking for files changed in the last 24 hours? Make sure you add the<br />
minus sign "-1", otherwise, you will only find files changed exactly<br />
24 hours from now. With the "-1" you get files changed from now to 24<br />
hours.<br />
<br />
<br />
$ find . -ctime -1 -printf "%a %f\n"<br />
Wed Oct 6 12:51:56 2004 .<br />
Wed Oct 6 12:35:16 2004 How_to_Linux_and_Open_Source.txt<br />
<br />
Or if you just want files.<br />
<br />
$ find . -type f -ctime -1 -printf "%a %f\n"<br />
<br />
Details on file status change in the last 48 hours, current directory. Also note "-atime -2").<br />
<br />
$ find . -ctime -2 -type f -exec ls -l {} \;<br />
<br />
NOTE: if you don't use -type f, you make get "." returned, which<br />
when run through ls "ls ." may list more than what you want.<br />
<br />
Also you may only want the current directory<br />
<br />
$ find . -ctime -2 -type f -maxdepth 1 -exec ls -l {} \;<br />
<br />
To find files modified within the last 5 to 10 minutes<br />
<br />
$ find . -mmin +5 -mmin -10 <br />
<br />
<br />
For more example "find" commands, reference the following looking<br />
for the latest version of "bashscripts.x.x.x.tar.gz":<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=79320&package_id=80711<br />
<br />
See "TIP 71" for examples of find using the inode feature. " $ find . -inum <inode> -exec rm -- '{}' \; "<br />
<br />
If you don't want error messages, or need to redirect error messages "> /dev/null 2>&1", or see<br />
"TIP 81".<br />
<br />
<br />
<br />
TIP 58:<br />
<br />
Using the "rm" command.<br />
<br />
How do you remove a file that has the name "-". For instance, if you run the command<br />
"$ cat > - " and type some text followed by ^d, how does the "-" file get deleted?<br />
<br />
$ rm -- -<br />
<br />
The "--" nullifies any rm options.<br />
<br />
How do you delete the directory "one", all it's sub-directories, and any data?<br />
<br />
$ rm -rf ./one<br />
<br />
Note, to selectively delete stuff on a directory, use the find command "TIP 57".<br />
To delete by inode, see "TIP 71".<br />
<br />
<br />
<br />
TIP 59:<br />
<br />
Giving ownership.<br />
<br />
How do you give the user "donkey" ownership to all directories and files under<br />
"./fordonkey" ?<br />
<br />
$ chown -R donkey ./fordonkey<br />
<br />
<br />
<br />
TIP 60:<br />
<br />
Only Permit root login -- give others a message when they try to login.<br />
<br />
Create the file "/etc/nologin" with "nologin" containing the contents<br />
of the message.<br />
<br />
<br />
<br />
TIP 61:<br />
<br />
Limits: file size, open files, pipe size, stack size, max memory size<br />
cpu time, plus others.<br />
<br />
To get a listing of current limits:<br />
<br />
$ ulimit -a<br />
core file size (blocks, -c) 0<br />
data seg size (kbytes, -d) unlimited<br />
file size (blocks, -f) unlimited<br />
max locked memory (kbytes, -l) unlimited<br />
max memory size (kbytes, -m) unlimited<br />
open files (-n) 1024<br />
pipe size (512 bytes, -p) 8<br />
stack size (kbytes, -s) 8192<br />
cpu time (seconds, -t) unlimited<br />
max user processes (-u) 8179<br />
virtual memory (kbytes, -v) unlimited<br />
<br />
Note as a user you can decrease your limits in the current<br />
shell session; but, you cannot increase. This can be ideal<br />
for testing programs. But, first you may want to create<br />
another shell "sh" so that you can "go back to where started".<br />
<br />
$ ulimit -f 10<br />
<br />
Now try<br />
<br />
$ yes >> out<br />
File size limit exceeded<br />
<br />
To set limits on users, make changes to "/etc/security/limits.conf"<br />
<br />
bozo - maxlogins 1<br />
<br />
Will keep bozo from loging in more than once.<br />
<br />
To list hard limits:<br />
<br />
$ ulimit -Ha<br />
<br />
To list soft limits:<br />
<br />
$ ulimit -Sa<br />
<br />
To restrict user access by time, day make changes to<br />
"/etc/security/time.conf"<br />
<br />
Also take a look at "/etc/profile" to see what other changes<br />
can be made, plus take a look under "/etc/security/*.conf" for<br />
other configuration files.<br />
<br />
<br />
<br />
TIP 62:<br />
<br />
Stupid "cat" Tricks.<br />
<br />
Also see (TIP 43).<br />
<br />
If you have multiple blank lines, squeeze these lines down to one,<br />
then, try the following:<br />
<br />
$ cat -s <file><br />
<br />
Want to number the lines?<br />
<br />
$ cat -n <file><br />
<br />
Want to show tabs?<br />
<br />
$ cat -t <file><br />
<br />
Need to mark end of lines by "$"? The following was suggested by (Amos Shapira)<br />
<br />
$ cat -e <file><br />
<br />
Want to see all the ctl characters?<br />
<br />
/* ctlgen.c<br />
Program to generate ctl characters.<br />
<br />
Compile:<br />
<br />
gcc -o ctlgen ctlgen.c<br />
<br />
Run:<br />
<br />
./ctlgen > mout<br />
<br />
Now see the characters:<br />
<br />
cat -v mout<br />
<br />
Here's a sample output:<br />
<br />
<br />
$ cat -v mout|tail<br />
test M-v<br />
test M-w<br />
test M-x<br />
test M-y<br />
test M-z<br />
test M-{<br />
test M-|<br />
test M-}<br />
test M-~<br />
test M-^?<br />
<br />
*/<br />
#include <stdlib.h><br />
#include <stdio.h><br />
int main()<br />
{<br />
int i;<br />
<br />
for(i=0; i < 256; ++i)<br />
printf("test %c \n",i);<br />
<br />
return 0;<br />
}<br />
<br />
<br />
<br />
TIP 63:<br />
<br />
Guard against SYN attacks and "ping".<br />
<br />
As root do the following:<br />
<br />
echo 1 > /proc/sys/net/ipv4/tcp_syncookies<br />
<br />
Want to disable "ping" ?<br />
<br />
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
<br />
Disable broadcast/multicast "ping" ?<br />
<br />
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts<br />
<br />
And to enable again:<br />
<br />
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
<br />
<br />
<br />
TIP 64:<br />
<br />
Make changes to .bash_profile and need to update the current session?<br />
<br />
$ source .bash_profile<br />
<br />
With the above command, the user does not have to logout.<br />
<br />
<br />
<br />
TIP 65:<br />
<br />
What are the Special Shell Variables?<br />
<br />
<br />
$# The number of arguments.<br />
$@ All arguments, as separate words.<br />
$* All arguments, as one word.<br />
$$ ID of the current process.<br />
$? Exit status of the last command.<br />
$0,$1,..$9,${10},${11}...${N} Positional parameters. After "9" you must use the ${k} syntax.<br />
<br />
Note that 0 is true. For example if you execute the following, which is true you get zero.<br />
<br />
$ [[ -f /etc/passwd ]]<br />
$ echo $?<br />
0<br />
And the following is false, which returns a 1.<br />
<br />
$ [[ -f /etc/passwdjabberwisnohere ]]<br />
$ echo $?<br />
1<br />
<br />
So true=0 and false=1.<br />
<br />
<br />
Sample program "mdo" to show the difference between "$@" and "$*"<br />
<br />
#!/bin/bash<br />
function myarg<br />
{<br />
echo "$# in myarg function"<br />
}<br />
echo -e "$# parameters on the cmd line\n"<br />
echo -e "calling: myarg \"\$@\" and myarg \"\$*\"\n"<br />
myarg "$@"<br />
myarg "$*"<br />
echo -e "\ncalling: myarg \$@ and myarg \$* without quotes\n"<br />
myarg $@<br />
myarg $*<br />
<br />
<br />
The result of running "./mdo one two". Note that when quoted, myarg "$*",<br />
returns 1 ... all parameters are smushed together as one word.<br />
<br />
[chirico@third-fl-71 theBook]$ ./mdo one two<br />
2 parameters on the cmd line<br />
<br />
calling: myarg "$@" and myarg "$*"<br />
<br />
2 in myarg function<br />
1 in myarg function<br />
<br />
calling: myarg $@ and myarg $* without quotes<br />
<br />
2 in myarg function<br />
2 in myarg function<br />
<br />
Example program "mdo2" shows how the input separator can be changed.<br />
<br />
#!/bin/bash<br />
IFS=|<br />
echo -e "$*\n"<br />
IFS=,<br />
echo -e "$*\n"<br />
IFS=\;<br />
echo -e "$*\n"<br />
IFS=$1<br />
echo -e "$*\n"<br />
<br />
[chirico@third-fl-71 theBook]$ ./mdo2 one two three four five<br />
one two three four five<br />
<br />
one,two,three,four,five<br />
<br />
one;two;three;four;five<br />
<br />
oneotwoothreeofourofive<br />
<br />
<br />
<br />
TIP 66:<br />
<br />
Replace all "x" with "y" and all "y" with "x" in file data.<br />
<br />
$ cata data<br />
x y<br />
y x<br />
<br />
$ tr "xy" "yx" < data<br />
y x<br />
x y<br />
<br />
<br />
<br />
TIP 67:<br />
<br />
On a Linux 2.6.x Kernel, how do you directly measure disk activity,<br />
and where is this information documented?<br />
<br />
o The information is documented in the kernel source<br />
./Documentation/iostats.txt<br />
<br />
o The new way of getting this info in 2.6.x is<br />
$ cat /sys/block/hda/stat<br />
151121 5694 1932358 796675 37867 76770 916994 8353762 0 800672 9150437<br />
<br />
Field 1 -- # of reads issued<br />
This is the total number of reads completed successfully.<br />
Field 2 -- # of reads merged, field 6 -- # of writes merged<br />
Reads and writes which are adjacent to each other may be merged for<br />
efficiency. Thus two 4K reads may become one 8K read before it is<br />
ultimately handed to the disk, and so it will be counted (and queued)<br />
as only one I/O. This field lets you know how often this was done.<br />
Field 3 -- # of sectors read<br />
This is the total number of sectors read successfully.<br />
Field 4 -- # of milliseconds spent reading<br />
This is the total number of milliseconds spent by all reads (as<br />
measured from __make_request() to end_that_request_last()).<br />
Field 5 -- # of writes completed<br />
This is the total number of writes completed successfully.<br />
Field 7 -- # of sectors written<br />
This is the total number of sectors written successfully.<br />
Field 8 -- # of milliseconds spent writing<br />
This is the total number of milliseconds spent by all writes (as<br />
measured from __make_request() to end_that_request_last()).<br />
Field 9 -- # of I/Os currently in progress<br />
The only field that should go to zero. Incremented as requests are<br />
given to appropriate request_queue_t and decremented as they finish.<br />
Field 10 -- # of milliseconds spent doing I/Os<br />
This field is increases so long as field 9 is nonzero.<br />
Field 11 -- weighted # of milliseconds spent doing I/Os<br />
This field is incremented at each I/O start, I/O completion, I/O<br />
merge, or read of these stats by the number of I/Os in progress<br />
(field 9) times the number of milliseconds spent doing I/O since the<br />
last update of this field. This can provide an easy measure of both<br />
I/O completion time and the backlog that may be accumulating.<br />
<br />
Note, this is device specific.<br />
<br />
<br />
<br />
TIP 68:<br />
<br />
Passing Outbound Mail, plus Masquerading User and Hostname.<br />
<br />
Here's a specific example:<br />
<br />
How does one send and receive Comcast email from a home Linux box,<br />
which uses Comcast as the ISP, if the local account on the Linux<br />
box is different from the Comcast email. For instance, the<br />
account on the Linux box is "chirico@third-fl-71" and the Comcast<br />
email account is "mchirico@comcast.net". Note both the hostname and<br />
username are different.<br />
<br />
So, the user "chirico" using "mutt", "elm" or any email program would<br />
like to send out email to say "donkey@comcast.net"; yet, donkey would<br />
see the email from "mchirico@comcast.net" and not "chirico@third-fl-71"<br />
but chirico@third-fl-71 would get the replies.<br />
<br />
For a full description of how to solve this problem, including related<br />
"sendmail.mc", "site.config.m4", "genericstable", "genericsdomain",<br />
".procmailrc", and ".forward" files, reference the following:<br />
<br />
http://prdownloads.sourceforge.net/souptonuts/README_COMCAST_EMAIL.txt?download<br />
<br />
Included in the above link are instructions for building sendmail with<br />
"SASL" and "STARTTLS".<br />
<br />
<br />
<br />
TIP 69:<br />
<br />
How do you remove just the last 2 lines from a file and save the result?<br />
<br />
$ sed '$d' file | sed '$d' > savefile<br />
<br />
Or, as Amos Shapira pointed out, it's much easier with the head command.<br />
<br />
$ head -2 file<br />
<br />
And, of course, removing just the last line<br />
<br />
$ sed '$d' file > savefile<br />
<br />
(See REFERENCES (13))<br />
<br />
How do you remove extra spaces at the end of a line?<br />
<br />
$ sed 's/[ ]*$//g'<br />
<br />
How do you remove blank lines, or lines with just spaces and tabs,<br />
saving the origional file as file.backup?<br />
<br />
$ perl -pi.backup -e "s/^(\s)*\n//" file<br />
<br />
<br />
<br />
<br />
TIP 70:<br />
<br />
Generating Random Numbers.<br />
<br />
$ od -vAn -N4 -tu4 < /dev/urandom<br />
3905158199<br />
<br />
<br />
<br />
TIP 71:<br />
<br />
Deleting a File by it's Inode Value.<br />
<br />
See (PROGRAMMING TIP 5) for creating the file, or<br />
<br />
$ cat > '\n\n\n\n\n\n\n'<br />
type some text<br />
^D<br />
<br />
To list the inode and display the characters.<br />
<br />
$ ls -libt *<br />
<br />
To remove by inode. Note the "--" option. This<br />
will keep any special characters in the file from being<br />
interpreted at "rm" options.<br />
<br />
$ find . -inum <inode> -exec rm -- '{}' \;<br />
<br />
Or to check contents<br />
<br />
$ find . -inum <inode> -exec cat '{}' \;<br />
<br />
Reference:<br />
http://www.faqs.org/ftp/usenet/news.answers/unix-faq/faq/part2<br />
<br />
<br />
<br />
TIP 72:<br />
<br />
Sending Attachments Using Mutt -- On the Command Line.<br />
<br />
$ mutt -s "See Attachment" -a file.doc user@domain.net < message.txt<br />
<br />
or just the message:<br />
<br />
$ echo | mutt -a sample.tar.gz user@domain.net<br />
<br />
Reference:<br />
http://www.shelldorado.com/articles/mailattachments.html<br />
<br />
Also see (TIP 51).<br />
<br />
<br />
<br />
TIP 73:<br />
<br />
Want to find out what functions a program calls?<br />
<br />
$ strace <program><br />
<br />
Try this with "topen.c" (see PROGRAMMING TIP 5)<br />
<br />
$ strace ./topen<br />
<br />
<br />
<br />
TIP 74:<br />
<br />
RPM Usage Summary.<br />
<br />
Install. Full filename is needed.<br />
<br />
$ rpm -ivh Fedora/RPMS/postgresql-libs-7.4.2-1.i386.rpm<br />
<br />
To view list of files installed with a particular package.<br />
<br />
$ rpm -ql postgresql-libs<br />
/usr/lib/libecpg.so.4<br />
/usr/lib/libecpg.so.4.1<br />
/usr/lib/libecpg_compat.so.1<br />
/usr/lib/libecpg_compat.so.1.1<br />
/usr/lib/libpgtypes.so.1<br />
...<br />
<br />
Or, to get the file listing from a package that is not installed use the<br />
"-p" option.<br />
<br />
$ rpm -pql /iso0/Fedora/RPMS/libpcap-0.8.3-7.i386.rpm<br />
/usr/share/doc/libpcap-0.8.3/CHANGES<br />
/usr/share/doc/libpcap-0.8.3/LICENSE<br />
/usr/share/doc/libpcap-0.8.3/README<br />
/usr/share/man/man3/pcap.3.gz<br />
<br />
For dependencies listing, use the "R" option.<br />
<br />
$ rpm -qpR /iso0/Fedora/RPMS/libpcap-0.8.3-7.i386.rpm<br />
/sbin/ldconfig<br />
/sbin/ldconfig<br />
kernel >= 2.2.0<br />
libc.so.6<br />
libc.so.6(GLIBC_2.0)<br />
libc.so.6(GLIBC_2.1)<br />
libc.so.6(GLIBC_2.1.3)<br />
libc.so.6(GLIBC_2.3)<br />
openssl<br />
rpmlib(CompressedFileNames) <= 3.0.4-1<br />
rpmlib(PayloadFilesHavePrefix) <= 4.0-1<br />
<br />
To check the integrity, use the "-K" option.<br />
<br />
$ rpm -K /iso0/Fedora/RPMS/libpcap-0.8.3-7.i386.rpm<br />
/iso0/Fedora/RPMS/libpcap-0.8.3-7.i386.rpm: (sha1) dsa sha1 md5 gpg OK<br />
<br />
To list all packages installed.<br />
<br />
$ rpm -qa<br />
<br />
To find out which file a package belongs to.<br />
<br />
$ rpm -qf /usr/lib/libecpg.so.4.1<br />
<br />
To uninstall a package<br />
<br />
$ rpm -e<br />
<br />
For building rpm packages reference the following:<br />
http://www-106.ibm.com/developerworks/library/l-rpm1/<br />
<br />
To verify md5 sum so that you know it downloaded ok<br />
<br />
$ rpm -K *.rpm<br />
<br />
The following is a good reference:<br />
http://www.rpm.org/max-rpm/s1-rpm-install-additional-options.html<br />
<br />
<br />
<br />
TIP 75:<br />
<br />
Listing Output from a Bash Script.<br />
<br />
Add "set -x"<br />
<br />
#!/bin/bash<br />
set -x<br />
ls<br />
date<br />
<br />
Will list the files and output as follows:<br />
<br />
+ ls<br />
ChangeLog CVS data test<br />
+ date<br />
Thu Jul 1 20:41:04 EDT 2004<br />
<br />
<br />
<br />
TIP 76:<br />
<br />
Using wget.<br />
<br />
Grap a webpage and pipe it to less. For example suppose you wanted to pipe the<br />
contents of all these tips, directly from the web.<br />
<br />
$ wget -O - http://sourceforge.net/direct-dl/mchirico/souptonuts/How_to_Linux_and_Open_Source.txt|less<br />
<br />
<br />
<br />
TIP 77:<br />
<br />
Finding IP address and MAC address.<br />
<br />
$ /sbin/ifconfig<br />
<br />
Note the following output "eth0" and "eth0:1" which means<br />
two IP addresses are tied to 1 NIC (Network Interface Card).<br />
<br />
eth0 Link encap:Ethernet HWaddr 00:50:DA:60:5B:AD<br />
inet addr:192.168.1.155 Bcast:192.168.99.255 Mask:255.255.252.0<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br />
RX packets:982757 errors:116 dropped:0 overruns:0 frame:116<br />
TX packets:439297 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:1000<br />
RX bytes:693529078 (661.4 Mb) TX bytes:78400296 (74.7 Mb)<br />
Interrupt:10 Base address:0xa800<br />
<br />
eth0:1 Link encap:Ethernet HWaddr 00:50:DA:60:5B:AD<br />
inet addr:192.168.1.182 Bcast:192.168.3.255 Mask:255.255.252.0<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br />
RX packets:982757 errors:116 dropped:0 overruns:0 frame:116<br />
TX packets:439299 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:1000<br />
RX bytes:693529078 (661.4 Mb) TX bytes:78400636 (74.7 Mb)<br />
Interrupt:10 Base address:0xa800<br />
<br />
lo Link encap:Local Loopback<br />
inet addr:127.0.0.1 Mask:255.0.0.0<br />
UP LOOPBACK RUNNING MTU:16436 Metric:1<br />
RX packets:785 errors:0 dropped:0 overruns:0 frame:0<br />
TX packets:785 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:0<br />
RX bytes:2372833 (2.2 Mb) TX bytes:2372833 (2.2 Mb)<br />
<br />
<br />
<br />
TIP 78:<br />
<br />
DOS to UNIX and UNIX to DOS.<br />
<br />
$ dos2unix file.txt<br />
<br />
And to go the other way from UNIX to DOS<br />
<br />
$ unix2dos unixfile<br />
<br />
See the man page, since there are MAC options.<br />
<br />
<br />
NOTE: If you're working file DOS files, you'll probably want to use<br />
"zip" instead of "gzip" so users on Windows can unzip them.<br />
<br />
$ zip test.zip test.txt<br />
<br />
<br />
<br />
TIP 79:<br />
<br />
Need to Run Interactive Commands? Try "expect".<br />
http://expect.nist.gov/expect.tar.gz<br />
<br />
This simple example waits for the input "hi", in some form before<br />
returning, immediately, "hello there!". Otherwise, it will wait for<br />
60 seconds, then, return "hello there!".<br />
<br />
#!/usr/bin/expect<br />
set timeout 60<br />
expect "hi\n"<br />
send "hello there!\n"<br />
<br />
<br />
Reference:<br />
http://www.oreilly.com/catalog/expect/chapter/ch03.html<br />
<br />
http://www.cotse.com/dlf/man/expect/bulletproof1.htm<br />
<br />
<br />
<br />
TIP 80:<br />
<br />
Using PHP as a Command Line Scripting Language.<br />
<br />
The following will grab the complete file from slashdot.<br />
<br />
#!/usr/bin/php -q<br />
<br />
<?php<br />
$fileName = "http://slashdot.org/slashdot.xml";<br />
$rss = file($fileName) or die ("Cannot open file $fileName\n");<br />
for ($index=0; $index < count($rss); $index++)<br />
{<br />
echo $rss[$index];<br />
}<br />
?><br />
<br />
Note, if you want an example that parses the XML of<br />
slashdot, then, download the following:<br />
<br />
http://prdownloads.sourceforge.net/souptonuts/php_scripts.tar.gz?download<br />
<br />
<br />
<br />
TIP 81:<br />
<br />
Discarding all output -- including stderr messages.<br />
<br />
$ ls > /dev/null 2>&1<br />
<br />
Or sending all output to a file<br />
<br />
$ someprog > /tmp/file 2>&1<br />
<br />
Sometimes, find displays a lot of errors when searching through<br />
directories that the user doesn't have access to. To discard<br />
error messages "stderr", which is normally file descripter "2"<br />
work the following:<br />
<br />
$ find / -iname 'stuff' 2>/dev/null<br />
<br />
or to pipe results elsewhere<br />
<br />
$ find / -iname 'stuff' > /tmp/results_of_find 2>/dev/null<br />
<br />
Also see (TIP 118).<br />
<br />
<br />
<br />
TIP 82:<br />
<br />
Using MIX. D. Knuth's assembly language/machine-code instruction set used in<br />
his books to illustrate his algorithms.<br />
<br />
Download the source:<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=13897<br />
<br />
$ ./configure<br />
$ make<br />
$ make install<br />
<br />
Documentation can be found at the following link. The link on<br />
sourceforge is not correct, but, the one below works.<br />
<br />
http://www.gnu.org/software/mdk/manual/<br />
<br />
<br />
<br />
TIP 83:<br />
<br />
Gnuplot [ http://sourceforge.net/projects/gnuplot/ ].<br />
<br />
This software is ideal for printing graphs.<br />
<br />
gnuplot> set term png<br />
gnuplot> set output 'testcos.png'<br />
gnuplot> plot cos(x)*sin(x)<br />
gnuplot> exit<br />
<br />
Or the following command can be put into "file"<br />
<br />
$ cat > file<br />
set term png<br />
set output 'testcos.png'<br />
plot cos(x)*sin(x)<br />
exit<br />
^D<br />
<br />
Then, run as follows:<br />
<br />
$ gnuplot file<br />
<br />
Or, suppose you have the following file "/home/chirico/data". Comments<br />
with "#" are not read by gnuplot.<br />
<br />
# File /home/chirico/data<br />
#<br />
2005-07-26 1 2.3 3<br />
2005-07-27 2 3.4 5<br />
2005-07-28 3 4 6.6<br />
2005-07-29 4 6 2.5<br />
<br />
And you have the following new "file"<br />
<br />
set term png<br />
set xdata time<br />
set timefmt "%Y-%m-%d "<br />
set format x "%Y/%m/%d"<br />
set output '/var/www/html/chirico/gnuplot/data.png'<br />
plot '/home/chirico/data' using 1:2 w linespoints title '1st col', \<br />
'/home/chirico/data' using 1:3 w linespoints title '2nd col', \<br />
'/home/chirico/data' using 1:4 w linespoints title '3rd col'<br />
exit<br />
<br />
You can now get a graph of this data running the following:<br />
<br />
$ gnuplot file<br />
<br />
<br />
<br />
TIP 84:<br />
<br />
CPU Information - speed, processor, cache.<br />
<br />
$ cat /proc/cpuinfo<br />
<br />
processor : 0<br />
vendor_id : GenuineIntel<br />
cpu family : 15<br />
model : 2<br />
model name : Intel(R) Pentium(R) 4 CPU 2.20GHz<br />
stepping : 9<br />
cpu MHz : 2193.221<br />
cache size : 512 KB<br />
fdiv_bug : no<br />
hlt_bug : no<br />
f00f_bug : no<br />
coma_bug : no<br />
fpu : yes<br />
fpu_exception : yes<br />
cpuid level : 2<br />
wp : yes<br />
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr<br />
bogomips : 4325.37<br />
<br />
"bogomips" is a rough but good way to quickly compare two computer speeds. True it's a<br />
bogus reading; but, a "good enough" for government work calculation. See (TIP 10) for<br />
"vmstat" and "iostat".<br />
<br />
<br />
<br />
TIP 85:<br />
<br />
POVRAY - Making Animated GIFs<br />
<br />
To see this in action, reference:<br />
http://souptonuts.sourceforge.net/povray/orbit.pov.html<br />
<br />
These are the basic command to create:<br />
<br />
<br />
$ povray orbit.ini -Iorbit.pov<br />
$ convert -delay 20 *.ppm orbit.gif<br />
<br />
By the way, convert is a program from imagemagick, and it can<br />
be downloaded from ( http://www.imagemagick.org ).<br />
<br />
The following is "orbit.pov"<br />
<br />
<br />
#include "colors.inc"<br />
#include "finish.inc"<br />
#include "metals.inc"<br />
#include "textures.inc"<br />
#include "stones.inc"<br />
#include "skies.inc"<br />
<br />
camera {<br />
location < 2, 3, -8 ><br />
look_at < 0, 0, 0 ><br />
focal_point <0, 0, 0><br />
blur_samples 20<br />
}<br />
<br />
light_source {<br />
< 0, 10, 0><br />
color White<br />
area_light <2,0,0>,<0,0,2>, 2, 2<br />
adaptive 1<br />
fade_distance 8<br />
fade_power 1<br />
}<br />
<br />
sky_sphere {<br />
S_Cloud3<br />
}<br />
<br />
plane { <0, 1, 0>, -1<br />
texture {<br />
pigment {<br />
checker color Blue, color White<br />
}<br />
finish {Phong_Glossy}<br />
}<br />
}<br />
#declare ball0=<br />
sphere {<br />
<0.5, 0.5, 0>, 1<br />
texture {<br />
T_Silver_1E<br />
pigment {Yellow}<br />
}<br />
}<br />
<br />
#declare ball1=<br />
sphere {<br />
<3, 2, 0>, 0.5<br />
texture {<br />
T_Silver_1E<br />
pigment {Blue}<br />
}<br />
}<br />
<br />
#declare ball2=<br />
sphere {<br />
<3, 1, 0>, 1<br />
texture {<br />
T_Silver_1E<br />
pigment {Green}<br />
}<br />
}<br />
<br />
object {ball0 rotate 360*clock*y}<br />
object {ball1 rotate 720*clock*y}<br />
object {ball2 rotate 360*(1 - clock)*y}<br />
<br />
<br />
And, "orbit.ini" follows:<br />
<br />
Output_File_Type=P<br />
<br />
Width=320<br />
Height=240<br />
<br />
Initial_Frame=1<br />
Final_Frame=10<br />
Antialias=true<br />
<br />
Subset_Start_Frame=1<br />
Subset_End_Frame=10<br />
<br />
Cyclic_Animation=on<br />
<br />
<br />
<br />
TIP 86:<br />
<br />
GPG -- GnuPG<br />
<br />
Reference: http://www.gnupg.org/documentation/faqs.html<br />
http://codesorcery.net/mutt/mutt-gnupg-howto<br />
http://www.gnupg.org/(en)/download/index.html<br />
(SCRIPT 4) on following link:<br />
http://prdownloads.sourceforge.net/souptonuts/README_common_script_commands.html?download<br />
<br />
<br />
Generage key:<br />
<br />
$ gpg --gen-key<br />
<br />
Generate public key ID and fingerprint<br />
<br />
$ gpg --fingerprint<br />
<br />
Get a list of keys:<br />
<br />
$ gpg --list-keys<br />
<br />
pub 1024D/A11C1499 2004-07-15 Mike Chirico <mchirico@comcast.net><br />
sub 1024g/E1A3C2B3 2004-07-15<br />
<br />
Encrypt<br />
<br />
$ gpg -r Mike --encrypt sample.txt<br />
<br />
This will produce "sample.txt.asc", which is a binary file. Note, I can use "Mike" because that's the<br />
name on the list of keys. Again, it will be a binary file.<br />
<br />
Encrypt using "ASCII-armored text" (--armor), which is probably what you want when sending "in" the body of an<br />
email, or some document.<br />
<br />
$ gpg -r Mike --encrypt --armor sample.txt<br />
or<br />
$ gpg -r Mike -e -a sample.txt<br />
or<br />
$ gpg --output somefile.asc --armor -r Mike --encrypt --armor sample.txt<br />
<br />
The above 3 statements will still produce "sample.txt.asc", but look at it, or "$ cat sample.txt.asc" without <br />
fear, since there are no binary characters. Yes, you could even compile a program "$ g++ -o test test.c" , then,<br />
"$ gpg --output test.asc -r Mike --encrypt --armor test". However, when decrypting make sure to pipe<br />
the results.<br />
<br />
$ gpg --decrypt test.asc > test<br />
<br />
Export "public" key:<br />
<br />
$ gpg --armor --export Mike > m1.asc<br />
<br />
Signing the file "message.txt":<br />
<br />
$ gpg --clearsign message.txt<br />
<br />
<br />
Sending the key to the "key-server"<br />
<br />
First, list the keys.<br />
<br />
$ gpg --list-keys<br />
/home/chirico/.gnupg/pubring.gpg<br />
v------------------ Use this with "0x" in front -------<br />
pub 1024D/A11C1499 2004-07-15 Mike Chirico <mchirico@comcast.net> |<br />
sub 1024g/E1A3C2B3 2004-07-15 |<br />
|<br />
v----------------------------------------------------<br />
$ gpg --send-keys 0xA11C1499<br />
<br />
The above sends it to the keyserver defined in "/home/chirico/.gnupg/gpg.conf". Other key servers:<br />
<br />
wwwkeys.pgp.net<br />
search.keyserver.net<br />
pgp.ai.mit.edu<br />
<br />
When you go to your user-group meetings, you need to bring 2 forms of ID, and<br />
list your Key fingerprint. Shown below is the command for getting this fingerprint.<br />
<br />
$ gpg --fingerprint mchirico@comcast.net<br />
pub 1024D/A11C1499 2004-07-15<br />
Key fingerprint = 9D7F C80D BB7B 4BAB CCA4 1BE9 9056 5BEC A11C 1499<br />
uid Mike Chirico (http://souptonuts.sourceforge.net/chirico/index.php) <mchirico@comcast.net><br />
sub 1024g/E1A3C2B3 2004-07-15<br />
<br />
<br />
Receving keys:<br />
<br />
The following will retrieve my mchirico@comcast.net key<br />
<br />
$ gpg --recv-keys 0xA11C1499<br />
<br />
<br />
Special Note: If you get the following error "GPG: Warning: Using Insecure Memory" , then,<br />
" chmod 4755 /path/to/gpg" to setuid(root) permissioins on the gpg binary.<br />
<br />
<br />
NOTE: If using mutt, just before sending with the "y" option, hit "p" to sign or encrypt.<br />
<br />
It's possible to create a gpg/pgp email from the command line. For a tutorial on this,<br />
reference (SCRIPT 4) at the following link:<br />
http://prdownloads.sourceforge.net/souptonuts/README_common_script_commands.html?download<br />
<br />
<br />
<br />
TIP 87:<br />
<br />
Working with Dates: Steffen Beyer has developed a Perl and C module for working with dates<br />
<br />
This softare can be downloaded from the following location:<br />
http://www.engelschall.com/u/sb/download/pkg/Date-Calc-5.3.tar.gz<br />
<br />
$ wget http://www.engelschall.com/u/sb/download/pkg/Date-Calc-5.3.tar.gz<br />
$ tar -xzvf Date-Calc-5.3.tar.gz<br />
$ cd Date-Calc-5.3<br />
$ cp ./examples/cal.c .<br />
$ gcc cal.c DateCalc.c -o mcal<br />
<br />
The file cal.c contains sample function calls from DateCalc.c. Note, "DateCalc.c"<br />
is just a list of functions and includes for "DateCalc.h" and "ToolBox.h".<br />
<br />
Or, and this may be easier, just download the following:<br />
http://prdownloads.sourceforge.net/cpearls/date_calc.tar.gz?download<br />
<br />
The above link contains a few examples.<br />
<br />
<br />
<br />
TIP 88:<br />
<br />
Color patterns for mutt.<br />
<br />
The colors can be changed in the /home/user/.muttrc file. The first field begins with<br />
color, the second field is the foreground color, and the third field is the background<br />
color, or default.<br />
<br />
An example .muttrc for colors:<br />
<br />
# color patterns for mutt<br />
color normal white black # normal text<br />
color indicator black yellow # actual message<br />
color tree brightmagenta default # thread arrows<br />
color status brightyellow default # status line<br />
color error brightred default # errors<br />
color message magenta default # info messages<br />
color signature magenta default # signature<br />
color attachment brightyellow red # MIME attachments<br />
color search brightyellow red # search matches<br />
color tilde brightmagenta default # ~ at bottom of msg<br />
color markers red default # + at beginning of wrapped lines<br />
color hdrdefault cyan default # default header lines<br />
color bold red default # hiliting bold patterns in body<br />
color underline green default # hiliting underlined patterns in body<br />
color quoted cyan default # quoted text<br />
color quoted1 magenta default<br />
color quoted2 red default<br />
color quoted3 green default<br />
color quoted4 magenta default<br />
color quoted5 cyan default<br />
color quoted6 magenta default<br />
color quoted7 red default<br />
color quoted8 green default<br />
color quoted9 cyan default<br />
color body cyan default "((ftp|http|https)://|news:)[^ >)\"\t]+"<br />
color body cyan default "[-a-z_0-9.+]+@[-a-z_0-9.]+"<br />
color body red default "(^| )\\*[-a-z0-9*]+\\*[,.?]?[ \n]"<br />
color body green default "(^| )_[-a-z0-9_]+_[,.?]?[\n]"<br />
color body red default "(^| )\\*[-a-z0-9*]+\\*[,.?]?[ \n]"<br />
color body green default "(^| )_[-a-z0-9_]+_[,.?]?[ \n]"<br />
color index cyan default ~F # Flagged<br />
color index red default ~N # New<br />
color index magenta default ~T # Tagged<br />
color index cyan default ~D # Deleted<br />
<br />
<br />
Also see (TIP 190)<br />
<br />
<br />
<br />
TIP 89:<br />
<br />
ps command in detail<br />
<br />
<br />
Here are the possible codes when using state "$ ps -e -o state,cmd"<br />
<br />
<br />
PROCESS STATE CODES<br />
D uninterruptible sleep (usually IO)<br />
R runnable (on run queue)<br />
S sleeping<br />
T traced or stopped<br />
Z a defunct ("zombie") process<br />
<br />
< high-priority (not nice to other users)<br />
N low-priority (nice to other users)<br />
L has pages locked into memory (for real-time and custom IO)<br />
s is a session leader<br />
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)<br />
+ is in the foreground process group<br />
<br />
For instance:<br />
<br />
Note that the -o is for user defined, and -e is for select<br />
all process.<br />
<br />
$ ps -e -o pid,state,start,time,etime,cmd<br />
<br />
...<br />
9946 S 15:40:45 00:00:00 02:23:29 /bin/bash -i<br />
9985 T 15:41:24 00:00:01 02:22:50 emacs mout2<br />
10003 T 15:43:59 00:00:00 02:20:15 emacs NOTES<br />
10320 T 17:38:42 00:00:00 25:32 emacs stuff.c<br />
...<br />
<br />
You may want to command below, without the -e, which will give the<br />
process only under the current terminal.<br />
<br />
$ ps -o pid,state,start,time,etime,cmd<br />
<br />
Want to find what 's impacting your load?<br />
<br />
$ ps -e -o %cpu,pid,state,start,time,etime,%cpu,%mem,cmd|sort -rn|less<br />
<br />
<br />
<br />
$ ps aux<br />
<br />
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND<br />
root 1 0.0 0.0 1380 480 ? S Aug04 0:00 init [3]<br />
root 2 0.0 0.0 0 0 ? SWN Aug04 0:00 [ksoftirqd/0]<br />
root 3 0.0 0.0 0 0 ? SW< Aug04 0:00 [events/0]<br />
root 4 0.0 0.0 0 0 ? SW< Aug04 0:00 [khelper]<br />
...<br />
<br />
Or, if you want to see the environment add the -e option<br />
<br />
$ ps aeux<br />
<br />
...<br />
chirico 2735 0.0 0.1 4400 1492 pts/0 S Aug04 0:00 -bash USER=chirico LOGNAME=chirico HOME=/home/chirico PATH=/usr/<br />
chirico 2771 0.0 0.0 4328 924 pts/0 S Aug04 0:00 screen -e^Pa -D -R HOSTNAME=third-fl-71.localdomain TERM=xterm S<br />
chirico 2772 0.0 0.6 9476 6352 ? S Aug04 0:54 SCREEN -e^Pa -D -R HOSTNAME=third-fl-71.localdomain TERM=xterm S<br />
chirico 2773 0.0 0.1 4432 1548 pts/1 S Aug04 0:10 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
chirico 2797 0.0 0.1 4416 1496 pts/2 S Aug04 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
root 2821 0.0 0.0 4100 952 pts/2 S Aug04 0:00 su -<br />
root 2822 0.0 0.1 4384 1480 pts/2 S Aug04 0:00 -bash<br />
chirico 2862 0.0 0.1 4428 1524 pts/3 S Aug04 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
sporkey 2946 0.0 0.2 6836 2960 ? S Aug04 0:15 fetchmail<br />
chirico 2952 0.0 0.1 4436 1552 pts/5 S Aug04 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
chirico 3880 0.0 0.1 4416 1496 pts/6 S Aug05 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
root 3904 0.0 0.0 4100 956 pts/6 S Aug05 0:00 su - donkey<br />
donkey 3905 0.0 0.1 4336 1452 pts/6 S Aug05 0:00 -bash<br />
donkey 3938 0.0 0.2 6732 2856 ? S Aug05 0:14 fetchmail<br />
chirico 3944 0.0 0.1 4416 1496 pts/7 S Aug05 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
...<br />
<br />
There is also a -f "forrest" option. Also note below " -bash" is the start of a login shell.<br />
<br />
$ ps aeuxwwf <br />
<br />
The ww option above gives a wide format with all variables. Use the above command if you plan<br />
to parse through a Perl script. Otherwise, it may be easier to do a quick read using the command<br />
below, without "ww". <br />
<br />
$ ps aeuxf<br />
<br />
...<br />
root 2339 0.0 0.1 3512 1444 ? S Dec01 0:00 /usr/sbin/sshd<br />
root 25651 0.0 0.1 6764 1980 ? S Dec23 0:00 \_ /usr/sbin/sshd<br />
chirico 25653 0.0 0.2 6840 2236 ? S Dec23 0:14 \_ /usr/sbin/sshd<br />
chirico 25654 0.0 0.1 4364 1440 pts/4 S Dec23 0:00 \_ -bash USER=chirico LOGNAME=chirico HOME=/home/chirico<br />
chirico 25690 0.0 0.0 4328 920 pts/4 S Dec23 0:00 \_ screen -e^Pa -D -R HOSTNAME=third-fl-71.localdomain TERM=xterm<br />
root 2355 0.0 0.0 2068 904 ? S Dec01 0:00 xinetd -stayalive -pidfile /var/run/xinetd.pid<br />
...<br />
<br />
It is also possible to list the process by command line. For example, the following command will only list the emacs<br />
processes.<br />
<br />
$ ps -fC emacs<br />
UID PID PPID C STIME TTY TIME CMD<br />
chirico 5049 5020 0 May11 pts/13 00:00:00 emacs -nw Notes<br />
chirico 12368 5104 0 May12 pts/18 00:00:00 emacs -nw dnotify.c<br />
chirico 19792 18028 0 May13 pts/20 00:00:00 emacs -nw hello.c<br />
chirico 14034 27367 0 18:52 pts/8 00:00:00 emacs -nw How_to_Linux_and_Open_Source.txt<br />
<br />
You may also want to consider using top in batch mode. Here the "-n 1" means refresh once,<br />
and the "b" is for batch. The "fmt -s" is to put it in a more readable format.<br />
<br />
$ top -n 1 b |fmt -s >>statfile<br />
<br />
<br />
<br />
<br />
TIP 90:<br />
<br />
Learning Assembly.<br />
<br />
Once you have written the source, assuming the file is "exit.s", it can be compiled as follows:<br />
<br />
$ as exit.s -o exit.o<br />
$ ld exit.o -o exit<br />
<br />
<br />
Here is the program:<br />
<br />
#<br />
#INPUT: none<br />
#<br />
#OUTPUT: returns a status code. This can be viewed<br />
# by typing<br />
#<br />
# echo $?<br />
#<br />
# after running the program<br />
#<br />
#VARIABLES:<br />
# %eax holds the system call number<br />
# (this is always the case)<br />
#<br />
# %ebx holds the return status<br />
#<br />
.section .data<br />
.section .text<br />
<br />
.globl _start<br />
_start:<br />
movl $1, %eax # this is the linux kernel command<br />
# number (system call) for exiting<br />
# a program<br />
movl $0, %ebx # this is the status number we will<br />
# return to the operating system.<br />
# Change this around and it will<br />
# return different things to<br />
# echo $?<br />
int $0x80 # this wakes up the kernel to run<br />
# the exit command<br />
<br />
After running this program, you can get the exit code.<br />
<br />
$ exit $?<br />
0<br />
<br />
That is about all it does; but, get the book for more details. The<br />
book is free.<br />
<br />
http://savannah.nongnu.org/download/pgubook/<br />
<br />
<br />
<br />
TIP 91:<br />
<br />
Creating a sandbox for reiserfstune,debugreiserfs and ACL. Also see TIP 4.<br />
<br />
Assume you have a reisers files system created from a disk file, which<br />
means you have done something like the following:<br />
<br />
# dd if=/dev/zero of=disk-rfs count=102400<br />
# losetup /dev/loop4 ./disk-rfs<br />
# mkfs -t reiserfs /dev/loop4<br />
# mkdir /fs2<br />
# mount -o loop,acl ./disk-rfs /fs2<br />
<br />
Now, you can run reiserfstune. But, first you will need to umount fs2<br />
<br />
# umount /fs2<br />
# reiserfstune ./disk-rfs<br />
<br />
Or you can run the debug command<br />
<br />
# debugreiserfs -J ./disk-rfs<br />
<br />
Now, suppose you run through a lot of the debug options on<br />
http://www.namesys.com/ and you destroy this file.<br />
<br />
You can recreate the file and delete the loop device.<br />
<br />
# dd if=/dev/zero of=disk-rfs count=102400<br />
# losetup -d /dev/loop4<br />
# mount -o loop,acl ./disk-rfs /fs2<br />
<br />
Now, try working with some of the ACL options - you can only do this<br />
with the latest kernel and tools -- Fedora Core 2 will work.<br />
<br />
Assume you have 3 users, donkey, chirico and bozo2. You can give<br />
everyone rights to this file system as follows:<br />
<br />
# setfacl -R -m d:u:donkey:rwx,d:u:chirico:rwx,d:u:bozo2:rwx /fs2<br />
<br />
<br />
<br />
TIP 92:<br />
<br />
SpamAssassin - Setup.<br />
<br />
Step 1.<br />
<br />
Installing the SpamAssassin CPAN utility. You will need to do this<br />
as root.<br />
<br />
$ su -<br />
<br />
Once you have root privileges invoke cpan.<br />
<br />
# perl -MCPAN -e shell<br />
<br />
cpan><br />
<br />
Now install with prerequisites policy set to ask.<br />
<br />
cpan> o conf prerequisites_policy ask<br />
<br />
cpan> install Mail::SpamAssassin<br />
<br />
You will get lots of output as the necessary modules are downloaded and<br />
compiled and installed.<br />
<br />
Step 2.<br />
<br />
Configuration.<br />
<br />
Edit the following "/etc/mail/spamassassin/local.cf"<br />
<br />
Here is a look at my file<br />
<br />
$ cat /etc/mail/spamassassin/local.cf<br />
<br />
<br />
# This is the right place to customize your installation of SpamAssassin.<br />
#<br />
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be<br />
# tweaked.<br />
#<br />
###########################################################################<br />
#<br />
# rewrite_subject 0<br />
# report_safe 1<br />
# trusted_networks 212.17.35.<br />
#<br />
<br />
# Below added from book<br />
# You may want to set this to 5, then, work your way down.<br />
# Currently I have this 3<br />
required_hits 3<br />
<br />
# This determines how spam is reported. Currently safe email is reported<br />
# in the message.<br />
report_safe 1<br />
<br />
# The will rewrite the tag of the spam message.<br />
rewrite_subject 1<br />
<br />
# By default, SpamAssassin will run RBL checks. If your ISP already<br />
# does this, set this to 1.<br />
skip_rbl_checks 0<br />
<br />
Step 3.<br />
<br />
Update .procmail.<br />
<br />
You should update the .procmail file as follows. Here is my /home/chirico/.procmail file.<br />
<br />
<br />
$ cat /home/chirico/.procmailrc<br />
<br />
PATH=/bin:/usr/bin:/usr/local/bin<br />
MAILDIR=/var/spool/mail<br />
DEFAULT=/var/spool/mail/chirico<br />
LOGFILE=/home/chirico/MailBAG<br />
MYHOME=/home/chirico<br />
# Must have folder MailTRASH<br />
TRASH=/home/chirico/MailTRASH<br />
<br />
# Will get everything from this mail<br />
:0<br />
* ^From:.*sporkey@comcast.net<br />
$DEFAULT<br />
<br />
# Spamassassin<br />
:0fw<br />
* <300000<br />
|/usr/local/bin/spamassassin<br />
<br />
Reference:<br />
http://pm-doc.sourceforge.net/<br />
<br />
<br />
<br />
TIP 93:<br />
<br />
Make Graphs: using dot and neato.<br />
<br />
$ dot -Tpng dotfile -o myout.png<br />
<br />
To see the output reference the following:<br />
http://souptonuts.sourceforge.net/code/myout.png<br />
<br />
Where "dotfile" is the following:<br />
<br />
$ cat dotfile<br />
<br />
digraph g<br />
{<br />
node [shape = record];<br />
<br />
node0 [ label ="<f0> stuff | <f1> J | <f2> "];<br />
node1 [ label ="<f0> | <f1> E | <f2> "];<br />
node4 [ label ="<f0> | <f1> C | <f2> "];<br />
node6 [ label ="<f0> | <f1> I | <f2> "];<br />
node2 [ label ="<f0> | <f1> U | <f2> "];<br />
node5 [ label ="<f0> | <f1> N | <f2> "];<br />
node9 [ label ="<f0> | <f1> Y | <f2> "];<br />
node8 [ label ="<f0> | <f1> W | <f2> "];<br />
node10 [ label ="<f0> | <f1> Z | <f2> "];<br />
node7 [ label ="<f0> | <f1> A | <f2> "];<br />
node3 [ label ="<f0> | <f1> G | <f2> "];<br />
<br />
<br />
"node0":f0 -> "node1":f1;<br />
"node0":f2 -> "node2":f1;<br />
<br />
"node1":f0 -> "node4":f1;<br />
"node1":f2 -> "node6":f1;<br />
"node4":f0 -> "node7":f1;<br />
"node4":f2 -> "node3":f1;<br />
<br />
"node2":f0 -> "node5":f1;<br />
"node2":f2 -> "node9":f1;<br />
<br />
"node9":f0 -> "node8":f1;<br />
"node9":f2 -> "node10":f1;<br />
}<br />
<br />
Checkout the following article:<br />
http://www.linuxjournal.com/article.php?sid=7275<br />
<br />
To download this software<br />
http://www.graphviz.org/<br />
<br />
<br />
<br />
TIP 94:<br />
<br />
Makefile: working with conditions<br />
<br />
<br />
First note that all the indentations of the file must be<br />
a single tab. There cannot be any spaces, or make will<br />
not run.<br />
<br />
$ cat Makefile<br />
<br />
# Compiler flags<br />
sqliteLIB := $(shell ls /usr/local/lib/libsqlite.so)<br />
sqlite3LIB := $(shell ls /usr/local/lib/libsqlite3.so)<br />
# all assumes sqlite and sqlite3 are installed<br />
#<br />
<br />
test:<br />
ifeq ("$(sqlite3LIB)","/usr/local/lib/libsqlite3.so")<br />
@echo -e "True -- we found the file"<br />
else<br />
@echo "False -- we did not find the file"<br />
endif<br />
<br />
<br />
So, if I run make I will get the following output.<br />
<br />
$ make<br />
True -- we found the file<br />
<br />
This is because I have a file /usr/local/lib/libsqlite3.so on my system.<br />
Note how the assignment is made, with the shell command<br />
<br />
sqlite3LIB := $(shell ls /usr/local/lib/libsqlite3.so)<br />
<br />
<br />
<br />
TIP 95:<br />
<br />
Bash: Conditional Expressions<br />
<br />
if [ -e /etc/ntp.conf ]<br />
then<br />
echo "You have the ntp config file"<br />
else<br />
echo "You do not have the ntp config file"<br />
fi<br />
<br />
Now using an AND condition inside the [ ]. By the way, above, you<br />
can put the "then" on the same line as the if "if [ -e /etc/ntp.conf ]; then"<br />
as long as you use the ";".<br />
<br />
if [ \( -e /etc/ntp.conf \) -a \( -e /etc/ntp/ntpservers \) ]<br />
then<br />
echo "You have ntp config and ntpservers"<br />
elif [ -e /etc/ntp.conf ]; then<br />
echo " You just have ntp.conf "<br />
elif [ -e /etc/ntp/ntpservers ]; then<br />
echo " You just have ntpservers "<br />
else<br />
echo " you have neither ntp.conf or ntpservers"<br />
fi<br />
<br />
A few things to note above. Else if statement is written as "elif", and when<br />
dealing with "(" you will need to insert "\(". By the way "-o" can replace "-a"<br />
and the "-o" is for OR condition. AND can be done as follows too.<br />
<br />
if [ -e /etc/ntp.conf ] && [ -e /etc/ntp/ntpservers ]<br />
then<br />
echo "You have ntp config and ntpservers"<br />
elif [ -e /etc/ntp.conf ]; then<br />
echo " You just have ntp.conf "<br />
elif [ -e /etc/ntp/ntpservers ]; then<br />
echo " You just have ntpservers "<br />
else<br />
echo " you have neither ntp.conf or ntpservers"<br />
fi<br />
<br />
Conditional Expressions (files).<br />
<br />
<br />
-b file True if file exists and is a block file<br />
-c file True if file exists and is a character device file<br />
-d file True if file exists and is a directory<br />
-e file True if file exists<br />
-f file True if file exists and is a regular file<br />
-g file True if file exists and is set goup id<br />
-G file True if owned by the effective group ID<br />
<br />
-k file True if "sticky" bit is set and file exists<br />
-L file True if file exists and is a symbolic link<br />
-n string True if string is non-null<br />
<br />
-O file Ture if file exists and is owned by the effective user ID<br />
<br />
-p file True if file is a named pipe (FIFO)<br />
-r file True if file is readable<br />
-s file True if file has size > 0<br />
-S file True if file exists and is a socket<br />
<br />
-t file True if file is open and refers to a terminal.<br />
-u file True if setuid bit is set<br />
-w file True if file exists and is writeable<br />
-x file True if file executable<br />
-x dir True if directory can be searched<br />
<br />
file1 -nt file2 True if file1 modification date newer than file2<br />
file1 -ot file2 True if file1 modification date older than file2<br />
file1 -ef file2 True if file1 and file2 have same inode<br />
<br />
Conditional Expressions (Integers).<br />
<br />
-lt Less than<br />
-le Less than or equal<br />
-eq Equal<br />
-ge Greater than or equal<br />
-gt Greater than<br />
-ne Not equal<br />
<br />
Example usage.<br />
<br />
#!/bin/bash<br />
{<br />
while read num value; do<br />
if [ $num -gt 2 ]; then<br />
echo $value<br />
fi<br />
done<br />
} < somefile<br />
<br />
<br />
Conditional Expressions (Strings).<br />
<br />
str1 = str2 str1 matches str2<br />
str1 != str2 str1 does not matches str2<br />
str1 < str2 str1 is less than str2<br />
str1 > str2 str1 is greater than str2<br />
-n str1 str1 is not null (length greater than 0)<br />
-z str1 str1 is null (las length 0)<br />
<br />
<br />
<br />
TIP 96:<br />
<br />
CVS: Working with cvs<br />
<br />
INITIAL REPOSITORY:<br />
<br />
To create a repository, and this is normally done by the system admin. This<br />
is NOT creating a project to checkout, but the location where everything<br />
will be stored! The initial repository!<br />
<br />
cvs -d repository_root_directory init<br />
<br />
Or here is a specific example:<br />
<br />
cvs -d /work/cvsREPOSITORY/ init<br />
<br />
Creating a directory tree from scratch. For a new project, the easiest thing to<br />
do is probably to create an empty directory structure, like this:<br />
<br />
$ mkdir sqlite_examples<br />
$ mkdir sqlite_examples/man<br />
$ mkdir sqlite_examples/testing<br />
<br />
<br />
After that, you use the import command to create the<br />
corresponding (empty) directory structure inside the repository:<br />
<br />
<br />
$ cd <directory><br />
$ cvs -d repository_root_directory import -m "Created directory structure" yoyodyne/dir yoyo start<br />
<br />
Or, here is a specific example.<br />
<br />
$ cd sqlite_examples<br />
$ cvs -d /work/cvsREPOSITORY/ import -m 'test SQlite' sqlite_examples sqlite_examples start<br />
<br />
Now, you can delete the directory sqlite_examples, or go to another directory and type<br />
the following:<br />
<br />
$ cvs -d /work/cvsREPOSITORY/ co sqlite_examples<br />
<br />
COOL TOOLS:<br />
<br />
1. cvsps<br />
2. cvsreport<br />
<br />
cvsps which you can find at http://www.cobite.com/cvsps/cvsps-2.0rc1.tar.gz<br />
<br />
$ cvsps -f README_sqlite_tutorial.html<br />
<br />
<br />
<br />
TIP 97:<br />
<br />
Common vi and vim commands<br />
<br />
Command mode ESC<br />
<br />
dd delete<br />
u undelete<br />
y yank (copy to buffer)<br />
p/P p before cursor/P after cursor<br />
<br />
Ctl-g show current line number<br />
shft-G end of file<br />
n shft-G move to line n<br />
<br />
/stuff/ search<br />
n repeat in same direction<br />
N repeat in opposite direction<br />
/return repeat seach forward<br />
?return repeat seach backward<br />
<br />
"dyy Yank current line to buffer d<br />
"a7yy Yank next 7 lines to buffer a<br />
or<br />
:1,7ya a Yank [ya] lines 1,7 to buffer a<br />
:1,7ya b Yank [ya] lines 1,7 to buffer b<br />
<br />
:5 pu b Put [pu] buffer b after line 5<br />
<br />
"dP Put the content of buffer d before cursor<br />
"ap Put the contents of buffer a after cursor<br />
<br />
:1,4 w! file2 Write lines 1,4 to file2<br />
:1,3<br />
<br />
:set nu Display line numbers<br />
:set nonum Turns off display<br />
<br />
:e <filename> Edit a file in a new buffer<br />
<br />
vim<br />
:split<br />
:split <filename><br />
:sp <filename><br />
:split new<br />
<br />
ctl-w To move between windows<br />
ctl-w+<br />
ctl-w- To change size<br />
ctl+wv Split windows vertically<br />
ctl-wq Close window<br />
<br />
:only To view only 1 window<br />
<br />
vim dictionary - put the following command in ~/.vimrc<br />
<br />
set dictionary+=/usr/share/dict/words<br />
set thesaurus+=/usr/share/dict/words<br />
<br />
Now, after you type a word <ctl-x><ctl-k><ctl-n> and to <br />
go back in the listing <ctl-p><br />
<br />
butter<ctl-x><ctl-k><ctl-n><br />
<br />
<br />
<br />
TIP 98:<br />
<br />
Using apt-get<br />
<br />
$ apt-get update<br />
$ apt-get -s install <pkage> <---- if everything is ok, then, remove the s<br />
<br />
Note you may want to use dpkg to purge if you have to do a reinstall.<br />
<br />
$ dpkg --purge exim4-base<br />
$ dpkg --purge exim4-config<br />
$ apt-get install exim4<br />
<br />
$ dpkg-reconfigure exim4-config<br />
<br />
<br />
<br />
TIP 99:<br />
<br />
Mounting a cdrom on openbsd and installing packages<br />
<br />
$ mkdir -p /cdrom<br />
$ mount /dev/cd0a /cdrom<br />
$ cd /cdrom<br />
<br />
To add packages<br />
<br />
$ pkg_add -v <directory><br />
<br />
Mounting a cdrom on linux to a user's home sub-directory:<br />
<br />
$ mkdir -p /home/chirico/cdrom<br />
$ mount /dev/cdrom /home/chirico/cdrom<br />
<br />
<br />
<br />
TIP 100:<br />
<br />
Creating a boot floppy for knoppix cd:<br />
<br />
$ dd if=/mnt/cdrom/KNOPPIX/boot.img of=/dev/fd0 bs=1440k<br />
<br />
References:<br />
http://www.knoppix.net/docs/index.php/BootFloppyHowTo<br />
<br />
For a lot of the knoppix how-to's<br />
http://www.knoppix.net/docs/index.php/<br />
<br />
<br />
<br />
TIP 101:<br />
<br />
Diction and Style Tools for Linux http://ftp.gnu.org/gnu/diction/<br />
<br />
$ diction mytext|less<br />
<br />
Or, this can be done interactively<br />
<br />
$ diction<br />
This is more text to read and you can do with it<br />
what you want.<br />
(stdin):1: This is more text to read and you [can -> (do not confuse with "may")] do with it what you want.<br />
<br />
DESCRIPTION<br />
Diction finds all sentences in a document, that contain phrases from a<br />
database of frequently misused, bad or wordy diction. It further<br />
checks for double words. If no files are given, the document is read<br />
from standard input. Each found phrase is enclosed in [ ] (brackets).<br />
Suggestions and advice, if any, are printed headed by a right arrow ->.<br />
A sentence is a sequence of words, that starts with a capitalised word<br />
and ends with a full stop, double colon, question mark or exclaimation<br />
mark. A single letter followed by a dot is considered an abbreviation,<br />
so it does not terminate a sentence. Various multi-letter abbrevia-<br />
tions are recognized, they do not terminate a sentence as well.<br />
<br />
<br />
<br />
TIP 102:<br />
<br />
Using a mail alias.<br />
<br />
Suppose all root mail on your system to go to one root account root@main.com<br />
<br />
In the following file:<br />
<br />
/etc/aliases<br />
<br />
Add this line<br />
<br />
root: root@main.com<br />
<br />
Next, run newaliases [/usr/bin/newaliases] as follows:<br />
<br />
$ newaliases<br />
<br />
<br />
Special note: It's possible to send mail to more than one address. Suppose you want<br />
mail going to root@main.com above, plus you want it going to user donkey<br />
on the local system.<br />
<br />
root: root@main.com donkey<br />
<br />
<br />
<br />
TIP 103:<br />
<br />
Chrony - this service is similiar to ntp. It keeps accurate time<br />
on your computer against a very accurate clock in across<br />
a network with various time delays.<br />
<br />
Reference: http://go.to/chrony<br />
<br />
In the file "/etc/chrony/chrony.conf" add/replace the following<br />
<br />
server 146.186.218.60<br />
server 128.118.25.3<br />
server 128.2.129.21<br />
<br />
Next start the chrony service<br />
<br />
$ /etc/init.d/chrony restart<br />
<br />
Next verify that this is working. It may take 20 or 30 minutes to update<br />
the clock.<br />
<br />
<br />
Shell command:<br />
# chronyc<br />
chronyc> sourcestats<br />
210 Number of sources = 3<br />
Name/IP Address NP NR Span Frequency Freq Skew Std Dev<br />
========================================================================<br />
b50.cede.psu.edu 2 0 64 0.000 2000.000 4000ms<br />
otc2.psu.edu 2 0 66 0.000 2000.000 4000ms<br />
FS3.ECE.CMU.EDU 2 0 64 0.000 2000.000 4000ms<br />
chronyc><br />
<br />
It is probably best to let chrony do its work. However, if you want to<br />
set both the hardware and software clock, the following will work:<br />
<br />
Sets the hardware clock<br />
# hwclock --set --date="12/10/04 10:18:05"<br />
Sync the hardware clock to software<br />
# hwclock --hctosys<br />
<br />
Normally the system keep accurate time with the software clock.<br />
<br />
<br />
<br />
TIP 104:<br />
<br />
NFS mount<br />
<br />
SERVER (192.168.1.182)<br />
<br />
Make sure nfs is running on the server<br />
<br />
$ /etc/init.d/nfs restart<br />
<br />
At the server the contents of /etc/exports for<br />
allowing 2 computers (192.168.1.171 and 192.168.1.71)<br />
to access the home directory of this server. Note that<br />
read write (rw) access is allowed.<br />
<br />
$ cat /etc/exports<br />
/home 192.168.1.171(rw)<br />
/home 192.168.1.71(rw)<br />
<br />
Or, if you have a lot of clients on 192.168.1.* then consider<br />
the following:<br />
<br />
/home 192.168.1.0/255.255.252.0(rw)<br />
<br />
Next, still at the server, run the exportfs command<br />
<br />
$ exportfs -rv<br />
<br />
IPTABLES (lokkit). If you're using fedora with default lokkit firewall<br />
then you can put the following under "Other ports".<br />
<br />
Other ports nfs:tcp nfs:udp<br />
<br />
<br />
If the above does not work or you are not using lokkit<br />
IPTABLES (values in /etc/sysconfig/iptables on SERVER )<br />
<br />
# NFS Need to accept fragmented packets and may not have header<br />
# so you will not know where they are coming from<br />
-A INPUT -f -j ACCEPT<br />
-A INPUT -p tcp -m tcp -s 192.168.1.171 -m multiport --dports 111,683,686,685,1026,2049,2219 -j ACCEPT<br />
-A INPUT -p tcp -s 192.168.1.171 -d 0/0 --dport 32765:32768 -j ACCEPT<br />
-A INPUT -p udp -m udp -s 192.168.1.171 -m multiport --dports 111,683,686,685,1026,2049,2219 -j ACCEPT<br />
-A INPUT -p udp -s 192.168.1.171 -d 0/0 --dport 32765:32768 -j ACCEPT<br />
<br />
-A INPUT -f -j ACCEPT<br />
-A INPUT -p tcp -m tcp -s 192.168.1.71 -m multiport --dports 111,683,686,685,1026,2049,2219 -j ACCEPT<br />
-A INPUT -p tcp -s 192.168.1.71 -d 0/0 --dport 32765:32768 -j ACCEPT<br />
-A INPUT -p udp -m udp -s 192.168.1.71 -m multiport --dports 111,683,686,685,1026,2049,2219 -j ACCEPT<br />
-A INPUT -p udp -s 192.168.1.71 -d 0/0 --dport 32765:32768 -j ACCEPT<br />
<br />
(Reference: http://nfs.sourceforge.net/nfs-howto/server.html)<br />
and<br />
(Reference: http://nfs.sourceforge.net/nfs-howto/security.html)<br />
<br />
<br />
CLIENT1 (192.168.1.171)<br />
<br />
$ mkdir -p /home2<br />
<br />
$ cat /etc/fstab<br />
192.168.1.182:/home /home2 nfs rw 0 0<br />
<br />
$ mount -a -t nfs<br />
<br />
Or to do a one time mounting by hand<br />
<br />
$ mount -t nfs 192.168.1.182:/home /home2<br />
<br />
Now /home2 on the client will be /home on the server<br />
<br />
Reference:<br />
http://nfs.sourceforge.net/nfs-howto/index.html<br />
<br />
MONITOR NFS:<br />
<br />
To monitor the client:<br />
<br />
$ nfsstat -c<br />
<br />
Also note you can "cat /proc/net/rpc/nfs" as well.<br />
<br />
To monitor the server (note the -s instead of the -c).<br />
<br />
$ nfsstat -s<br />
<br />
Also note you can "cat /proc/net/rpc/nfsd" as well.<br />
<br />
<br />
The following "cat" command is done on the NFS server, and shows which<br />
clients are mounting. This does not go with examples above. By the way,<br />
"root_squash" is the default, and means that root access on the clients is<br />
denied. So, how does the client root get access to these filesystems? You have<br />
to "su - <someuser>".<br />
<br />
$ cat /proc/fs/nfs/exports<br />
# Version 1.1<br />
# Path Client(Flags) # IPs<br />
/home 192.168.1.102(rw,root_squash,sync,wdelay)<br />
/home squeezel.squeezel.com(rw,root_squash,sync,wdelay)<br />
/home 192.168.1.106(rw,root_squash,sync,wdelay)<br />
/home livingroom.squeezel.com(rw,root_squash,sync,wdelay)<br />
/home 10.8.0.1(rw,root_squash,sync,wdelay)<br />
/home closet.squeezel.com(rw,root_squash,sync,wdelay)<br />
<br />
(Reference: http://www.vanemery.com/Linux/NFSv4/NFSv4-no-rpcsec.html#automount )<br />
<br />
<br />
<br />
<br />
TIP 105:<br />
<br />
Ports used for Microsoft products<br />
http://www.microsoft.com/canada/smallbiz/sgc/articles/ref_net_ports_ms_prod.mspx?pf=true<br />
Firewalling?<br />
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/library/ServerHelp/428c1bbf-2ceb-4f76-a1ef-0219982eca10.mspx<br />
<br />
To find out common port mappings, take a look at "/etc/services"<br />
<br />
<br />
<br />
TIP 106:<br />
<br />
Man pages: If man pages are formatting incorrectly with PuTTY, try editing<br />
the "/etc/man.config" file with the following changes:<br />
<br />
NROFF /usr/bin/groff -Tlatin1 -mandoc<br />
NEQN /usr/bin/geqn -Tlatin1<br />
<br />
(Reference TIP 7 for using man)<br />
<br />
<br />
<br />
TIP 107:<br />
<br />
Valgrind: check for memory leaks in your programs. (http://valgrind.org/)<br />
<br />
This is how you can run it on the program "a.out" for valgrind version 2.2.0<br />
<br />
$ valgrind --logfile=valgrind.output --tool=memcheck ./a.out<br />
<br />
This is how you write the logfile "--log-file" for valgrind-3.0.1<br />
<br />
$ valgrind --log-file=valgrind --leak-check=yes --tool=memcheck ./a.out<br />
<br />
With C++ programs with gcc 3.4 and later that use STL, export GLIBCXX_FORCE_NEW <br />
only when testing to disable memory caching. Remember to enable for production<br />
as this will have a performance penalty. Reference http://valgrind.org/docs/FAQ/ <br />
<br />
<br />
<br />
TIP 108:<br />
<br />
Runlevel Configuring.<br />
<br />
These two programs, run as root give you a ncurses GUI to what will<br />
run on your system on boot.<br />
<br />
# ntsysv<br />
<br />
# chkconfig<br />
<br />
Note, you can also set these manually. For example, normally you will<br />
have files in "/etc/init.d/" that will take parameters like "start","stop"<br />
"restart".<br />
<br />
Take a look at "/etc/init.d/mysql" this file will start and stop the<br />
mysql daemon. So, how does know which run levels, and the order it gets<br />
loaded in the run level to other programs? By the K<number> and S<number><br />
values.<br />
<br />
$ ls /etc/rc3.d/*mysql<br />
<br />
/etc/rc3.d/K85mysql<br />
/etc/rc3.d/S85mysql<br />
<br />
So here on my system the start value is 85. Looking in /etc/rc3.d, which is<br />
run level 3, any program with a lower number S84something will get loaded<br />
before mysql.<br />
<br />
I manually set the run level as follows for mysql.<br />
<br />
# cd /etc/rc3.d<br />
# ln -s ../init.d/mysql S85mysql<br />
# ln -s ../init.d/mysql K85mysql<br />
<br />
# cd /etc/rc5.d<br />
# ln -s ../init.d/mysql S85mysql<br />
# ln -s ../init.d/mysql K85mysql<br />
<br />
Note that I could have chose other numbers as well. "ntsysv" gives<br />
you a graphical interface.<br />
<br />
This is a way of doing this with "chkconfig" at the command prompt.<br />
<br />
# chkconfig --list mysqld<br />
mysqld 0:off 1:off 2:off 3:on 4:off 5:on 6:off<br />
<br />
Above you can see it's on. Here's how we would have turned this on with chkconfig.<br />
<br />
# chkconfig --level 35 mysqld on<br />
<br />
<br />
<br />
<br />
TIP 109:<br />
<br />
File Alteration Monitor - Gamin a FAM replacement<br />
http://www.gnome.org/~veillard/gamin/<br />
http://www.gnome.org/~veillard/gamin/sources/<br />
****** EXAMPLE NOT COMPLETE *****<br />
<br />
Working with fam - file alteration monitor. Mail uses this to signify<br />
a change in a file's status.<br />
<br />
Below is the sample C program ftest.c which can be compiled as<br />
follows:<br />
<br />
$ gcc -o ftest ftest.c -lfam<br />
<br />
You will need to work with this as root<br />
<br />
# ./ftest <somefile absolute path><br />
<br />
<br />
Reference:<br />
http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?db=man&fname=/usr/share/catman/p_man/cat3x/fam.z<br />
http://www.devchannel.org/devtoolschannel/04/05/13/2146252.shtml<br />
<br />
<br />
<br />
TIP 110:<br />
<br />
glibc - this is the main library used by C, and the following<br />
link below gives you examples on everything from sockets,math,<br />
date and time functions, user environment, and much more.<br />
<br />
http://www.gnu.org/software/libc/manual/html_mono/libc.html<br />
<br />
How do you know which version of glibc you are running?<br />
<br />
#include <stdio.h><br />
#include <gnu/libc-version.h><br />
int main (void)<br />
{<br />
puts (gnu_get_libc_version ());<br />
return 0;<br />
}<br />
<br />
<br />
<br />
TIP 111:<br />
<br />
nslookup and dig - query Internet name servers interactively.<br />
<br />
$ nslookup<br />
>chirico.org<br />
Server: 68.80.0.6<br />
Address: 68.80.0.6#53<br />
<br />
Name: chirico.org<br />
Address: 66.35.250.210<br />
><br />
<br />
The nslookup command will query the dns server is "/etc/resolve.conf"<br />
However, you can force a certain dns with "- server". For example the<br />
command below goes to the server named dilbert<br />
<br />
$ nslookup - dilbert<br />
><br />
<br />
dig:<br />
<br />
dig gives you more information. You should probably use dig instead<br />
of nslookup.<br />
<br />
Below I am forcing the lookup from DNS 68.80.0.6 of the name chirico.org, and<br />
note that the query time is return too.<br />
<br />
$ dig @68.80.0.6 +qr chirico.org<br />
<br />
; <<>> DiG 9.2.1 <<>> @68.80.0.6 +qr chirico.org<br />
;; global options: printcmd<br />
;; Sending:<br />
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55908<br />
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0<br />
<br />
;; QUESTION SECTION:<br />
;chirico.org. IN A<br />
<br />
;; Got answer:<br />
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55908<br />
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2<br />
<br />
;; QUESTION SECTION:<br />
;chirico.org. IN A<br />
<br />
;; ANSWER SECTION:<br />
chirico.org. 5538 IN A 66.35.250.210<br />
<br />
;; AUTHORITY SECTION:<br />
chirico.org. 30599 IN NS ns78.worldnic.com.<br />
chirico.org. 30599 IN NS ns77.worldnic.com.<br />
<br />
;; ADDITIONAL SECTION:<br />
ns78.worldnic.com. 16022 IN A 216.168.225.218<br />
ns77.worldnic.com. 7 IN A 216.168.228.41<br />
<br />
;; Query time: 155 msec<br />
;; SERVER: 68.80.0.6#53(68.80.0.6)<br />
;; WHEN: Thu Dec 23 07:48:23 2004<br />
;; MSG SIZE rcvd: 127<br />
<br />
So what if you wanted to know what name the IP address 66.35.250.210<br />
resolves to, when using dns 68.80.0.12.<br />
<br />
$ dig @68.80.0.12 -x 66.35.250.210<br />
...<br />
;; ANSWER SECTION:<br />
210.250.35.66.in-addr.arpa. 3600 IN CNAME 210.0/24.250.35.66.in-addr.arpa.<br />
210.0/24.250.35.66.in-addr.arpa. 3600 IN PTR vhost.sourceforge.net.<br />
<br />
Above you can see it resolved to "vhost.sourceforge.net"<br />
<br />
Reference ( http://www.tldp.org/HOWTO/DNS-HOWTO-5.html )<br />
Also see TIP 223.<br />
<br />
<br />
<br />
TIP 112:<br />
<br />
Using GNU Autotools - so you can produce the familiar "./configure" "make" and "make install"<br />
commands. There is also a "make dist".<br />
<br />
The program sqlite3api.cc and the rest of this code can be found at<br />
http://prdownloads.sourceforge.net/cpearls/autotools.tar.gz?download<br />
<br />
<br />
A "Makefile.am" is required:<br />
<br />
bin_PROGRAMS = sprog<br />
sprog_SOURCES = sqlite3api.cc<br />
sprog_LDADD = @INCLUDES@ @SQLIBOBJS@<br />
<br />
<br />
In addition, a "configure.in" file is required. Note, AC_CHECK_LIB will<br />
check the "libsqlite3.so" file for the "sqlite3_open" file. Note that<br />
"sqlite3", is a shortcut for "libsqlite3" by convention. If this file<br />
is not found, AC_CHECK_FILE looks for "/usr/local/lib/libsqlite3.a". If<br />
this is found, then, "-lsqlite3" is added to the LIBS environment variable.<br />
Also, "-I/usr/local/include" and "-L/usr/local/lib" will be added on the<br />
command line. This is common when some one does not have the library in<br />
the path. (See TIP 49)<br />
<br />
dnl Process this file with autoconf to produce a configure script.<br />
AC_INIT(sqlite3api.cc)<br />
AM_INIT_AUTOMAKE(sqliteprog, 1.0)<br />
AC_PROG_CXX<br />
CXXFLAGS='-Wall -W -O2 -s -pipe'<br />
AC_CHECK_LIB(sqlite3,sqlite3_open,[],found=no)<br />
if test "$found" = "no"; then<br />
AC_CHECK_FILE(/usr/local/lib/libsqlite3.a, found=yes)<br />
if test "$found" = "yes"; then<br />
LIBS="$LIBS -lsqlite3"<br />
INCLUDES="$INCLUDES -I/usr/local/include"<br />
EXTRALIB='-L/usr/local/lib'<br />
else<br />
echo "Are you SURE sqlite3 is installed?"<br />
fi<br />
fi<br />
SQLIBOBJS='-Wl,-R/usr/local/lib'<br />
AC_SUBST(INCLUDES)<br />
AC_SUBST(SQLIBOBJS)<br />
AC_SUBST(EXTRALIB)<br />
AC_OUTPUT(Makefile)<br />
<br />
<br />
To build the configure file, just run the following:<br />
<br />
$ aclocal<br />
$ autoconf<br />
$ touch NEWS README AUTHORS ChangeLog<br />
$ automake --add-missing<br />
<br />
Now if you want to make a tar.gz file "sqliteprog-1.0.tar.gz", then<br />
all you have to run is the following:<br />
<br />
$ make dist<br />
<br />
Note: did you ever want to save all the output from a ./configure? Well, it<br />
is automatically saved in the "config.log" file. In fact, this file may<br />
contain a lot more than what you saw on the screen.<br />
<br />
Also, you may need to rerun ./configure. But before you do, delete<br />
the "config.cache" file to get a clean build.<br />
<br />
<br />
<br />
TIP 113:<br />
<br />
EMACS - common emacs commands.<br />
<br />
M is the ESC<br />
C or c is the Ctl<br />
<br />
Shell - when working in a shell. "M-x rename-uniquely" is good for split screen editing.<br />
<br />
M-x rename-uniquely Use this for multiple shells (renames buffer so it's not the same shell)<br />
C-c C-z Send job in background (when working in a shell)<br />
C-c C-o commit-kill-output (gets rid of a lot of shell output)<br />
C-c C-r reposition at beginning of output<br />
C-c C-e reposition at end of output<br />
M-x send-invisible Hide passwords - use this before typing a password<br />
<br />
Note: if the shell prompt does not show up correctly, then, you may want to creat a ".emacs_bash"<br />
file with the following contents:<br />
<br />
PS1="emacs:\W \$ "<br />
<br />
Directories (C-x d) give you a directory listing. You know all those annoying "~" and "#"<br />
file that you get? You can easily delete these when in "dired" mode by hitting<br />
"~", then "d" to flag it for delete. Then, hit "x" to and confirm deletion.<br />
<br />
These are other command that work on highlighted files in "dired" mode.<br />
<br />
R rename<br />
v view<br />
Z compress the file<br />
+ create directory<br />
<br />
Other common commands:<br />
<br />
c-x l list the line you are on, and how many lines in the document.<br />
You will get something like: Page has 4881 lines (4440 + 442),<br />
which means you are on the 4440 line.<br />
<br />
c-x rm bookmark make<br />
c-x rb bookmark bounce<br />
<br />
c-x rb notes<br />
c-x rb emacs<br />
<br />
c-x / <r> (save position in register <r>)<br />
c-x j <r> (jump to position in register <r>)<br />
c-x r SPC 1 (mark current point in register 1)<br />
c-x r j 1 (jump to marked point in register 1)<br />
c-x r t <string> (insert string into register)<br />
<br />
c-x r s 1 (save marked region in register 1)<br />
c-x r i 1 (insert marked region)<br />
<br />
c-x c-o (delete all blank lines, except one)<br />
<br />
c-x z (repeat the last command ... stop with an a)<br />
c-x zz (repeat the last command twice)<br />
<br />
rectangle<br />
---------<br />
C-SPC<br />
goto the next region<br />
C-x<br />
C-x<br />
then, C-x r r "name of register"<br />
<br />
to insert the register<br />
C-x r i "name of register"<br />
<br />
macros:<br />
-------<br />
c-x ( start macro<br />
c-x ) end macro<br />
c-x e execute macro<br />
<br />
mail:<br />
-----<br />
c-x m mail<br />
c-c c-s send<br />
<br />
C-x C-e<br />
(insert "\n\nExtra Line of text")<br />
<br />
;; chirico functions in .emacs<br />
;; This creates an html template<br />
(defun my-html ()<br />
(interactive)<br />
(insert "<html><br />
<head><br />
<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\"><br />
<META HTTP-EQUIV=\"Expires\" CONTENT=\"-1\"><br />
</head><br />
<body bgcolor=\"#ffffff\"><br />
<br />
<br />
</body><br />
</html>")<br />
)<br />
<br />
Backspace issues when using "emacs -nw"? They putting the following in your "~/.emacs" file<br />
<br />
(global-set-key "\C-d" 'backward-delete-char)<br />
(global-set-key "\C-h" 'backward-delete-char)<br />
(global-set-key (kbd "DEL") 'delete-char)<br />
<br />
<br />
<br />
TIP 114:<br />
<br />
ncftpget - an intelligent ftp client (http://www.ncftp.com/). Also<br />
check your fedora or debian install. This package allows<br />
you to easily download packages from ftp sites.<br />
<br />
This is an example of connect to an ftp site, with a subdirectory, and<br />
downloading all in one command.<br />
<br />
$ ncftpget ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.2.3/gcc-3.2.3.tar.gz<br />
<br />
Of if you want to get the fedora core 3 installs<br />
<br />
$ ncftpget ftp://ftp.linux.ncsu.edu/pub/fedora/linux/core/3/i386/iso/FC3*<br />
<br />
<br />
<br />
TIP 115:<br />
<br />
expr - evaluate expressions. You can use this on the command line<br />
<br />
$ expr 6 + 4<br />
10<br />
<br />
Note the spaces. Without spaces, you get the following:<br />
<br />
$ expr 6+4<br />
6+4<br />
<br />
If you're using "*", you'll need a "\" before it<br />
<br />
$ expr 10 \* 10<br />
100<br />
<br />
This also works for variables<br />
<br />
$ var1=34<br />
$ expr $var1 + 3<br />
37<br />
<br />
or<br />
<br />
$ var1=2<br />
$ var1=`expr $var1 \* 2`<br />
$ echo $var1<br />
4<br />
<br />
see (TIP 25) you can get the cosine(.23)<br />
<br />
$ var1=`echo "c(.23)"|bc -l`<br />
$ echo $var1<br />
.97366639500537483696<br />
<br />
<br />
You can also do substrings:<br />
<br />
$ expr substr "BigBear" 4 4<br />
Bear<br />
<br />
And length of strings<br />
<br />
$ mstr="12345"<br />
$ expr length $mstr<br />
5<br />
<br />
Regular expressions<br />
<br />
$ expr "a3" : [a-z][1-9]<br />
2<br />
<br />
Or you can get a bit fancy<br />
<br />
$ myexpr="[a-z][1-9]"<br />
$ echo $myexpr<br />
[a-z][1-9]<br />
<br />
$ expr "a3" : $myexpr<br />
2<br />
<br />
This may not be the best way to find out if it is Friday, but<br />
it seems to work. It's more of an exercise in xargs.<br />
<br />
$ date<br />
Fri Dec 31 16:44:47 EST 2004<br />
$ date|xargs -i expr {} : "[Fri]"<br />
1<br />
<br />
<br />
<br />
TIP 116:<br />
<br />
eval<br />
<br />
$ mypipe="|"<br />
$ eval ls $mypipe wc<br />
6 6 129<br />
<br />
Did you catch that? The above statement is the same as<br />
<br />
$ ls | wc<br />
<br />
Where "|" is put into the variable $mypipe<br />
<br />
(also see TIP 118)<br />
<br />
<br />
<br />
TIP 117:<br />
<br />
lxr, glimpse, patchset - tools for reading the kernel source<br />
<br />
This example puts some of the files in /home/src since my home<br />
partition is the largest. Plus, you do not want to over write<br />
the source in /usr/src/ If you want to put your files elsewhere<br />
just substitute /home/src for your desired directory.<br />
<br />
patchset -- download and setup<br />
<br />
$ export SRCDIR=/home/src<br />
$ cd $SRCDIR<br />
$ wget http://www.csn.ul.ie/~mel/projects/patchset/patchset-0.5.tar.gz<br />
$ export PATH=$PATH:$SRCDIR/patchset-0.5/bin<br />
<br />
Now edit "/home/src/patchset-0.5/etc/patchset.conf" and set WWW_USER to<br />
whatever your website runs as<br />
<br />
export WWW_USER=nobody<br />
<br />
Getting kernel source. The last step builds and asks a lot of questions. Enter<br />
yes to things that interest you, since this is what you will see in the source<br />
code. It is not going to build for booting. The "downlaod -p" is for downloading<br />
a patch.<br />
<br />
$ download 2.6.10<br />
$ createset 2.6.10<br />
$ make-kernel -b 2.6.10<br />
<br />
glimpse -- download and setup<br />
<br />
$ mkdir -p /home/src/glimpse<br />
$ cd /home/src/glimpse<br />
$ wget http://webglimpse.net/trial/glimpse-latest.tar.gz<br />
$ tar -xzf glimpse-latest.tar.gz<br />
$ cd glimpse-4.18.0<br />
$ ./configure; make<br />
$ make install<br />
<br />
lxr -- download and setup<br />
<br />
$ make -p /home/src/lxr<br />
$ cd /home/src/lxr<br />
$ wget http://heanet.dl.sourceforge.net/sourceforge/lxr/lxr-0.3.1.tar.gz<br />
$ cd lxr-0.3<br />
<br />
Edit "Makefile" and set PERLBIN to "/usr/bin/perl" or the where perl is<br />
on your system. Also set INSTALLPREFIX to "/var/www/lxr". Then, as root<br />
do the following:<br />
<br />
$ make install<br />
<br />
Apache changes<br />
<br />
Next edit the apache httpd.conf. On my system it is<br />
"/usr/local/apache2/conf/httpd.conf", but if you did a fedora install<br />
I think this file is located at "/etc/httpd/conf/httpd.conf".<br />
<br />
Alias /lxr/ "/var/www/lxr/"<br />
<Directory "/var/www/lxr/"><br />
Options ExecCGI Indexes Includes FollowSymLinks MultiViews<br />
AllowOverride all<br />
Order allow,deny<br />
Allow from all<br />
<br />
<Files ~ (search|source|ident|diff|find)><br />
SetHandler cgi-script<br />
</Files><br />
</Directory><br />
<br />
lxr - continued "/var/www/lxr/http/lxr.conf" changes. The following contains<br />
my lxr.conf with changes made to almost every variable. Make sure you use<br />
your website in place of 192.168.1.71<br />
<br />
# Configuration file.<br />
<br />
# Define typed variable "v", read valueset from file.<br />
variable: v, Version, [/var/www/lxr/source/versions], [/var/www/lxr/source/defversion]<br />
<br />
# Define typed variable "a". First value is default.<br />
variable: a, Architecture, (i386, alpha, m68k, mips, ppc, sparc, sparc64)<br />
<br />
# Define the base url for the LXR files.<br />
baseurl: http://192.168.1.71/lxr/http/<br />
<br />
# These are the templates for the HTML heading, directory listing and<br />
# footer, respectively.<br />
htmlhead: /var/www/lxr/http/template-head<br />
htmltail: /var/www/lxr/http/template-tail<br />
htmldir: /var/www/lxr/http/template-dir<br />
<br />
# The source is here.<br />
sourceroot: /var/www/lxr/source/$v/<br />
srcrootname: Linux<br />
<br />
# "#include <foo.h>" is mapped to this directory (in the LXR source<br />
# tree)<br />
incprefix: /include<br />
<br />
# The database files go here.<br />
dbdir: /var/www/lxr/source/$v/<br />
<br />
# Glimpse can be found here.<br />
glimpsebin: /usr/local/bin/glimpse<br />
<br />
# The power of regexps. This is pretty Linux-specific, but quite<br />
# useful. Tinker with it and see what it does. (How's that for<br />
# documentation?)<br />
map: /include/asm[^\/]*/ /include/asm-$a/<br />
map: /arch/[^\/]+/ /arch/$a/<br />
<br />
Now you should be ready to run "make-lxr". Make sure the path is setup to patchset,<br />
which is repeated here. The last step take awhile.<br />
<br />
$ export SRCDIR=/home/src<br />
$ cd $SRCDIR<br />
$ export PATH=$PATH:$SRCDIR/patchset-0.5/bin<br />
<br />
$ make-lxr 2.6.10<br />
<br />
Now you need to index the source. Below the ./glimpse_* file will be put in<br />
root. Checkout the -H option if you do not want them here on a temporary<br />
bases of if you run out of room.<br />
<br />
$ glimpseindex -o -t -w 5000 /var/www/lxr/source/2.6.10 >& .glimpse_out<br />
<br />
Since the above put the files under /root/.glimpse_* they should be moved<br />
<br />
$ mv /root/.glimps_* /var/www/lxr/source/2.6.10/.<br />
$ chown -R nobody.nobody ./.glimpse_*<br />
<br />
<br />
<br />
TIP 118:<br />
<br />
exec - you can change standard output and input without starting a new<br />
process.<br />
<br />
The exec redirect the output from ls and date to a file. Nothing<br />
is show on the terminal until "exec > /dev/tty" is performed<br />
<br />
$ exec > mfile<br />
$ ls<br />
$ date<br />
$ exec > /dev/tty<br />
<br />
This is an example of assigning file descriptor 3 to file "output3" for<br />
output, then, redirecting "ls" to this descriptor. Finally, file descriptor<br />
3 is used for input, and the contents are read into the cat command.<br />
<br />
<br />
$ exec 3>output3<br />
$ ls >& 3<br />
$ exec 3<output3<br />
$ cat <&3<br />
ChangeLog<br />
CVS<br />
How_to_Linux_and_Open_Source.txt<br />
How_to_Linux_and_Open_Source.txt.~1.193.~<br />
mfile<br />
mfile2<br />
mfile3<br />
mftp<br />
output3<br />
<br />
Could you redirect the output to 3 files and stderr?<br />
<br />
$ exec 3>output3<br />
$ exec 4>output4<br />
$ exec 5>output5<br />
<br />
$ ls >& 3 >& 4 >& 5 >& 2 // Nope, can't do this.<br />
output3 output4 output5<br />
<br />
Instead, you should do the following:<br />
<br />
$ ls | tee output3 | tee output4 |tee output5<br />
<br />
Closing the "output" file descriptor<br />
<br />
$ >&3-<br />
<br />
Closing the "input" file descriptor<br />
<br />
$ 3<&-<br />
<br />
See what is still open on 0-10<br />
<br />
$ lsof -a -p $$ -d 0-10<br />
<br />
Recursion - the following counts to 5, then, quits.<br />
<br />
#!/bin/bash<br />
sleep 1<br />
declare -x n<br />
let n=${n:=0}+1<br />
[ $n -le 5 ] && echo "$n" && exec $0<br />
<br />
There are some real-life applications for this technique, as follows:<br />
<br />
#!/bin/bash<br />
declare -x N<br />
declare -x n<br />
N=${N:=$(od -vAn -N1 -tu4 < /dev/urandom)}<br />
let n=${n:=0}+1<br />
[ $(($n%2)) -eq 0 ] && echo "She Loves Me!" || echo "She Loves Me NOT!"<br />
[ $n -lt $N ] && exec $0<br />
<br />
<br />
<br />
TIP 119:<br />
<br />
runlevel - need to know the current runlevel?<br />
<br />
$ who -r<br />
run-level 3 Dec 31 19:02 last=S<br />
<br />
Need to know the architecture?<br />
<br />
$ arch<br />
i686<br />
<br />
<br />
<br />
TIP 120:<br />
<br />
at - executes commands at a specified time.<br />
<br />
A few examples here. The 1970 program will run<br />
next Auguest 2 even though the year 1970 has long past.<br />
<br />
$ at 6:30am Jan 12 < program<br />
$ at noon tomorrow < program<br />
$ at 1970 pm August 2 < program<br />
<br />
This is an interactive way to use the command:<br />
<br />
$ at now + 6 minutes<br />
warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh<br />
at> ls<br />
at> date > /tmp/5min<br />
at> ^D<br />
job 3 at 2005-01-01 08:50<br />
<br />
What jobs are in the queue?<br />
<br />
$ atq<br />
<br />
or<br />
<br />
$ at -l<br />
<br />
<br />
<br />
TIP 121:<br />
<br />
Creating a Manpage<br />
<br />
As root you can copy the following to /usr/local/man/man1/soup.1 which will<br />
give you a manpage for soup.<br />
<br />
.\" Manpage for souptonuts.<br />
.\" Contact mchirico@users.sourceforge.com to correct errors or omissions.<br />
.TH man 1 "04 January 2005" "1.0" "souptonuts man page"<br />
.SH NAME<br />
soup \- man page for souptonuts<br />
.SH SYNOPSIS<br />
soup<br />
.SH DESCRIPTION<br />
souptonuts is a collection of linux and open<br />
source tips.<br />
off for golf.<br />
.SH OPTIONS<br />
The souptonuts does not take any options.<br />
.SH SEE ALSO<br />
doughnut(1), golf(8)<br />
.SH BUGS<br />
No known bugs at this time.<br />
.SH AUTHOR<br />
Mike Chirico (mchirico@comcast.net mchirico@users.sourceforge.net)<br />
<br />
So, to view this man page<br />
<br />
$ man soup<br />
<br />
It's also possible to compress<br />
<br />
$ gzip /usr/local/man/man1/soup.1<br />
<br />
For plenty of examples look at the other man pages. Also the following<br />
is helpful. The last one is a tutorial "man 7 mdoc"<br />
<br />
$ man manpath<br />
$ man groff<br />
$ man 7 mdoc<br />
<br />
<br />
<br />
TIP 122:<br />
<br />
dmesg - print out boot messages, or what is in the kernel ring buffer.<br />
<br />
If you missed the messages on boot-up, you can use dmesg to print them.<br />
<br />
$ dmesg > boot.msg<br />
<br />
Or to print, then, clear the ring<br />
<br />
# dmesg -c > boot.msg<br />
<br />
(also see TIP 20)<br />
<br />
<br />
<br />
TIP 123:<br />
<br />
gnus - emacs email nntp news reader (comcast as example with NO TLS or SSL)<br />
<br />
First check that you can connect to the news group:<br />
<br />
$ telnet newsgroups.comcast.net 119<br />
Trying 216.196.97.136...<br />
Connected to newsgroups.comcast.net.<br />
Escape character is '^]'.<br />
200 News.GigaNews.Com<br />
<br />
If you want to check for TLS or SSL see (TIP 54).<br />
<br />
Here is a very simple configuration example without encryption. It<br />
appears that comcast does not support ssl or TLS.<br />
<br />
In the "~/.emacs" file you would add the following to get comcast<br />
news groups<br />
<br />
(setq gnus-select-method '(nntp "newsgroups.comcast.net"))<br />
<br />
Then, create an "~/.authinfo" file with the following settings using<br />
you own username and password.<br />
<br />
machine newsgroups.comcast.net login borkey@comcast.net password borkeypass0rd<br />
<br />
Next create a "~/.newsrc" with your groups<br />
<br />
news.announce.newusers:<br />
comp.lang.c++.moderated! 1-500<br />
comp.unix.programmer! 1-500<br />
comp.unix.shell! 1-500<br />
gnu.emacs.gnus! 1-500<br />
<br />
Finally, create a "~/.gnus" with the following email settings for you<br />
<br />
(setq user-mail-address "mchirico@comcast.net")<br />
<br />
(defun my-message-mode-setup ()<br />
(setq fill-column 72)<br />
(turn-on-auto-fill))<br />
(add-hook 'message-mode-hook 'my-message-mode-setup)<br />
<br />
To get into gnus<br />
<br />
E-x gnus<br />
<br />
The following are common gnus commands<br />
<br />
RET view the article under the cursor<br />
<br />
A A (shift-a, shift a): List all newsgroups known<br />
to the server.<br />
<br />
l (lower-case L) : List only subscribed groups<br />
with unread articles.<br />
<br />
L : List all newsgroups in .newsrc file.<br />
<br />
g : See if new articles have arrived.<br />
<br />
Some commands for reading<br />
<br />
n next unread article<br />
<br />
p previous article<br />
<br />
SPC scroll down moves to next unread<br />
when at the bottom of the article<br />
<br />
del scroll up<br />
<br />
F follow-up to group on the article you are<br />
reading now.<br />
<br />
f follow-up to group without citing the article<br />
<br />
R reply by mail and cite the article<br />
<br />
r reply by mail without citing the article<br />
<br />
m new mail<br />
<br />
a new posting<br />
<br />
c Catchup<br />
<br />
C-u / t Show only young headers<br />
/ t without C-u limits the summary<br />
to old headers<br />
<br />
T T toggle threading<br />
<br />
C-u g Display raw article<br />
hit g to return to normal view<br />
<br />
t Show all headers it's a toggle<br />
<br />
W w Wordwrap the current article<br />
<br />
W r Decode ROT13 a toggle<br />
<br />
^ fetch parent of article<br />
<br />
L create a scorefile-entry based<br />
on the current article (low score)<br />
? gives you information what each char means<br />
<br />
I like L but high score<br />
<br />
Commands to send email<br />
<br />
C-c C-c send message<br />
<br />
C-c C-d save message as draft<br />
<br />
C-c C-k kill message<br />
<br />
C-c C-m f attach file<br />
<br />
M-q reformat paragraph<br />
<br />
<br />
TIP 124:<br />
<br />
Sending Email from telnet<br />
<br />
Note, if you are on the computer you can sometime use the local loopback.<br />
In fact, sometimes you can only use the local loop back 127.0.0.1 in<br />
place of "bozo.company.com"<br />
<br />
1 [mchirico@soup Notes]$ telnet bozo.company.com 25<br />
2 Trying 192.168.0.204...<br />
3 Connected to bozo.company.com.<br />
4 Escape character is '^]'.<br />
5 220 bozo.company.com ESMTP Postfix (Postfix-20010228-pl03) (Mandrake Linux)<br />
6 HELO fakedomain.com<br />
7 HELO fakedomain.com // server echo<br />
8 250 bozo.company.com<br />
9 MAIL FROM: test@fakedomain.com<br />
10 MAIL FROM: test@fakedomain.com // server echo<br />
11 250 Ok<br />
12 RCPT TO: mchirico@someother.com<br />
13 RCPT TO: mchirico@someother.com // server echo<br />
14 250 Ok<br />
15 DATA<br />
16 DATA // echo<br />
17 354 Enter mail, end with "." on a line by itself<br />
18 This is a test message<br />
19 This is a test message<br />
20 to send<br />
21 to send<br />
22 .<br />
23 250 2.0.0 j0B0uH3L018469 Message accepted for delivery<br />
<br />
Above on line 6 you can type in any domain name. Line 7 is an echo. All<br />
echos are listed in the comment field.<br />
<br />
<br />
<br />
TIP 125:<br />
<br />
IP forwarding, IP Masquerade<br />
<br />
# echo 1 > /proc/sys/net/ipv4/ip_forward<br />
# ipchains -F forward<br />
# ipchains -P forward DENY<br />
# ipchains -A forward -s 192.168.0.0/24 -j MASQ<br />
# ipchains -A forward -i eth1 -j MASQ<br />
<br />
<br />
This assumes that your internal network is 192.168.0.0 on eth1, and the<br />
internet is connected to eth0.<br />
<br />
(Also See TIP 182)<br />
<br />
<br />
<br />
TIP 126:<br />
<br />
Setting KDE as the default desktop manager<br />
<br />
Edit "/etc/sysconfig/desktop" to include the two lines:<br />
<br />
DESKTOP="KDE"<br />
DISPLAYMANAGER="KDE"<br />
<br />
<br />
<br />
TIP 127:<br />
<br />
Have a file and you do not know whay type it is (tar, gz, ASCII, binary) ?<br />
Use the file command. Below it is used on the file "mftp"<br />
<br />
$ file mftp<br />
mftp: Bourne-Again shell script text executable<br />
<br />
<br />
<br />
TIP 128:<br />
<br />
Software RAID: Two good references<br />
<br />
http://www.tldp.org/HOWTO/Software-RAID-HOWTO-1.html<br />
http://lists.us.dell.com/pipermail/linux-poweredge/2003-July/014331.html<br />
<br />
Note, you must setup grub for each RAID 1 device. Suppose you have<br />
2 SCSI drives (sda and sdb). By default grub is setup on sda; but, you<br />
need to enable it for sdb (/dev/hdb for ide) as follows:<br />
<br />
grub>device (hd0) /dev/sdb<br />
grub>root (hd0,0)<br />
grub>setup (hd0)<br />
<br />
Checking if "/boot/grub/stage1" exists... no<br />
Checking if "/grub/stage1" exists... yes<br />
Checking if "/grub/stage2" exists... yes<br />
Checking if "/grub/e2fs_stage1_5" exists.. yes<br />
Running "embed /grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded.<br />
succeeded<br />
Running "install /grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/grub/stage2 /grub/grub<br />
.conf"... succeeded.<br />
Done.<br />
<br />
grub><br />
grub>quit<br />
<br />
<br />
Checking to see if everything is working:<br />
<br />
$ cat /proc/mdstat<br />
<br />
Checking the drives<br />
<br />
$ sfdisk -d /dev/sdb<br />
$ sfdisk -d /dev/sda<br />
<br />
$ fdisk -l /dev/sda "This will give general information"<br />
$ fdisk -l "General information for all drives"<br />
<br />
Adding raid (assume you want to add the first drive "sda1", or if it is the second<br />
drive then substitute "sda2" below )<br />
<br />
$ raidhotadd /dev/md0 /dev/sda1<br />
$ raidhotadd /dev/md1 /dev/sda2<br />
$ raidhotadd /dev/md2 /dev/sda3<br />
<br />
This is an example of an cat /proc/mdstat that is working. Note that<br />
there is a listing for both sda1[0] and sdb1[1]<br />
<br />
$ cat /proc/mdstat<br />
<br />
Personalities : [raid1]<br />
read_ahead 1024 sectors<br />
Event: 12<br />
md0 : active raid1 sda1[0] sdb1[1]<br />
104320 blocks [2/2] [UU]<br />
<br />
md1 : active raid1 sda2[0] sdb2[1]<br />
1044160 blocks [2/2] [UU]<br />
<br />
md2 : active raid1 sda3[0] sdb3[1]<br />
34411136 blocks [2/2] [UU]<br />
<br />
unused devices: <none><br />
<br />
Compare that to this where md2 is missing sdb3<br />
<br />
$ cat /proc/mdstat<br />
<br />
Personalities : [raid1]<br />
read_ahead 1024 sectors<br />
Event: 9<br />
md0 : active raid1 sda1[0] sdb1[1]<br />
104320 blocks [2/2] [UU]<br />
<br />
md1 : active raid1 sda2[0] sdb2[1]<br />
1044160 blocks [2/2] [UU]<br />
<br />
md2 : active raid1 sdb3[1] <---- HERE<br />
34411136 blocks [2/1] [_U]<br />
<br />
unused devices: <none><br />
<br />
If you are rebuilding an array, you can watch it by doing the following:<br />
<br />
$ watch -n1 cat /proc/mdstat<br />
<br />
Need to know the raid setup?<br />
<br />
$ cat /etc/raidtab<br />
<br />
<br />
<br />
<br />
TIP 129:<br />
<br />
Resetting Redhat Linux Passwords using GRUB<br />
<br />
1. Press 'e'<br />
2. Press 'e' again<br />
3. Append 'single' to the kernel version listing<br />
<br />
See<br />
http://linuxgazette.net/107/tomar.html<br />
<br />
<br />
<br />
TIP 130:<br />
<br />
mtr - matt's traceroute. This is an advanced traceroute that keeps<br />
[http://www.bitwizard.nl/mtr/]<br />
$ mtr www.yahoo.com<br />
<br />
Matt's traceroute [v0.52]<br />
third-fl-71.localdomain Thu Jan 20 11:05:57 2005<br />
Keys: D - Display mode R - Restart statistics Q - Quit<br />
Packets Pings<br />
Hostname %Loss Rcv Snt Last Best Avg Worst<br />
1. 192.168.1.1 0% 3 3 0 0 0 1<br />
2. ???<br />
3. fe-2-6-rr01.willogrove5.pa.pa01 0% 3 3 8 7 7 8<br />
4. srp-8-1-ar01.willowgrove1.pa.pa 0% 2 2 8 8 8 8<br />
5. pos7-3-cr01.torresdale.pa.core. 0% 2 2 8 8 8 8<br />
6. 12.119.53.53 0% 2 2 12 12 12 13<br />
7. tbr1-p012401.phlpa.ip.att.net 0% 2 2 12 12 13 13<br />
8. tbr1-cl8.n54ny.ip.att.net 0% 2 2 13 13 13 13<br />
9. ggr2-p310.n54ny.ip.att.net 0% 2 2 12 12 13 14<br />
10. so-1-0-0.gar4.NewYork1.Level3.n 0% 2 2 14 14 37 61<br />
11. ae-1-54.bbr2.NewYork1.Level3.ne 0% 2 2 13 12 13 13<br />
12. ge-0-3-0.bbr2.Washington1.Level 0% 2 2 19 19 19 19<br />
13. ge-1-1-51.car1.Washington1.Leve 0% 2 2 18 18 19 20<br />
14. 4.79.228.6 0% 2 2 21 19 20 21<br />
15. UNKNOWN-216-109-120-201.yahoo.c 0% 2 2 21 20 20 21<br />
16. w2.rc.vip.dcn.yahoo.com 0% 2 2 23 21 22 23<br />
<br />
<br />
<br />
TIP 131:<br />
<br />
chfn - change finger information<br />
<br />
$ chfn<br />
<br />
Next you are asked for a password and user information.<br />
<br />
<br />
<br />
TIP 132:<br />
<br />
chsh - change login shell<br />
<br />
First, you may want to get a listing of all the possible<br />
shells.<br />
<br />
$ chsh -l<br />
<br />
/bin/sh<br />
/bin/bash<br />
/sbin/nologin<br />
/bin/ash<br />
/bin/bsh<br />
/bin/ksh<br />
/usr/bin/ksh<br />
/usr/bin/pdksh<br />
/bin/tcsh<br />
/bin/csh<br />
/bin/zsh<br />
<br />
<br />
<br />
TIP 133:<br />
<br />
bash - working with binary, hex and base 3.<br />
<br />
For the variable must be declare as an integer. Then<br />
specify the <base>#<value>. The example below is 22 in<br />
base 3.<br />
<br />
$ declare -i n<br />
$ n=3#22<br />
$ echo $n<br />
8<br />
<br />
Base 16 (hex)<br />
<br />
$ declare -i n2<br />
$ n2=16#a<br />
$ echo $n2<br />
10<br />
<br />
Base 8 (octal)<br />
<br />
$ declare -i n3<br />
$ n3=8#11<br />
$ echo $n3<br />
9 Note 8+1=9<br />
<br />
<br />
<br />
TIP 134:<br />
<br />
monitoring IP traffic. Try iptraf http://iptraf.seul.org/<br />
<br />
<br />
<br />
TIP 135:<br />
<br />
enscript - convert text files to PostScript<br />
<br />
<br />
<br />
TIP 136:<br />
<br />
dd and tar - blocking factor. How to determine the blocking factor, block size<br />
so that tar and dd can work together.<br />
<br />
Step 1: Create a large file on local disk, in a directory "1" that will eventually<br />
be written to tape. This will be created with dd as follows:<br />
<br />
$ mkdir 1<br />
$ dd if=/dev/zero of=disk-image count=40960<br />
40960+0 records in<br />
40960+0 records out<br />
<br />
$ cd ..<br />
<br />
Step 2: tar the directory and contents to tape. First rewind the tape. These examples<br />
use /dev/nst0 as the location of the tape. Make sure to substitute your values<br />
if needed.<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ tar --label="Test 1" --create --blocking-factor=128 --file=/dev/nst0 1<br />
<br />
Step 3: Read data from the tape using a block size of 128k. If you get an I/O error, which<br />
could happend if you used a different blocking factor above, then, you may need<br />
to increase the bs to 256, or 512 etc. as needed.<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ dd if=/dev/nst0 bs=128k of=testblocksz count=1<br />
0+1 records in<br />
0+1 records out<br />
<br />
$ ls -l testblocksz<br />
-rw-r--r-- 1 root root 65536 Feb 9 10:41 testblocksz<br />
<br />
$ ls -lh testblocksz<br />
-rw-r--r-- 1 root root 64k Feb 9 10:41 testblocksz<br />
<br />
Note above that the size 65536 is equal to 64k. That "h" switch in "ls" is for<br />
human readable.<br />
<br />
<br />
Step 4: tar uses a multiplier of 512*blocking-factor to get block size. Again<br />
<br />
512 * blocking-factor = block size used in dd command.<br />
<br />
Putting in the values, we see that<br />
<br />
512 * 128 = 65536<br />
<br />
<br />
Step 5: So what does this tell you? You can now use these numbers to "dd" files<br />
to tape. But, first tar will be used to create the file locally.<br />
<br />
$ tar --label="Test 1" --create --blocking-factor=128 --file=test.tar 1<br />
<br />
<br />
Step 6: Send this to tape with the dd command. Remember 64k is equal to 65536.<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ dd if=test.tar bs=64k of=/dev/nst0<br />
<br />
<br />
Step 7: Now test that it can be read with tar command using blocking-factor=128.<br />
Note the "t" command in tar is for tell. It will not write data.<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ tar -tvf /dev/nst0 --blocking-factor=128<br />
V--------- 0/0 0 2005-02-09 10:38:20 Test 1--Volume Header--<br />
drwxr-xr-x root/root 0 2005-02-09 10:34:10 1/<br />
-rw-r--r-- root/root 20971520 2005-02-09 10:34:11 1/disk-image<br />
<br />
<br />
Step 8: Reading tape data with dd. Most of the time a high "ibs" input block size<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ dd if=/dev/nst0 of=outfromdd.tar ibs=64k<br />
321+0 records in<br />
41088+0 records out<br />
<br />
<br />
Step 9: Verify that outfromdd.tar can be read by tar with blocking-factor=128<br />
<br />
$ tar -tvf outfromdd.tar --blocking-factor=128<br />
V--------- 0/0 0 2005-02-09 10:38:20 Test 1--Volume Header--<br />
drwxr-xr-x root/root 0 2005-02-09 10:34:10 1/<br />
-rw-r--r-- root/root 20971520 2005-02-09 10:34:11 1/disk-image<br />
<br />
<br />
PULLING FILES: The dd command can be used to pull files.<br />
<br />
ssh target_address dd if=remotefile | dd of=localfile<br />
<br />
Or, a specific example of getting a file from a computer called hamlet.<br />
<br />
$ ssh root@hamlet dd if=/home/cvs/test | dd of=/home/storage/test<br />
<br />
<br />
GOING BACKWARD AND FORWARD ON TAPE:<br />
<br />
Go to end of data<br />
$ mt -f /dev/nst0 eod<br />
<br />
Previous record<br />
$ mt -f /dev/nst0 bsfm 1<br />
<br />
Forward record<br />
$ mt -f /dev/nst0 fsf 1<br />
<br />
Rewind<br />
$ mt -f /dev/nst0 rewind<br />
<br />
Tell<br />
$ mt -f /dev/nst0 tell<br />
<br />
(Reference TIP 151 - for how to get around firewalls)<br />
<br />
Below is a script that I use to backup computers via ssh. The<br />
tape drive is on "nis" and the extra space is on "hamlet".<br />
<br />
#!/bin/bash<br />
# Program to backup server remotely<br />
# Assume remote server is nis, you are on squeezel<br />
#<br />
# Recover from tape<br />
#<br />
# dd if=/dev/nst0 of=test.tar.gz bs=64k<br />
#<br />
filename="support1.$(date "+%m%d%y%H%M").tar.gz"<br />
DIRTOBACKUP=/var/www<br />
#tar cvzf - $DIRTOBACKUP | ssh root@nis '(mt -f /dev/nst0 rewind; dd of=/dev/nst0 bs=64k )'<br />
tar cvzf - $DIRTOBACKUP | ssh support1@hamlet "dd of=/home/support1/backups/${filename} "<br />
<br />
Another example program, below, pushes the last ".tar.gz" file to tape:<br />
<br />
#!/bin/bash<br />
# Program to push files to tape<br />
#<br />
#<br />
# Notes on recovering from tape<br />
#<br />
# dd if=/dev/nst0 of=test.tar.gz ibs=64k<br />
# or<br />
# $ ssh root@tapeserver "mt -f /dev/nst0 rewind"<br />
# $ ssh root@tapeserver "dd if=/dev/nst0 ibs=64k"|dd of=cvs1.tar.gz<br />
#<br />
#<br />
#<br />
# First rewind tape<br />
ssh root@tapeserver 'mt -f /dev/nst0 rewind'<br />
#<br />
# Grab only the last file<br />
file=$(find /home/cvs -iname 'cvs*.tar.gz'|sort|tail -n 1)<br />
dd if=${file}|ssh root@tapeserver 'dd of=/dev/nst0 bs=64k'<br />
<br />
<br />
<br />
TIP 137:<br />
<br />
Apache - redirecting pages. All changes are in httpd.conf<br />
<br />
RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg<br />
<br />
Redirect /service http://foo2.bar.com/service<br />
<br />
<br />
<br />
TIP 138:<br />
<br />
samba mounts via ssh - mounting a samba share through an ssh tunnel, going<br />
through an intermediate computer, that accepts ssh. We'll call this<br />
intermediate computer middle [65.219.4.23], and we want to get to<br />
destination [192.168.0.81]. The user will be mchirico.<br />
<br />
STEP 1:<br />
<br />
$ mkdir -p /samba/share<br />
<br />
STEP 2:<br />
<br />
This has to be done as root, since we are using a lower port.<br />
<br />
$ ssh -N -L 139:192.168.0.81:139 mchirico@65.219.4.23<br />
<br />
STEP 3:<br />
<br />
umount /samba/sales<br />
/bin/mount -t smbfs -o username=donkey,workgroup=donkeydomain,<br />
password=passw0rk1,port=139,dmask=770,fmask=660,<br />
netbiosname=homecpu //localhost/share /samba/share<br />
<br />
<br />
<br />
<br />
TIP 139:<br />
<br />
Music on Fedora Core -- How to play music on http://magnatune.com with "xmms".<br />
<br />
The following command will show the sound driver:<br />
<br />
$ lspci|grep -i audio<br />
<br />
<br />
STEP 1:<br />
<br />
Unmute amixer with the following command:<br />
<br />
$ amixer set Master 100% unmute<br />
$ amixer set PCM 100% unmute<br />
<br />
Note you can also get a graphical interface with "alsamixer"<br />
<br />
$ alsamixer<br />
<br />
h,F1 -- for help<br />
Esc -- exit<br />
Tab -- move to selections<br />
<br />
<br />
STEP 2:<br />
<br />
Test a sound file "*.au" with aplay. To quickly find files on your system use<br />
the "locate *.au" command.<br />
<br />
$ aplay /usr/lib/python2.3/test/audiotest.au<br />
<br />
STEP 3:<br />
<br />
Install "xmms-mp3-1.2.10-9.2.1.fc3.rf.i386.rpm" which does not come with Fedora because<br />
of GPL license restrictions. The latest version of this package can be found<br />
at the following url:<br />
<br />
http://rpmseek.com/rpm-pl/xmms-mp3.html<br />
<br />
<br />
$ rpm -ivh xmms-mp3-1.2.10-9.2.1.fc3.rf.i386.rpm<br />
<br />
STEP 4:<br />
<br />
Go to magnatun "http://magnatune.com/", select genre and make sure xmms<br />
is the default player.<br />
<br />
<br />
<br />
TIP 140:<br />
<br />
Routing -- getting access to a network 1 hop away. You are currently on the 192 network<br />
and you want access to the 172.21.0.0 network that has a computer straddling<br />
the two, with /proc/sys/net/ipv4/ip_forward set to 1.<br />
<br />
<br />
$ route add -net 172.21.0.0 netmask 255.255.255.0 gw 192.168.0.204<br />
<br />
To undo:<br />
<br />
$ route del -net 172.21.0.0 netmask 255.255.255.0 gw 192.168.0.204<br />
<br />
Now you can ping 172.21.0.21.<br />
<br />
Does not work?<br />
<br />
Go on to 192.168.0.204 and execute the following commands:<br />
<br />
$ echo 1 > /proc/sys/net/ipv4/ip_forward<br />
$ cat /proc/sys/net/ipv4/ip_forward<br />
1<br />
<br />
To Look at the the gateway, execute the following command.<br />
<br />
$ netstat -r<br />
<br />
References: <br />
<br />
http://lartc.org/lartc.html<br />
<br />
<br />
<br />
TIP 141:<br />
<br />
RAM disk -- creating a filesystem in RAM.<br />
<br />
$ mkfs -t ext3 -q /dev/ram1 4096<br />
$ mkdir -p /fsram<br />
$ mount /dev/ram1 /fsram -o defaults,rw<br />
<br />
<br />
<br />
TIP 142:<br />
<br />
Create a Live Linux CDROM using BusyBox and OpenSSH.<br />
<br />
These steps are rather long. A complete tutorial is given at<br />
the following link:<br />
http://prdownloads.sourceforge.net/souptonuts/instructions_boot_system.txt<br />
<br />
<br />
<br />
TIP 143:<br />
<br />
SystemImager (http://www.systemimager.org/) SystemImager is software that automates Linux installs,<br />
software distribution, and production deployment.<br />
<br />
<br />
<br />
<br />
TIP 144:<br />
<br />
Mounted a filesystem in rescue mode, yet, you cannot read and write? Remount.<br />
<br />
$ mount -o remount /<br />
<br />
<br />
<br />
TIP 145:<br />
<br />
Nmap commands to check for Microsoft VPN connection.<br />
<br />
$ nmap -sO -p 47 vpn1.someserver.com<br />
$ nmap -sS -p T:1723 vpn1.someserver.com<br />
<br />
By the way, with nmap you can specify multiple ports. Below<br />
is an example of multiple ports; but, use the commands above<br />
for Microsoft VPN services.<br />
<br />
$ nmap -sS -p T:1723-3000<br />
<br />
<br />
<br />
TIP 146:<br />
<br />
Perl and ssh - monitoring systems. The output from ssh can be parsed. Below is<br />
a simple procedure to just to read the ssh ouput into perl.<br />
<br />
#!/usr/bin/perl<br />
#<br />
$pid = open $readme, "ssh root\@hamlet df -lh|" or die "Could not ssh\n";<br />
while(<$readme>) {<br />
print $_<br />
}<br />
close $readme<br />
<br />
But note, you probably want to do something more complex. Below is a more robust<br />
example that bypassed all the fortune, heading junk that you may encounter when<br />
logging in.<br />
<br />
#!/usr/bin/perl<br />
#<br />
$pid = open $readme, "ssh root\@hamlet df -lh 2>/dev/null|" or die "Could not ssh\n";<br />
while(<$readme>) {<br />
print $_<br />
}<br />
close $readme<br />
<br />
NO! you CANNOT do bidirectional communication with the open statement. Note the "|" before<br />
and after below, which cannot be done.<br />
<br />
# Cannot do this!<br />
$pid = open $readme, "|ssh root\@hamlet df -lh 2>/dev/null|" or die "Could not ssh\n";<br />
<br />
Below is a simple Perl example working with arrays:<br />
<br />
#!/usr/bin/perl<br />
@ArrayOfArray = (<br />
[ "ant", "bee" ],<br />
[ "mouse", "mole", "rat" ],<br />
[ "duck", "goose", "flamingo" ],<br />
[ "rose","carnation","sunflower"],<br />
);<br />
<br />
for $i ( 0 .. $#ArrayOfArray ) {<br />
for $j ( 0 .. $#{$ArrayOfArray[$i]} ) {<br />
print "Element $i $j is $ArrayOfArray[$i][$j]\n";<br />
}<br />
}<br />
<br />
# Or this is another way to list elements<br />
foreach( @ArrayOfArray ) {<br />
foreach $i (0..$#$_) {<br />
print "$_->[$i] "<br />
}<br />
print "\n";<br />
}<br />
<br />
<br />
Below is an example of working with Hash of Arrays:<br />
<br />
#!/usr/bin/perl<br />
# ./program < /etc/passwd<br />
while(<>){<br />
next unless s/^(.*?):\s*//;<br />
$HoA{$1} = [ split(/:/) ];<br />
}<br />
for $i (keys %HoA ) {<br />
print "$i: @{ $HoA{$i} } \n";<br />
}<br />
<br />
Example of regular expression. This is my most used regular expression - I like<br />
this sample. See the "www.unix.org.ua" link at the end of this tip.<br />
<br />
"hot cross buns" =~ /cross/;<br />
print "Matched: <$`> $& <$'>\n"; # Matched: <hot > cross < buns><br />
print "Left: <$`>\n"; # Left: <hot ><br />
print "Match: <$&>\n"; # Match: <cross><br />
print "Right: <$'>\n"; # Right: < buns><br />
<br />
<br />
If you're looking for Perl information, type "man perl", which will show you how<br />
to get even more information. Or better yet, take a look at the following<br />
link:<br />
<br />
http://www.unix.org.ua/orelly/perl/prog3/ch09_01.htm<br />
also<br />
http://www.stonehenge.com/merlyn/UnixReview/<br />
<br />
For a quick example on using Perl with SQLite, see the following links:<br />
<br />
http://prdownloads.sourceforge.net/souptonuts/README_sqlite_tutorial.html?download<br />
or<br />
http://freshmeat.net/articles/view/1428/<br />
or<br />
http://www.perl.com/pub/a/1999/09/refererents.html<br />
<br />
Standard input for files. This example will read from stdin, or open a file if given as<br />
an argument, and convert all "<" to "&lt;" and ">" to "&gt;", which can be handy when<br />
converting text files to html files. Note the "while(<>)" will take multiple file names<br />
on the command line.<br />
<br />
#!/usr/bin/perl<br />
while(<>) {<br />
s/&amp;/&amp;amp;/g;<br />
s/&lt;/&amp;lt;/g;<br />
s/&gt;/&amp;gt;/g;<br />
s/</&lt;/g;<br />
s/>/&gt;/g;<br />
print;<br />
}<br />
<br />
Perl Debugger is very useful for testing commands and works like an interpreter, just<br />
like python. So to get into the Perl Debugger execute the command below, "q" to quit.<br />
<br />
$ perl -de 0<br />
<br />
Reference TIP 170<br />
<br />
<br />
<br />
TIP 147:<br />
<br />
Shutdown<br />
<br />
# shutdown 8:00 -- Shutdown at 8:00<br />
<br />
# shutdown +13 -- Shutdown after 13min<br />
<br />
# shutdown -r now -- Shutdown now and restart<br />
<br />
# shutdown -k +2 -- "The system is going DOWN to maintenance mode in 2 minutes!"<br />
The above is only a warning.<br />
<br />
# shutdown -h now -- Shutdown now and halt<br />
<br />
# shutdown -c -- Cancel shutdown<br />
<br />
<br />
<br />
TIP 148:<br />
<br />
ac - print statistics about users connect time<br />
<br />
$ ac -p -- print hour usage by user (individual)<br />
$ ac -dy -- print daily usage<br />
<br />
Options can also be combined<br />
<br />
$ ac -dyp<br />
<br />
<br />
<br />
TIP 149:<br />
<br />
Smart Monitoring Tools:<br />
Disk failing? Or want to know the temperature of your hard-drive?<br />
<br />
http://smartmontools.sourceforge.net/<br />
<br />
For a good, quick tutorial, see the Linux Journal article<br />
http://www.linuxjournal.com/article/6983<br />
<br />
Below are some common commands:<br />
<br />
$ smartctl -i /dev/hda<br />
<br />
$ smartctl -Hc /dev/hda<br />
<br />
$ smartctl -A /dev/hda<br />
<br />
<br />
<br />
TIP 150:<br />
<br />
Monitor dhcp trafic - dhcpdump and tcpdump.<br />
<br />
Download dhcpdump<br />
<br />
$ wget http://voxel.dl.sourceforge.net/sourceforge/mavetju/dhcpdump-1.5.tar.gz<br />
$ ./configure<br />
$ make && make install<br />
<br />
Once it's installed, you can monitor all dhcp traffic as follows, if done with root.<br />
<br />
$ tcpdump -lenx -i eth0 -s 1500 port bootps or port bootpc| dhcpdump<br />
<br />
The above assumes you are using eth0 (ethernet port 0).<br />
<br />
<br />
<br />
TIP 151:<br />
<br />
Breaking Firewalls with ssh<br />
<br />
<br />
A sample .ssh/config file (note this must have chmod 600 rights)<br />
<br />
## Server1 ##<br />
Host 130.21.19.227<br />
LocalForward 20000 192.168.0.66:80<br />
LocalForward 22000 192.168.0.66:22<br />
<br />
With the above "~/.ssh/config" file, after sshing into 130.21.19.227 it<br />
is then possible to ssh into nearby computers directly.<br />
<br />
$ ssh -l mchirico 130.21.19.227<br />
$ scp -P 22000 authorized_keys* mchirico@localhost:.<br />
$ ssh -l mchirico localhost -p 22000<br />
<br />
For the complete article reference the following link:<br />
http://souptonuts.sourceforge.net/sshtips.htm<br />
<br />
<br />
<br />
TIP 152:<br />
<br />
Renaming files - suppose you want to rename all the ".htm" files to ".html"<br />
<br />
$ rename .htm .html *.htm<br />
<br />
Or, suppose you files file1, file2, file3 ...<br />
<br />
$ touch file1 file2 file3 file4 file5 file6<br />
$ rename file file. file*<br />
<br />
The above command will give you "file.1", "file.2" ... "file.6"<br />
<br />
<br />
<br />
TIP 153:<br />
<br />
Renaming files with Perl - this is taken from "Programming Perl 3rd Edition"<br />
<br />
#!/usr/bin/perl<br />
# rename - change filenames<br />
$op = shift;<br />
for (@ARGV) {<br />
$was = $_;<br />
eval $op;<br />
die if $@;<br />
# next line calls built-in function, not the script<br />
rename($was,$_) unless $was eq $_;<br />
}<br />
<br />
The above Perl program can be used as follows:<br />
<br />
$ rename 's/\.orig$//' *.orig<br />
$ rename 'y/A-Z/a-z/ unless /^Make/' *<br />
<br />
Also reference:<br />
http://www.unix.org.ua/orelly/perl/prog3/<br />
<br />
<br />
<br />
TIP 154:<br />
<br />
R project (http://www.r-project.org)<br />
<br />
To start R, just type "R" at the command prompt and "q()" to quit. Below<br />
2 is raised to powers 0 through 6 and thrown into an array.<br />
<br />
$ R<br />
> N <- 2^(0:6)<br />
> N<br />
[1] 1 2 4 8 16 32 64<br />
><br />
<br />
There is a summary summary() command.<br />
<br />
> summary(N)<br />
Min. 1st Qu. Median Mean 3rd Qu. Max.<br />
1.00 3.00 8.00 18.14 24.00 64.00<br />
<br />
Note that the array begins as 1 and not 0<br />
<br />
> N[1:3]<br />
[1] 1 2 4<br />
<br />
<br />
<br />
TIP 155:<br />
<br />
ls - listing files by size, with the biggest file listed last<br />
<br />
<br />
$ ls --sort=size -lhr<br />
<br />
The above command sorts files by size, listing the contents in<br />
"h" human readable format in reverse order.<br />
<br />
Note the options: --sort={none,time,size,extension}<br />
<br />
<br />
<br />
TIP 156:<br />
<br />
Perl - program to clean up old versions of files<br />
<br />
#!/usr/bin/perl<br />
# Copyright (c) GPL 2005 Mike Chirico<br />
# This program deletes old files from several directories<br />
# and within each directory there must be x number of copies<br />
# each y number of bytes<br />
#<br />
<br />
sub delete_old_ones {<br />
$directory_and_file=$_[0];<br />
$save_count=$_[1];<br />
$bytes_in_file=$_[2];<br />
# Don't change setting here of '-lt'<br />
$pid = open $readme, "ls -lt $directory_and_file|" or die "Could not execute\n";<br />
while(<$readme>) {<br />
my @fields = split;<br />
# Make sure we have $save_count good ones with data<br />
if ($fields[4] > $bytes_in_file && $save_count > 0) {<br />
$save_count--;<br />
print "Kept files: $fields[4] $fields[8]\n";<br />
}<br />
# delete the old ones<br />
if ($save_count <= 0 )<br />
{<br />
print "Deleted files: $fields[4] $fields[8]\n";<br />
unlink $fields[8];<br />
}<br />
}<br />
close $readme;<br />
}<br />
<br />
<br />
@AofA = (<br />
[ "/home/cvs/backups/*.gz", "6",196621 ],<br />
[ "/home/mail/backups/*.gz","5",34 ],<br />
[ "/home/snort/backups/*.gz","2",34 ],<br />
[ "/home/server1/backups/*.gz","2",34 ],<br />
[ "/home/actserver/backups/*.gz","2",34 ],<br />
[ "/home/server2/backups/*.gz","2",34 ],<br />
);<br />
<br />
<br />
foreach( @AofA ) {<br />
&delete_old_ones($_->[0],$_->[1],$_->[2]);<br />
}<br />
<br />
Reference TIP 170 and the following link:<br />
http://www.unix.org.ua/orelly/perl/prog3/<br />
<br />
<br />
<br />
TIP 157:<br />
<br />
Graphics and Visualization Software that runs on Linux<br />
http://www.tldp.org/HOWTO/Scientific-Computing-with-GNU-Linux/graphvis.html<br />
<br />
<br />
<br />
TIP 158:<br />
<br />
Keeping files in sync going both ways. Unlike rsync, this is not a one way mirror<br />
option.<br />
<br />
You will need ocaml installed first.<br />
<br />
$ wget http://caml.inria.fr/pub/distrib/ocaml-3.08/ocaml-3.08.3.tar.gz<br />
$ tar -xzf ocaml-3.08.3.tar.gz<br />
$ cd ocaml-3.08.3<br />
<br />
$ ./configure<br />
$ make world<br />
$ make opt<br />
$ make install<br />
<br />
Next, get unison and put it in a different directory.<br />
[http://www.cis.upenn.edu/~bcpierce/unison/]<br />
<br />
$ wget http://www.cis.upenn.edu/~bcpierce/unison/download/stable/latest/unison-2.10.2.tar.gz<br />
$ tar -xzf unison-2.10.2.tar.gz<br />
$ cd unison-2.10.2<br />
$ make UISTYLE=text<br />
$ su<br />
# cp unison /usr/local/bin/.<br />
<br />
Note, you have to copy the file manually.<br />
<br />
See the following article [http://www.linuxjournal.com/article/7712]<br />
<br />
<br />
<br />
TIP 159:<br />
<br />
Dump ext2/ext3 filesystem information with "dumpe2fs". Perform the mount command<br />
and query away.<br />
<br />
$ dumpe2fs /dev/sda1<br />
<br />
<br />
<br />
TIP 160:<br />
<br />
sysreport - a script that generates an HTML report on the system configuration. It<br />
gathers information about the hardware and is somewhat redhat specific. The utility<br />
should be run as root.<br />
<br />
$ /usr/sbin/sysreport<br />
<br />
<br />
<br />
TIP 161:<br />
<br />
Key Bindings Using bind. You can bind, say, ctl-t to a command.<br />
<br />
Add the following to you "~/.inputrc" file, just as it is typed below with quotes.<br />
<br />
"\C-t": ls -l<br />
<br />
Next, run the command<br />
<br />
$ bind -f .inputrc<br />
<br />
Or, you can do everything on the command line; however, it won't be there the next time<br />
you log in. Below is the way to do everything on the command line.<br />
<br />
$ bind -x '"\C-t":ls -l'<br />
<br />
To unbind use the "-r" option. Single quotes are not needed.<br />
<br />
$ bind -r "\C-t"<br />
<br />
Getting a list of all bindings can be done as follows, and not this can be redirected<br />
to the ".inputrc" file for further editing.<br />
<br />
$ bind -p > .inputrc<br />
<br />
<br />
<br />
TIP 162:<br />
<br />
awk - common awk commands.<br />
<br />
Find device names "sd" or with major number 4 and device name "tty". Print the<br />
record number NR, plus the major number and minor number.<br />
<br />
$ awk '$2 == "sd"||$1 == 4 && $2 == "tty" { print NR,$1,$2}' /proc/devices<br />
<br />
Find device name equal to "sound".<br />
<br />
$ awk '/sound/{print NR,$1,$2}' /proc/devices<br />
<br />
Print the 5th record, first field, in file test<br />
<br />
$ awk 'NR==5{print $1}' test<br />
<br />
Print a record, skip 4 records, print a record etc from file1<br />
<br />
$ awk '(NR-1) % 4 == 0 {print $1}' file1<br />
<br />
Print all records except the last one from file1<br />
<br />
$ tac file1|awk 'NR > 1 {print $0}'|tac<br />
<br />
Print A,B,C ..Z on each line, cycling back to A if greater than 26 lines<br />
<br />
$ awk '{ print substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",(NR-1)%26+1,1),$0}' file1<br />
<br />
Number of bytes in a directory.<br />
<br />
$ ls -l|awk 'BEGIN{ c=0}{ c+=$5} END{ print c}'<br />
<br />
<br />
<br />
TIP 163:<br />
<br />
Configuring Remote Logging. If you have several servers on 192.168.1.0, you can setup remote logging<br />
as follows.<br />
<br />
MAIN LOG SERVER (192.168.1.81):<br />
<br />
Firewall - allow UDP port 514 on the main server that will receive the logs.<br />
<br />
$ iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 514 -j ACCEPT<br />
<br />
Edit "/etc/sysconfig/syslog" and add the "-r" option to SYSLOGD_OPTIONS as shown below.<br />
<br />
SYSLOGD_OPTIONS="-r -m -0"<br />
<br />
Note, the "-r" is to allow remote logging and "-m 0" specifies that that the syslog process should<br />
not write regular timestamps. I prefer to only write timestamps for the clients.<br />
<br />
Next, restart the logging process<br />
<br />
$ service syslog restart<br />
<br />
CLIENT LOG SERVER:<br />
<br />
Edit "/etc/syslog.conf" and add the ip address of the log server, or put in the hostname.<br />
<br />
*.* @192.168.1.81<br />
<br />
Next, restart the logging process<br />
<br />
$ service syslog restart<br />
<br />
<br />
<br />
TIP 164:<br />
<br />
kudzu - hardware on your system. To probe the hardware on your system without doing<br />
anything, issue the following command.<br />
<br />
$ kudzu -p<br />
<br />
But wait, a lot of this information is already recorded in the following file<br />
<br />
/etc/sysconfig/hwconf<br />
<br />
You can also use lspci to list all PCI devices.<br />
<br />
$ lspci<br />
<br />
Also, take a look at the script /etc/sbin/sysreport, since this script has a lot of<br />
info gathering commands. You can pick and choose what you want, or run the complete<br />
report.<br />
<br />
If you just want information on the NIC<br />
<br />
$ ip link show eth0<br />
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000<br />
link/ether 00:11:11:8a:be:3f brd ff:ff:ff:ff:ff:ff<br />
<br />
<br />
<br />
<br />
<br />
TIP 165:<br />
<br />
cfengine - a very power agent for monitoring and administrating both a single computer<br />
and or multiple computers. [ http://www.cfengine.org/ ]<br />
<br />
The following is a quick example on downloading and installing cfengine.<br />
<br />
$ ncftpget ftp://ftp.iu.hio.no/pub/cfengine/cfengine-2.1.15.tar.gz<br />
$ md5sum cfengine-2.1.15.tar.gz<br />
f03de82709f84c3d6d916b6e557321f9 cfengine-2.1.15.tar.gz<br />
<br />
$ tar -xzf cfengine-2.1.15.tar.gz<br />
<br />
<br />
You need to have a current version of BerkeleyDB (http://downloads.sleepycat.com/db-4.3.28.tar.gz).<br />
Note that BerkeleyDB has a funny install. You cd to the "build_unix" directory, then,<br />
<br />
Installing BerkeleyDB if needed:<br />
$ wget http://downloads.sleepycat.com/db-4.3.28.tar.gz<br />
$ tar -xzf db-4.3.28.tar.gz<br />
$ cd db-4.3.28/build_unix/<br />
$ ../dist/configure<br />
make<br />
make install<br />
<br />
You also need a current version of OpenSSL. For instructions on how to install OpenSSL see<br />
(http://souptonuts.sourceforge.net/postfix_tutorial.html).<br />
<br />
See (TIP 49) on putting "/usr/local/BerkeleyDB.4.3/lib" in the "/etc/ld.so.conf" file. Or<br />
once BerkeleyDB is installed, you can put the location on the command line as follows:<br />
<br />
Configuring cfengine with direct reference to BerkeleyDB.4.3. First cd to the cfengine source.<br />
<br />
$ ./configure --with-berkeleydb=/usr/local/BerkeleyDB.4.3/lib<br />
$ make<br />
$ make install<br />
<br />
Next create the following directories:<br />
<br />
$ mkdir -p /var/cfengine/bin<br />
$ mkdir -p /var/cfengine/inputs<br />
<br />
Copy needed files (cfagent, cfdoc, cfenvd, cfenvgraph, cfexecd, cfkey, cfrun, cfservd, cfshow):<br />
<br />
$ cp /usr/local/sbin/cf* /var/cfengine/bin<br />
<br />
<br />
You'll also need to generate keys. As root, execute the following:<br />
<br />
$ cfkey<br />
<br />
The command above will write the public and private keys in<br />
"/var/cfengine/ppkeys".<br />
<br />
<br />
You probably want (cfexecd, cfservd, and cfenvd) running on all servers. If you<br />
add the following to "/etc/rc.local" these daemons will start on reboot.<br />
<br />
# Lines in /etc/rc.local<br />
/usr/local/sbin/cfexecd<br />
/usr/local/sbin/cfservd<br />
/usr/local/sbin/cfenvd<br />
<br />
Also, make sure you run each command now as follows:<br />
<br />
$ /usr/local/sbin/cfexecd<br />
$ /usr/local/sbin/cfservd<br />
$ /usr/local/sbin/cfenvd<br />
<br />
Firewall settings must be adjusted to allows 5308 for tcp/udp. My local network<br />
is 192.168.1.0, so I'm opening it up for all my computers.<br />
<br />
$ iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 5308 -j ACCEPT<br />
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5308 -j ACCEPT<br />
<br />
A set of keys needs to be on the server and hosts. For example, my key on "tape.squeezel.com"<br />
should be copied over to the server "squeezel.squeezel.com" as follows:<br />
<br />
This is done from tape.squeezel.com<br />
<br />
$ scp /var/cfengine/ppkeys/localhost.pub root@squeezel.squeezel.com:/var/cfengine/ppkeys/root-tape.squeezel.com.pub<br />
$ scp root@squeezel.squeezel.com:/var/cfengine/ppkeys/localhost.pub /var/cfengine/ppkeys/root-squeezel.squeezel.com.pub<br />
<br />
Also, "/var/cfengine/inputs/cfrun.hosts" on the server "squeezel.squeezel.com" must contain<br />
all the computers that will get updated. This is "cfrun.hosts" on "squeezel.squeezel.com"<br />
<br />
closet.squeezel.com<br />
tape.squeezel.com<br />
<br />
Once I'm done, from "tape.squeezel.com" I can run the following test:<br />
<br />
$ cfrun squeezel.squeezel.com -v<br />
<br />
<br />
<br />
<br />
TIP 166:<br />
<br />
cfengine - a quick example. This example will be run as root. You create the file "cfagent.conf" in<br />
"/var/cfengine/inputs/". The example below will checksum all the files in /home/chirico/deleteme/tripwire,<br />
it will also comment out the line "finger" in any file located in /tmp/testdir/stuff, also appending<br />
the command in this file " Edit change with cfengine".<br />
<br />
# /var/cfengine/inputs/cfagent.conf<br />
#<br />
# You run this with the following:<br />
# cfagent -vK<br />
<br />
control:<br />
actionsequence = ( files tidy editfiles )<br />
ChecksumDatabase = ( /var/cfengine/cache.db )<br />
# Below, true to update md5<br />
ChecksumUpdates = ( true )<br />
<br />
<br />
files:<br />
/home/chirico/deleteme/tripwire checksum=md5 recurse=inf<br />
/home/chirico/deleteme/tripwire/moredata checksum=md5 recurse=inf<br />
#/home/chirico/deleteme/tripwire/compress recurse=inf include=*.txt acti on=compress<br />
# If the database isn't secure, nothing is secure...<br />
/var/cfengine/cache.db mode=600 owner=root action=fixall<br />
<br />
tidy:<br />
/home/chirico/deleteme/tripwire pattern=*~ recurse=inf age=0<br />
# You must put an age. 0 runs now.<br />
<br />
<br />
editfiles:<br />
<br />
{ /tmp/testdir/stuff<br />
<br />
HashCommentLinesContaining "finger"<br />
AppendIfNoSuchLine "# Edit Change with cfengine "<br />
}<br />
<br />
<br />
A few further notes on the above. The command "actionsequence = ( files tidy editfiles) tells the order<br />
of what to execute. The heading "tidy:" deletes files, and of course, "editfiles" does the editing of files.<br />
<br />
To run the example, execute the following command. The "-K" causes the lock file to be ignored.<br />
<br />
$ cfagent -vK<br />
<br />
<br />
<br />
<br />
TIP 167:<br />
<br />
Implementing Disk Quotas - a quick example that can easily be done on a live system for testing. There<br />
is no need to reboot, since you'll be creating a virtual filesystem.<br />
<br />
Do the following as root. First create a mount point.<br />
<br />
# mkdir -p /quota<br />
<br />
Next, create 20M file. Since I have many of these files, I created a special directory "/usr/disk-img"<br />
<br />
# mkdir -p /usr/disk-img<br />
# dd if=/dev/zero of=/usr/disk-img/disk-quota.ext3 count=40960<br />
<br />
The dd command above create a 20 MB file because, by default, dd uses a block size of 512 bytes. That makes<br />
the size: 40960*512=20971520.<br />
<br />
Next, format this as an ext3 filesystem<br />
<br />
# /sbin/mkfs -t ext3 -q /usr/disk-img/disk-quota.ext3 -F<br />
<br />
Add the following line to "/etc/fstab"<br />
<br />
/usr/disk-img/disk-quota.ext3 /quota ext3 rw,loop,usrquota,grpquota 0 0<br />
<br />
Now, mount this filesystem<br />
<br />
# mount /quota<br />
<br />
Take a look at it:<br />
<br />
# ls -l /quota<br />
lost+found<br />
<br />
Now, run "quotacheck"<br />
<br />
# quotacheck -vug /quota<br />
<br />
You'll get errors the first time this is run, because you have no quota files.<br />
But, run it a second time and you'll see something similiar to the following:<br />
<br />
# quotacheck -vug /quota<br />
quotacheck: Scanning /dev/loop2 [/quota] done<br />
quotacheck: Checked 3 directories and 4 files<br />
<br />
Now take a look at the files:<br />
<br />
# ls -l /quota<br />
total 26<br />
-rw------- 1 root root 6144 Jun 14 12:23 aquota.group<br />
-rw------- 1 root root 6144 Jun 14 12:23 aquota.user<br />
drwx------ 2 root root 12288 Jun 14 12:18 lost+found<br />
<br />
Next use "edquota" to grant the user "chirico" a certain quota<br />
<br />
# edquota -f /quota chirico<br />
<br />
This will bring up a menu, and here I have edited so that user "chirico"<br />
has a soft limit of 120*512=61K, and a soft limit of 2 inodes and a hard limit of 5.<br />
<br />
Disk quotas for user chirico (uid 500):<br />
Filesystem blocks soft hard inodes soft hard<br />
/dev/loop2 2 120 150 1 2 3<br />
<br />
Next, turn quotas on with the following command:<br />
<br />
$ quotaon /quota<br />
<br />
If you need to turn off quotas, the command is "quotaoff -a" for all filesystems. You'll run into<br />
errors if you try to run quotacheck, say "quotacheck -avug" because this tries to unmount and mount<br />
the filesystem. You need to turn off quotas first "quotaoff /quota". Note you only need to run<br />
quotacheck once, or when doing maintenance after a system crash.<br />
<br />
<br />
To get a report on the quote, runn "repquota" as follows:<br />
<br />
$ repquota /quota<br />
*** Report for user quotas on device /dev/loop0<br />
Block grace time: 7days; Inode grace time: 7days<br />
Block limits File limits<br />
User used soft hard grace used soft hard grace<br />
----------------------------------------------------------------------<br />
root -- 1189 0 0 2 0 0<br />
chirico -+ 93 0 0 4 2 5 6days<br />
<br />
<br />
Note above that user "chirico" has used 4 on the file limits. This user has a hard<br />
limit of 5. So when this user tries to create 2 more files (bring this over the limit of 5)<br />
then he will get the following error as demonstrated below.<br />
<br />
<br />
[chirico@squeezel chirico]$ touch one<br />
[chirico@squeezel chirico]$ touch two<br />
loop0: write failed, user file limit reached.<br />
touch: cannot touch `two': Disk quota exceeded<br />
<br />
<br />
Now, if repquota (run by root) is executed it shows the following:<br />
<br />
$ repquota /quota<br />
*** Report for user quotas on device /dev/loop0<br />
Block grace time: 7days; Inode grace time: 7days<br />
Block limits File limits<br />
User used soft hard grace used soft hard grace<br />
----------------------------------------------------------------------<br />
root -- 1189 0 0 2 0 0<br />
chirico -+ 94 0 0 5 2 5 6days<br />
<br />
<br />
Note the "+" sign above. User "chirico" is above the File soft limits, and in this case<br />
above the hard limits.<br />
<br />
To warn user by sending email to them, run "warnquota", but you need check that<br />
"/etc/warnquota.conf" is setup correctly. For the example above, this file should<br />
look as follows:<br />
<br />
$ cat /etc/quotatab<br />
#<br />
# This is sample quotatab (/etc/quotatab)<br />
# Here you can specify description of each device for user<br />
#<br />
# Comments begin with hash in the beginning of the line<br />
<br />
# Example of description<br />
/dev/loop0: This is loopback device<br />
<br />
Just run the following as root:<br />
<br />
$ warnquota<br />
<br />
By the way, if you want to change the grace period, it can only be done on a filesystem<br />
basis. Not per user.<br />
<br />
$ edquota -t<br />
<br />
Users can run "quota" to see their usage as follows:<br />
<br />
[chirico@squeezel ~]$ quota<br />
Disk quotas for user chirico (uid 500):<br />
Filesystem blocks quota limit grace files quota limit grace<br />
/dev/loop0 94 0 0 5 10 50<br />
<br />
As you can see from above, I changed my inode limit to 50.<br />
<br />
What about running this on the whole filesystem? Yes, below is an example where I'm running<br />
this on FC3, on the root of the filesystem "/". This assumes that you have installed the<br />
quota package. Try doing "rpm -q quota" to see if this package is installed.<br />
<br />
Step 1:<br />
<br />
Check to make sure the quota software is installed. You can either do a "whereis quota",<br />
or check for the rpm package.<br />
<br />
$ whereis quota<br />
whereis quota<br />
quota: /usr/bin/quota /usr/share/man/man1/quota.1.gz<br />
<br />
Checking for the rpm package.<br />
<br />
$ rpm -q quota<br />
quota-3.12-5<br />
<br />
Step 2:<br />
<br />
Edit /etc/fstab and add usrquota and grpquota options for "/dev/VolGroup00/LogVol00",<br />
which is shown on the first line below:<br />
<br />
/dev/VolGroup00/LogVol00 / ext3 defaults,usrquota,grpquota 1 1<br />
LABEL=/boot /boot ext3 defaults 1 2<br />
none /dev/pts devpts gid=5,mode=620 0 0<br />
none /dev/shm tmpfs defaults 0 0<br />
none /proc proc defaults 0 0<br />
none /sys sysfs defaults 0 0<br />
/dev/VolGroup00/LogVol01 swap swap defaults 0 0<br />
<br />
Step 3:<br />
<br />
Remount the filesystem as follows:<br />
<br />
$ mount -o remount /<br />
<br />
Step 4:<br />
<br />
Run quotacheck with the "-m" option. Like the above statement, this will have to be run with<br />
root priviliges. This creates the quota database files, and it can take a long time if it is<br />
a large full filesystem.<br />
<br />
<br />
$ quotacheck -cugm /<br />
<br />
Step 5:<br />
<br />
This step is optional, but it's good to know if you need to recalculate quotas because of a<br />
system crash. It's demonstrated here, because at this point quota's have not been turned on.<br />
Again, note the "m" option below.<br />
<br />
$ quotacheck -avumg<br />
<br />
Step 6:<br />
<br />
Set limits for specific users or groups using the "edquota" command. Shown below is the command<br />
to setup quotas for user "chirico". Shown below this user has used 161560 blocks, he has a soft<br />
limit of 1161560 and a hard limit of 900000. He has used 3085 inodes and has a soft limit of 10000<br />
and a hard limit of 12000.<br />
<br />
$ edquota -f / chirico<br />
<br />
Disk quotas for user chirico (uid 500):<br />
Filesystem blocks soft hard inodes soft hard<br />
/dev/mapper/VolGroup00-LogVol00 161560 1161560 900000 3085 10000 12000<br />
<br />
You can put quotas on groups as well. The following is done as root. See (TIP 186 and TIP 6) for creating<br />
groups and adding users to groups.<br />
<br />
$ edquota -g share<br />
<br />
If you create a sharable directory for anyone in the group "share" (TIP 6), quota restrictions against<br />
group "share" will only apply to files added in the "/home/share" directory. When user "chirico" creates<br />
files in "/home/share" they also go against this user quota as well. However, when files are created in<br />
his home directory they do not go against the "share" group.<br />
<br />
Note - if you get errors when trying to run "edquota -g share", turn quotas off "quotaoff /" and<br />
run "quotacheck -avugm". Then, turn the quotas back on "quotaon /".<br />
<br />
You can see the status of the group quota with the following command:<br />
<br />
$ quota -g share<br />
<br />
Step 7:<br />
<br />
Turn on quotas with the "qutoaon" command. This command needs to be done with root privileges.<br />
<br />
$ quotaon /<br />
<br />
Step 8:<br />
<br />
Check "/etc/quotatab" file for the correct entries. Note that when you do the "mount" command<br />
the filesystem returned needs to match what is in the "quotatab" file. I have noticed that this<br />
is not the case by default.<br />
<br />
$ mount<br />
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,usrquota,grpquota)<br />
<br />
So the "/etc/quotatab" must contain the following line.<br />
<br />
/dev/mapper/VolGroup00-LogVol00: This is the Volume group<br />
<br />
Step 9:<br />
<br />
Run "warnquota" as a check that the "/etc/quotatab" files is setup correctly.<br />
<br />
$ warnquota<br />
<br />
Step 10:<br />
<br />
Setup a daily cron job for running "warnquota". The following should be placed<br />
in "/etc/cron.daily"<br />
<br />
#!/bin/sh<br />
# Place this file in /etc/cron.daily<br />
# with rights 0755<br />
/usr/sbin/warnquota<br />
EXITVALUE=$?<br />
if [ $EXITVALUE != 0 ]; then<br />
/usr/bin/logger -t warnquota "ALERT exited abnormally with [$EXITVALUE]"<br />
fi<br />
exit 0<br />
<br />
References:<br />
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/sysadmin-guide/ch-disk-quotas.html<br />
(TIP 6, TIP 186, and TIP 205)<br />
<br />
<br />
<br />
TIP 168:<br />
<br />
rdist - remote file distribution client program. You can use this program in combination with<br />
ssh. This program does more than just copy files. Once a file has been copied, you can dictate<br />
other actions to be performed. Or you can hold off copying all together if the destination is<br />
running low on inodes, or disk space.<br />
<br />
For the purpose of this example, all commands will been run on "squeezel.squeezel.com", and the<br />
computers that will be updated are "tape.squeezel.com" and "closet.squeezel.com". Obviously, you<br />
would substitute your computer names.<br />
<br />
It helps to setup ssh keys on each computer first. Reference [http://souptonuts.sourceforge.net/sshtips.htm]<br />
and (TIP 12).<br />
<br />
Step 1: Create the Configuration file myDistfile<br />
<br />
Below is my sample "myDistfile". This file will access hosts "tape.squeezel.com" using username chirico<br />
and "closet.squeezel.com" with the username running this command, and copy the<br />
files "/home/chirico/file1" and "/home/chirico/file2" to the these two servers creating the<br />
directory ~/tmpdir if it doesn't exist. Once these files are updated, a mail check ("sendmail -bv")<br />
will be performed, and mail will be sent to "chirico@squeezel". This happens twice, once for each file.<br />
<br />
Note, the line "/home/chirico/file2 -> tape.squeezel.com" which moves the file "file2" to<br />
tape.squeezel.com renaming the file to "tapedest" in the directory "/home/chirico". Once this file<br />
is copied, the rights are modified to "chmod +r". Likewise, "/home/chirico/file2 -> closet.squeezel.com"<br />
copies the file file2, which is renamed as closetdest.<br />
<br />
# Contents of myDistfile<br />
HOSTS = ( chirico@tape.squeezel.com closet.squeezel.com )<br />
<br />
FILES = ( /home/chirico/file1 /home/chirico/file2 )<br />
<br />
${FILES} -> ${HOSTS}<br />
# Directory tmpdir will be created if it doesn't exist<br />
install tmpdir ;<br />
special /home/chirico/file1 "/usr/sbin/sendmail -bv mchirico@gmail.com";<br />
notify chirico@squeezel;<br />
<br />
/home/chirico/file2 -> tape.squeezel.com<br />
install /home/chirico/tapedest;<br />
special /home/chirico/tapedest "chmod +r /home/chirico/tapedest";<br />
<br />
/home/chirico/file2 -> closet.squeezel.com<br />
install /home/chirico/closetdest;<br />
<br />
<br />
Step 2: Command from squeezel.squeezel.com to run myDistfile above<br />
<br />
Below is the command that will execute the contents in "myDistfile". This command is run from the<br />
computer "squeezel.squeezel.com". All output will go in the file "cmd1rdist.log".<br />
<br />
$ rdist -P /usr/local/bin/ssh -f ./myDistfile -l file=./cmd1rdist.log=all<br />
<br />
Obviously you want a secure copy (using scp), so the -P option uses ssh as your secure<br />
transport mechanism.<br />
<br />
<br />
<br />
TIP 169:<br />
<br />
Restricting root logins (/etc/securetty). ctl-alt-F4 will give you a prompt for tty3. Note<br />
that it is one number less. Take a look at the contents of "/etc/securetty". To prevent<br />
root from logging in on this device, take out tty3 from this listing. Note, you can always<br />
login as another user, then, su to root. Below is an example of the default<br />
"/etc/securetty" that allows root to login to everything.<br />
<br />
[root@squeezel ~]# cat /etc/securetty<br />
console<br />
vc/1<br />
vc/2<br />
vc/3<br />
vc/4<br />
vc/5<br />
vc/6<br />
vc/7<br />
vc/8<br />
vc/9<br />
vc/10<br />
vc/11<br />
tty1<br />
tty2<br />
tty3<br />
tty4<br />
tty5<br />
tty6<br />
tty7<br />
tty8<br />
tty9<br />
tty10<br />
tty11<br />
<br />
<br />
<br />
TIP 170:<br />
<br />
Perl map function. Try the following to get a quick take on this function,<br />
which increments each value in the array a;<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map {$_++} @a;<br />
map { print "$_\n" } @a;<br />
<br />
or<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map { print "$_\n"} map {++$_} @a;<br />
<br />
And you can easily make modifications, like reversing the order<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map { print "$_\n"} reverse map {++$_} @a;<br />
<br />
Plus there is a grep() function that works on each element as well<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map { print "$_\n"} reverse grep{ $_ > 3} map {++$_} @a;<br />
<br />
To get only odd numbers in reverse order:<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map { print "$_\n"} reverse grep{ !($_ % 2)} map {++$_} @a;<br />
<br />
<br />
Reference: http://www-128.ibm.com/developerworks/linux/library/l-road4.html<br />
<br />
<br />
<br />
TIP 171:<br />
<br />
Perl - subroutine call and shifting through variables. A simple and useful<br />
technique.<br />
<br />
#!/usr/bin/perl<br />
sub test {<br />
local $mval;<br />
while( $mval = shift ) {<br />
print " $mval\n";<br />
}<br />
}<br />
<br />
test("one","two","three");<br />
<br />
<br />
<br />
TIP 172:<br />
<br />
Tcp wrappers - First "/etc/hosts.allow" is check, and if there is an entry in this file, no more<br />
checking it done. If are no matches in "/etc/hosts.allow", the "/etc/hosts.deny" file is checked<br />
and if a match is found, that service is blocked for that host.<br />
<br />
Example "/etc/hosts.deny" file:<br />
<br />
sshd: 192.168.1.171<br />
<br />
The above file blocks access to computer 192.168.1.171. It's also possible to run commands when<br />
someone from this computer tries to ssh in. This example sends mail.<br />
<br />
sshd: 192.168.1.171: spawn (echo -e "%d %h %H %u"| /bin/mail -s 'hosts.deny entry' root)<br />
<br />
Of course, you can also run commands in the "/etc/hosts.allow" if you wanted mail sent for a successful<br />
login.<br />
<br />
<br />
<br />
TIP 173:<br />
<br />
pgrep, pkill - look up or signal process based on name and other attributes.<br />
<br />
To quick find all instances of ssh running, for user root, execute the following<br />
command:<br />
<br />
$ pgrep -u root -l ssh<br />
<br />
To kill a process, or send a signal use the "pkill" option. For example, to<br />
make syslog reread its configuration file:<br />
<br />
$ pkill -HUP syslogd<br />
<br />
Another command command is "pidof" that can tell you how many processes are running.<br />
This can be useful for detecting DOS attacks.<br />
<br />
$ pidof sshd<br />
4783 4781 30008 30006 29888 29886 2246<br />
<br />
Above there are 7 sshd's running. Reference "Tcpdump, Raw Socket and Libpap Tutorial"<br />
at [http://souptonuts.sourceforge.net/tcpdump_tutorial.html].<br />
<br />
<br />
<br />
TIP 174:<br />
<br />
Password Cracking - tools to check your users passwords:<br />
<br />
John The Ripper<br />
http://www.openwall.com/john/<br />
<br />
Crack<br />
http://www.crypticide.com/users/alecm/<br />
<br />
Slurpie<br />
http://www.ussrback.com/distributed.htm<br />
<br />
<br />
<br />
TIP 175:<br />
<br />
Password Aging - setting the number of days a password is valid.<br />
<br />
$ chage -M 90 <username><br />
<br />
<br />
<br />
TIP 176:<br />
<br />
Kernel Performance Tuning - /Documentation/sysctl/vm.txt documents kernel settings to<br />
improve performance. Below are some examples.<br />
<br />
overcommit_memory: 0 -- default estimates the amount of memory for malloc<br />
1 -- kernel pretends there is always enough memory until it runs out<br />
3 -- never overcommit<br />
<br />
$ cat /proc/sys/vm/overcommit_memory<br />
0<br />
<br />
page-cluster:<br />
The Linux VM subsystem avoids excessive disk seeks by reading<br />
multiple pages on a page fault. The number of pages it reads<br />
is dependent on the amount of memory in your machine.<br />
<br />
The number of pages the kernel reads in at once is equal to<br />
2 ^ page-cluster. Values above 2 ^ 5 don't make much sense<br />
for swap because we only cluster swap data in 32-page groups.<br />
<br />
$ cat /proc/sys/vm/page-cluster<br />
3<br />
<br />
min_free_kbytes:<br />
This is used to force the Linux VM to keep a minimum number<br />
of kilobytes free. The VM uses this number to compute a pages_min<br />
value for each lowmem zone in the system. Each lowmem zone gets<br />
a number of reserved free pages based proportionally on its size.<br />
<br />
$ cat /proc/sys/vm/min_free_kbytes<br />
3831<br />
<br />
max_map_count:<br />
This file contains the maximum number of memory map areas a process<br />
may have. Memory map areas are used as a side-effect of calling<br />
malloc, directly by mmap and mprotect, and also when loading shared<br />
libraries.<br />
<br />
While most applications need less than a thousand maps, certain<br />
programs, particularly malloc debuggers, may consume lots of them,<br />
e.g., up to one or two maps per allocation.<br />
<br />
The default value is 65536.<br />
<br />
$ cat /proc/sys/vm/max_map_count<br />
65536<br />
<br />
Also see http://people.redhat.com/alikins/system_tuning.html<br />
<br />
<br />
<br />
TIP 177:<br />
<br />
IO Scheduler - /Documentation/block/as-iosched.txt documents kernel settings for disk<br />
performance.<br />
<br />
If you're not sure what partitions you have "$ cat /proc/partitions". This example<br />
assumes hda, and you can see some of the kernel settings:<br />
<br />
$ ls /sys/block/hda/queue/iosched<br />
back_seek_max back_seek_penalty clear_elapsed fifo_batch_expire fifo_expire_async<br />
fifo_expire_sync find_best_crq key_type quantum queued<br />
<br />
References: http://lwn.net/Articles/102505/<br />
http://bhhdoa.org.au/pipermail/ck/2004-September/000961.html<br />
<br />
<br />
<br />
TIP 178:<br />
<br />
iozone -- getting data on disk performance (http://www.iozone.org/). This is a very<br />
comprehensive package.<br />
<br />
$ wget http://www.iozone.org/src/current/iozone3_242.tar<br />
$ tar -xf iozone3_242.tar<br />
$ cd iozone3_242/src/current<br />
$ make linux<br />
<br />
At this point you should read the documentation. There is no "make install". You<br />
copy it to each filesystem you want to run this program on. Below are some quick<br />
start commands.<br />
<br />
Good comprehensive test.<br />
<br />
$ iozone -a<br />
<br />
I prefer this for small filesystems. It limits the record size to 10000 and does<br />
the output in operations per second (higher numbers mean faster drive).<br />
<br />
$ ./iozone -a -s 10000 -O<br />
<br />
<br />
<br />
TIP 179:<br />
<br />
history - bash command to get a history of all commands typed. But, here is a way<br />
that you can get date and time listed as well.<br />
<br />
$ HISTTIMEFORMAT="%y/%m/%d %T "<br />
<br />
Defining the environment variable above give you the date/time info when you<br />
execute history:<br />
<br />
$ history<br />
...<br />
175 05/06/30 12:51:46 grep '141.162.' mout > mout2<br />
176 05/06/30 12:51:48 e mout2<br />
177 05/06/30 12:56:59 ls<br />
178 05/06/30 12:57:02 ls<br />
179 05/06/30 12:57:39 ls<br />
180 05/06/30 12:57:49 ls -l<br />
181 05/06/30 13:01:10 history<br />
182 05/06/30 13:01:20 HISTTIMEFORMAT="%y/%m/%d %T "<br />
183 05/06/30 13:01:23 history<br />
...<br />
<br />
<br />
<br />
TIP 180:<br />
<br />
.config - Fedora Core getting the .config to rebuild the kernel. You can find<br />
this file, the ".config" file at the following location:<br />
<br />
$ ls "/lib/modules/$(uname -r)/build/.config"<br />
<br />
Or, to see the contents<br />
<br />
$ cat "/lib/modules/$(uname -r)/build/.config"<br />
<br />
This can be important, if you're planning to build your own kernel.<br />
<br />
<br />
<br />
TIP 181:<br />
<br />
Listing control key settings.<br />
<br />
$ stty -a<br />
speed 38400 baud; rows 0; columns 0; line = 0;<br />
intr = ^C; quit = ^\; erase = <undef>; kill = <undef>; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q;<br />
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;<br />
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts<br />
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel<br />
opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0<br />
isig icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke<br />
<br />
<br />
<br />
TIP 182:<br />
<br />
iptables DNAT and SNAT. You have a webserver on 192.168.1.71. When people query this webserver, you want them<br />
to goto 192.168.1.81, with no indication that they are going to another web server. In fact, they always make<br />
their web hits to 192.168.1.71.<br />
<br />
The following is the iptables commands:<br />
<br />
$ echo 1 > /proc/sys/net/ipv4/ip_forward<br />
$ iptables -t nat -A PREROUTING -d 192.168.1.71 -p tcp --dport 80 -j DNAT --to 192.168.1.81<br />
$ iptables -t nat -A POSTROUTING -d 192.168.1.81 -s 192.168.1.0/24 -p tcp --dport 80 -j SNAT --to 192.168.1.71<br />
<br />
Change 192.168.1.0/24 to whatever source you expect the web browser to come in on. Below is the tcpdump showing<br />
all traffic is relayed via 192.168.1.71<br />
<br />
[root@closet iptables]# tcpdump -nN port 80<br />
<br />
17:34:58.790398 IP 192.168.1.102.1158 > 192.168.1.71.80: S 3620106373:3620106373(0) win 16384 <mss 1460,nop,nop,sackOK><br />
17:34:58.790465 IP 192.168.1.71.1158 > 192.168.1.81.80: S 3620106373:3620106373(0) win 16384 <mss 1460,nop,nop,sackOK><br />
17:34:58.790703 IP 192.168.1.81.80 > 192.168.1.71.1158: S 1973665156:1973665156(0) ack 3620106374 win 5840 <mss 1460,nop,nop,sackOK><br />
17:34:58.790720 IP 192.168.1.71.80 > 192.168.1.102.1158: S 1973665156:1973665156(0) ack 3620106374 win 5840 <mss 1460,nop,nop,sackOK><br />
17:34:58.790951 IP 192.168.1.102.1158 > 192.168.1.71.80: . ack 1 win 17520<br />
17:34:58.790965 IP 192.168.1.71.1158 > 192.168.1.81.80: . ack 1 win 17520<br />
17:34:58.791451 IP 192.168.1.102.1158 > 192.168.1.71.80: P 1:327(326) ack 1 win 17520<br />
17:34:58.791472 IP 192.168.1.71.1158 > 192.168.1.81.80: P 1:327(326) ack 1 win 17520<br />
17:34:58.791973 IP 192.168.1.81.80 > 192.168.1.71.1158: . ack 327 win 6432<br />
<br />
Above the web client is on "192.168.1.102". You can see that the 1st server "192.168.1.71" then goes out to<br />
the 2nd server "192.168.1.81" on the second line. The third line shows the 2nd server "192.168.1.81" responding to<br />
the 1st server, and the forth line passes this data back to the web client "192.168.1.102".<br />
<br />
Note: You can save your current iptables setting with the following command:<br />
<br />
$ iptables-save > iptables_store<br />
<br />
The big advantage is that you can store the counters as well.<br />
<br />
$ iptables-save -c > iptables_store_w_cnts<br />
<br />
To restore the file, use the following:<br />
<br />
$ iptables-restore -c < iptables_store_w_cnts<br />
<br />
<br />
<br />
TIP 183:<br />
<br />
mailstats - display mail statistics. This file reads data from "/var/log/mail/statistics"<br />
<br />
[root@closet ~]# mailstats<br />
Statistics from Sat Jun 25 15:59:52 2005<br />
M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis msgsqur Mailer<br />
4 1 2K 0 0K 0 0 0 esmtp<br />
9 0 0K 1 2K 0 0 0 local<br />
=====================================================================<br />
T 1 2K 1 2K 0 0 0<br />
C 1 0 0<br />
<br />
<br />
<br />
TIP 184:<br />
<br />
Profiling C Applications - Assume you have the following program p1.c:<br />
<br />
/* Program p1.c */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
t1(int i)<br />
{<br />
printf("t1:%d\n", i);<br />
}<br />
<br />
t2(int j)<br />
{<br />
printf("t2:%d\n", j);<br />
}<br />
<br />
int main(void)<br />
{<br />
int i, j;<br />
<br />
for (i = 0; i < 5; ++i) {<br />
t1(i);<br />
for (j = 0; j < 2; ++j) {<br />
t2(j);<br />
}<br />
}<br />
}<br />
<br />
Compile the program as follows:<br />
<br />
$ gcc -pg -g -o p1 p1.c<br />
$ ./p1<br />
t1:0<br />
t2:0<br />
t2:1<br />
t1:1<br />
t2:0<br />
t2:1<br />
t1:2<br />
t2:0<br />
t2:1<br />
t1:3<br />
t2:0<br />
t2:1<br />
t1:4<br />
t2:0<br />
t2:1<br />
<br />
Next, to get the profile graph.<br />
<br />
$ gprof -p -b p1<br />
Flat profile:<br />
<br />
Each sample counts as 0.01 seconds.<br />
no time accumulated<br />
<br />
% cumulative self self total<br />
time seconds seconds calls Ts/call Ts/call name<br />
0.00 0.00 0.00 10 0.00 0.00 t2<br />
0.00 0.00 0.00 5 0.00 0.00 t1<br />
<br />
<br />
Above note the 10 calls to t2 and 5 calls to t1.<br />
<br />
<br />
<br />
TIP 185:<br />
<br />
CDPATH - this is a bash variable like PATH that defines a search path<br />
for the cd command.<br />
<br />
Suppose you have the following directory structure:<br />
<br />
/home/chirico/stuff<br />
|-- dirA<br />
`-- dirB<br />
<br />
Assume you define CDPATH as follows:<br />
<br />
CDPATH=/home/chirico/stuff<br />
<br />
Now, no matter what directory you are in if you use the cd command below<br />
you will automatically move to "/home/chirico/stuff/dirA".<br />
<br />
$ cd dirA<br />
<br />
Note you could be in "/etc" and will move directly to "/home/chirico/stuff/dirA".<br />
This command has the same format as PATH - multiple entries are separated by a colon.<br />
If the current directory contain a sub-directory dirA, then, it gets priority.<br />
<br />
The following is part of my .bash_profile<br />
<br />
CDPATH=/work/cpearls/src/posted_on_sf/:/work/souptonuts/documentation/:/home/chirico/deleteme/<br />
export PATH CVS_RSH EDITOR JAVA_HOME CDPATH<br />
<br />
<br />
<br />
TIP 186:<br />
<br />
Groups - add groups and users to groups. The following shows how to create the group "share"<br />
and add the user "chirico" to this group. The following should be done as root, and<br />
assumes the account "chirico" already exits.<br />
<br />
$ groupadd share<br />
$ usermod -G share chirico<br />
<br />
Note the change made to "/etc/group" below:<br />
<br />
$ cat /etc/group|grep 'share'<br />
share:x:616:chirico<br />
<br />
If the user chirico is currently logged in, he should run the following<br />
command to immediately have group "share" rights. Or, the next time he logs<br />
in he will have access to this group.<br />
<br />
$ newgrp share<br />
<br />
Reference the following (TIP 6, TIP 167).<br />
<br />
<br />
<br />
TIP 187:<br />
<br />
oprofile - steps for running oprofile on Fedora.<br />
<br />
Step 1:<br />
<br />
Find out what version of the kernel you are running.<br />
<br />
$ uname -a<br />
Linux closet.squeezel.com 2.6.12-1.1398_FC4 #1 Fri Jul 15 00:52:32 EDT 2005 i686 i686 i386 GNU/Linux<br />
<br />
<br />
Step 2:<br />
<br />
Download the source in a chosen directory. Above, I'm running 2.6.12-1, but I'm going to go for 2.6.12.3, since<br />
it's a little later. You want the signed file as well.<br />
<br />
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.12.3.tar.gz<br />
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.12.3.tar.gz.sign<br />
<br />
Now, check the signature.<br />
<br />
$ gpg --verify linux-2.6.12.3.tar.gz.sign linux-2.6.12.3.tar.gz<br />
<br />
<br />
Step 3:<br />
<br />
Unpack the file.<br />
<br />
$ tar -xzf linux-2.6.12.3.tar.gz<br />
$ cd cd linux-2.6.12.3<br />
<br />
<br />
Step 4:<br />
<br />
Copy the ".config" used to compile your previous kernel. You should find it<br />
in the following direcotry "/lib/modules/$(uname -r)/build/.config".<br />
<br />
Copy it to the linux-2.6.12.3 directory.<br />
<br />
$ cp "/lib/modules/$(uname -r)/build/.config" .<br />
<br />
<br />
Step 5:<br />
<br />
Run make as follows. It will ask for a few questions on "make oldconfig". The<br />
make installs below will have to be done with root privileges.<br />
<br />
$ make oldconfig<br />
$ make bzImage<br />
$ make modules<br />
$ make modules_install<br />
$ make install<br />
<br />
<br />
Step 6:<br />
<br />
Edit the "/boot/grub/grub.conf" and set default = 0 as shown below in this<br />
file.<br />
<br />
default=0<br />
timeout=5<br />
splashimage=(hd0,2)/grub/splash.xpm.gz<br />
hiddenmenu<br />
title Fedora Core (2.6.12.3)<br />
root (hd0,2)<br />
kernel /vmlinuz-2.6.12.3 ro root=/dev/VolGroup00/LogVol00 rhgb quiet<br />
initrd /initrd-2.6.12.3.img<br />
title Fedora Core (2.6.12-1.1398_FC4)<br />
root (hd0,2)<br />
kernel /vmlinuz-2.6.12-1.1398_FC4 ro root=/dev/VolGroup00/LogVol00 rhgb quiet<br />
initrd /initrd-2.6.12-1.1398_FC4.img<br />
title Fedora Core (2.6.11-1.1369_FC4)<br />
root (hd0,2)<br />
kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/VolGroup00/LogVol00 rhgb quiet<br />
initrd /initrd-2.6.11-1.1369_FC4.img<br />
title Other<br />
rootnoverify (hd0,1)<br />
chainloader +1<br />
<br />
<br />
Step 7:<br />
<br />
Shutdown with the restart option.<br />
<br />
$ shutdown -r now<br />
<br />
<br />
Step 8:<br />
<br />
Run opcontrol. The commands below are done as root. My kernel was compiled in the following<br />
directory "/home/kernel/linux-2.6.12.3/", so I'll run opcontrol as follows:<br />
<br />
$ opcontrol --vmlinux=/home/kernel/linux-2.6.12.3/vmlinux<br />
<br />
Now start.<br />
<br />
$ opcontrol --start<br />
Using 2.6+ OProfile kernel interface.<br />
Reading module info.<br />
Using log file /var/lib/oprofile/oprofiled.log<br />
Daemon started.<br />
Profiler running.<br />
<br />
Shutdown opcontrol.<br />
<br />
$ opcontrol --shutdown<br />
<br />
Run report.<br />
<br />
$ opreport<br />
<br />
CPU: CPU with timer interrupt, speed 0 MHz (estimated)<br />
Profiling through timer interrupt<br />
TIMER:0|<br />
samples| %|<br />
------------------<br />
156088 99.8746 vmlinux<br />
60 0.0384 libc-2.3.5.so<br />
30 0.0192 oprofiled<br />
23 0.0147 libcrypto.so.0.9.7f<br />
13 0.0083 bash<br />
12 0.0077 screen<br />
10 0.0064 sshd<br />
9 0.0058 ssh<br />
6 0.0038 ip_tables<br />
6 0.0038 libncurses.so.5.4<br />
5 0.0032 b44<br />
5 0.0032 ext3<br />
5 0.0032 ld-2.3.5.so<br />
4 0.0026 ip_conntrack<br />
4 0.0026 jbd<br />
2 0.0013 grep<br />
1 6.4e-04 libdns.so.20.0.2<br />
1 6.4e-04 libisc.so.9.1.5<br />
<br />
<br />
Reference the following for more documentation:<br />
http://oprofile.sourceforge.net/doc/<br />
<br />
<br />
<br />
<br />
TIP 188:<br />
<br />
cyrus-imapd with Postfix using sasldb for authentication. For this example<br />
the server is tape.squeezel.com and the user is chirico.<br />
<br />
Step 1:<br />
<br />
$ yum install cyrus-imapd<br />
$ yum install cyrus-imapd-utils<br />
<br />
You need "cyrus-imapd-utils" for cyradm.<br />
<br />
<br />
Step 2:<br />
<br />
Edit /etc/imapd.conf<br />
<br />
configdirectory: /var/lib/imap<br />
partition-default: /var/spool/imap<br />
admins: cyrus<br />
sievedir: /var/lib/imap/sieve<br />
sendmail: /usr/sbin/sendmail<br />
hashimapspool: true<br />
# Chirico Commented the below line<br />
# sasl_pwcheck_method: saslauthd<br />
# Because using sasldb<br />
sasl_pwcheck_method: auxprop<br />
sasl_auxprop_plugin: sasldb<br />
# Chirico end change<br />
sasl_mech_list: PLAIN<br />
tls_cert_file: /usr/share/ssl/certs/cyrus-imapd.pem<br />
tls_key_file: /usr/share/ssl/certs/cyrus-imapd.pem<br />
tls_ca_file: /usr/share/ssl/certs/ca-bundle.crt<br />
<br />
<br />
Step 3:<br />
<br />
Create a user and password:<br />
<br />
$ saslpasswd2 -c -u `postconf -h myhostname` cyrus<br />
$ saslpasswd2 -c -u `postconf -h myhostname` chirico<br />
$ saslpasswd2 -c -u `postconf -h myhostname` allmail<br />
<br />
<br />
This will automatically create the file /etc/sasldb2. But look<br />
at the default rights, assuming you ran saslpasswd2 as root:<br />
<br />
$ ls -l /etc/sasldb2<br />
-rw-r----- 1 root root 12288 Jul 31 09:50 /etc/sasldb2<br />
<br />
We need to correct this in step 4.<br />
<br />
<br />
Step 4:<br />
<br />
$ chown root.mail /etc/sasldb2<br />
$ ls -l /etc/sasldb2<br />
-rw-r----- 1 root mail 12288 Jul 31 09:50 /etc/sasldb2<br />
<br />
<br />
Step 5:<br />
<br />
Update "/etc/postfix/main.cf". Note in /etc/imapd.conf the configdirectory<br />
points to /var/lib/imap, and if I look at this directory I see the<br />
socket directory. However, after staring /etc/init.d/cyrus-imapd there<br />
will be a socket file "/var/lib/imap/socket/lmtp". (See step 6).<br />
<br />
mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp<br />
mailbox_transport = cyrus<br />
<br />
Restart postfix.<br />
<br />
/etc/init.d/postfix restart<br />
<br />
<br />
Step 6:<br />
<br />
Start cyrus-imapd and look for the socket file.<br />
<br />
<br />
$ /etc/init.d/cyrus-imapd restart<br />
Shutting down cyrus-imapd: [ OK ]<br />
Starting cyrus-imapd: preparing databases... done. [ OK ]<br />
<br />
Now you should see the lmtp file:<br />
<br />
$ ls -l /var/lib/imap/socket/lmtp<br />
srwxrwxrwx 1 root root 0 Jul 31 10:04 /var/lib/imap/socket/lmtp<br />
<br />
<br />
Step 7:<br />
<br />
Add users. Note, you may have to go back to step 3 to add them to /etc/sasldb2<br />
as well.<br />
<br />
$ su - cyrus<br />
$ cyradm tape.squeezel.com<br />
tape.squeezel.com> cm user.chirico<br />
tape.squeezel.com> quit<br />
<br />
Now got back as root, and check that everything was created correctly.<br />
<br />
$ ls /var/spool/imap/c/user/<br />
total 8<br />
drwx------ 2 cyrus mail 4096 Jul 31 10:21 chirico<br />
<br />
<br />
Step 8:<br />
<br />
Run a mail test. We'll do this as root to the chirico account.<br />
<br />
$ mail -s 'First test' chirico<br />
first test<br />
.<br />
<br />
Now, still as root check the maillog. Normally everything should work.<br />
<br />
$ tail /var/log/maillog<br />
<br />
However, I got the following error below.<br />
<br />
Jul 31 10:29:03 tape postfix/cleanup[30124]: AE7CB1B34A4: message-id=<20050731142903.AE7CB1B34A4@tape.squeezel.com><br />
Jul 31 10:29:03 tape postfix/qmgr[30120]: AE7CB1B34A4: from=<root@tape.squeezel.com>, size=315, nrcpt=1 (queue active)<br />
Jul 31 10:29:03 tape pipe[30128]: fatal: pipe_comand: execvp /cyrus/bin/deliver: No such file or directory<br />
<br />
If you get a similiar error, you may need to adjust the settting in /etc/postfix/master.cf<br />
<br />
# This is the problem in /etc/postfix/master.cf<br />
cyrus unix - n n - - pipe<br />
user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}<br />
<br />
My deliver file is the following<br />
<br />
$ ls -l /usr/lib/cyrus-imapd/deliver<br />
-rwxr-xr-x 1 root root 846228 Apr 4 18:59 /usr/lib/cyrus-imapd/deliver<br />
<br />
So I need to change my /etc/postfix/master.cf as follows:<br />
<br />
# Fix because by deliver file is under /usr/lib/cyrus-imapd/deliver<br />
cyrus unix - n n - - pipe<br />
user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}<br />
<br />
<br />
If changes were needed, like I had to do, restart postfix<br />
<br />
$ /etc/init.d/postfix restart<br />
<br />
Now, if everything works, you should start to see numbers in the spool directory like "1." and<br />
"2.".<br />
<br />
$ ls -l /var/spool/imap/c/user/chirico/<br />
total 40<br />
-rw------- 1 cyrus mail 545 Jul 31 10:44 1.<br />
-rw------- 1 cyrus mail 547 Jul 31 10:45 2.<br />
-rw------- 1 cyrus mail 1276 Jul 31 10:45 cyrus.cache<br />
-rw------- 1 cyrus mail 153 Jul 31 10:21 cyrus.header<br />
-rw------- 1 cyrus mail 196 Jul 31 10:45 cyrus.index<br />
<br />
Step 9:<br />
<br />
Local firewall.<br />
<br />
# imap<br />
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 143 -j ACCEPT<br />
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 143 -j ACCEPT<br />
<br />
Step 10:<br />
<br />
Configure cyrus-imapd to start for run-level 3 and 5.<br />
<br />
# chkconfig --level 35 cyrus-imapd on<br />
<br />
<br />
HINTS - <br />
<br />
Something to watch out for:<br />
<br />
Something to watch out for: If a user creates a .forward file in their shell account with the<br />
following entry, then, mail will not get mail relayed to cyrus.<br />
<br />
"|exec /usr/bin/procmail"<br />
<br />
<br />
The /etc/maillog will show something like this:<br />
<br />
to=<chirico@squeezel.squeezel.com>, orig_to=<chirico>, relay=local, delay=0,<br />
status=sent (delivered to command: exec /usr/bin/procmail)<br />
<br />
Remove the ".forward" file from their home directory and you'll get the following:<br />
<br />
to=<chirico@squeezel.squeezel.com>, relay=cyrus, delay=0,<br />
status=sent (squeezel.squeezel.com)<br />
<br />
<br />
mutt with IMAP? (See TIP 190)<br />
<br />
<br />
<br />
TIP 189:<br />
<br />
expand - convert tabs to spaces in a file.<br />
<br />
$ expand How_to_Linux_and_Open_Source.txt > notabs<br />
<br />
<br />
<br />
TIP 190:<br />
<br />
mutt with imap - assume you have setup imap (see tip 188). Now how do you configure<br />
your ".muttrc" file to automatically connect, securely to the IMAP server?<br />
<br />
<br />
<br />
Below is an example of my ".muttrc" file. For this example, assume my password is "S0m3paSSw0r9".<br />
<br />
$ cat .muttrc<br />
set spoolfile = "imaps://chirico:S0m3paSSw0r9@squeezel.squeezel.com/<br />
set imap_force_ssl=yes<br />
set certificate_file=~/.mutt/certificates/72d31154.0<br />
<br />
Now, you want to copy the certificate as a "file.pem" and run "c_rehash" to convert this<br />
file to a number. See the article. See the following article on how to do this under the <br />
fetchmail section.<br />
<br />
http://souptonuts.sourceforge.net/postfix_tutorial.html<br />
<br />
This is a quick summary of creating this key.<br />
<br />
$ openssl s_client -connect squeezel.squeezel.com:995 -showcerts > file.pem<br />
$ c_rehash ~/.mutt/certificates<br />
<br />
<br />
<br />
TIP 191:<br />
<br />
Apache - CGI scripts. There are two ways to enable CGI scripts. The second method is the<br />
prefered method.<br />
<br />
<br />
First way, the easy way. Look for the "http.conf" file. On Fedora Core, this file can be<br />
found under "/etc/httpd/conf/httpd.conf". Edit this file as follows to make <br />
"http://squeezel.squeezel.com/chirico-cgi/" execute scripts.<br />
<br />
ScriptAlias /chirico-cgi/ "/home/chirico/cgi-bin/"<br />
<br />
<br />
Second way, the better way. Instead of doing the above, make the following change in <br />
"/etc/httpd/conf/httpd.conf".<br />
<br />
<Directory /home/chirico/cgi-bin><br />
Options +ExecCGI<br />
SetHandler chirico-cgi<br />
</Directory><br />
<br />
<br />
Running a test script. Now copy the following test script into the directory "/home/chirico/cgi-bin"<br />
and change the rights to execute for the user running this.<br />
<br />
#!/bin/sh<br />
# Save as test.cgi<br />
# chown apache.apache test.cgi<br />
# chmod 700 test.cgi<br />
echo "Content-Type: text/html"<br />
echo<br />
echo "Hello world from user <b>`whoami`</b>! "<br />
<br />
<br />
<br />
TIP 192:<br />
<br />
Bash - using getopts for your bash scripts.<br />
<br />
#!/bin/bash<br />
while getopts "ab:cd:" Option<br />
# b and d take arguments<br />
#<br />
do<br />
case $Option in<br />
a) echo -e "a = $OPTIND";;<br />
b) echo -e "b = $OPTIND $OPTARG";;<br />
c) echo -e "c = $OPTIND";;<br />
d) echo -e "d = $OPTIND $OPTARG";;<br />
esac<br />
done<br />
shift $(($OPTIND - 1))<br />
<br />
<br />
<br />
TIP 193:<br />
<br />
Sieve - creating sieve recipes with "sieveshell"<br />
<br />
The following sieve script put all jefferson.edu mail into the <br />
folder jefferson. This assumes that I have already created the IMP <br />
directory, or mail box (INBOX.jefferson), which can be done in mutt <br />
with the "C" command. Below is an example of finding "jefferson.edu"<br />
anywhere in the header. <br />
<br />
# This is a file named jefferson.siv<br />
require ["fileinto"];<br />
if header :contains "Received" "from jefferson.edu" {<br />
fileinto "INBOX.jefferson";<br />
stop;<br />
}<br />
<br />
Now, from the command propt execute "sieveshell" with the hostname of the<br />
imap server. My server is squeezel.squeezel.com, so I would execute the <br />
following:<br />
<br />
$ sieveshell squeezel.squeezel.com<br />
connecting to squeezel.squeezel.com<br />
Please enter your password:****<br />
> put jefferson.siv<br />
> activate jefferson.siv<br />
> list<br />
jefferson.siv <- active script<br />
> quit<br />
<br />
Note the put brings in the script. And you need to activiate it.<br />
<br />
You can activate a sieve script for any user on your system if you are<br />
root. This is an example of activating a script for user chirico. Assume<br />
below the root prompt is "#".<br />
<br />
# sieveshell -a chirico -u chirico squeezel.squeezel.com<br />
<br />
You can also automate everything from a bash script. But note after<br />
the -e the commands, and not a file with the commands, follows within<br />
quotes. This is the script I use for my home system.<br />
<br />
#!/bin/bash<br />
sieveshell -a chirico -u chirico -e 'deactivate<br />
delete chirico.siv<br />
put chirico.siv<br />
activate chirico.siv<br />
list<br />
' squeezel.squeezel.com<br />
<br />
<br />
<br />
References:<br />
http://wiki.fastmail.fm/index.php/SieveRecipes<br />
http://www.cyrusoft.com/sieve/#documents<br />
<br />
<br />
<br />
TIP 194:<br />
<br />
emacs - editing files remotely with tramp. Tramp comes with the latest version of emacs.<br />
That means if you're using Fedora core 4, with emacs, you have tramp. This is <br />
ideal for editing files on remote computers that do not use emacs.<br />
<br />
Edit the ".emacs" file and add the following line:<br />
<br />
(require 'tramp)<br />
(setq tramp-default-method "scp")<br />
<br />
Now, to edit a file on computer tape.squeezel.com (C-x, C-f) and<br />
enter the following in Find file:<br />
<br />
Find file:/chirico@tape.squeezel.com:test.txt<br />
<br />
<br />
References:<br />
<br />
http://savannah.gnu.org/projects/tramp/<br />
<br />
<br />
<br />
TIP 195:<br />
<br />
trusted X11 forwarding - running gnome and KDE both on one screen, at the same<br />
time securely. The following assumes gnome is running on the current<br />
computer and "closet.squeezel.com" has KDE<br />
<br />
$ ssh -Y closet.squeezel.com<br />
$ startkde<br />
<br />
Or assume you want to run gnome on "closet.squeezel.com"<br />
<br />
$ ssh -Y closet.squeezel.com<br />
$ gnome-session<br />
<br />
By default Fedora Core allows ForwardX11 over ssh. Note you want to use<br />
the -Y option above and NOT -X. <br />
<br />
Suppose you want a remote "gnome-session" on ctl-alt-F12. Below is an <br />
example of getting the remote computer closet.squeezel.com, and you<br />
can still have the above configuration.<br />
<br />
First you must allow magic cookies for each server connection.<br />
<br />
$ MCOOKIE=$(mcookie)<br />
$ xauth add $(hostname)/unix:1 MIT-MAGIC-COOKIE-1 $MCOOKIE<br />
$ xauth add localhost/unix:1 MIT-MAGIC-COOKIE-1 $MCOOKIE<br />
<br />
Again, note that you have to add this for EACH connection. So if you wanted 2 as well<br />
<br />
$ MCOOKIE=$(mcookie)<br />
$ xauth add $(hostname)/unix:2 MIT-MAGIC-COOKIE-1 $MCOOKIE<br />
$ xauth add localhost/unix:2 MIT-MAGIC-COOKIE-1 $MCOOKIE<br />
<br />
On squeezel.squeezel.com create a new xterm. If :1 is take below<br />
try :2. The vt12 is for switching to ctl-alt-F12.<br />
<br />
$ xinit -- :1 vt12<br />
<br />
Note, if you do not add the above cookies, you will get the follow error:<br />
<br />
Xlib: connection to ":1.0" refused by server<br />
Xlib: No protocol specified<br />
<br />
The screen may be hard to read. At this point ssh -Y to the remote computer.<br />
<br />
$ ssh -Y closet.squeezel.com<br />
$ gnome-session<br />
<br />
Yes, you will get errors about sound and some custom drivers is the remove <br />
computer has different hardware. After is loads, you can switch back and<br />
forth between session with (ctl-alt-F12) and (ctl-alt-F7)<br />
<br />
<br />
<br />
TIP 196:<br />
<br />
Suspend ssh session - you have just sshed into a computer "ssh -l user example.com", and you<br />
want to get back to the terminal prompt of the computer you started with. Escapte, by <br />
default with ssh is "~", so enter "~" followed by "ctl-z" to suspend.<br />
<br />
<br />
<br />
TIP 197:<br />
<br />
Quick way to send a text file <br />
<br />
$ sendmail -f mike.chirico@gmail.com mchirico@comcast.net < /etc/fstab<br />
<br />
<br />
<br />
TIP 198:<br />
<br />
size - determining the size of the text segment, data segment, and "bss" or uninitialized data segment.<br />
<br />
$ size /bin/sh /bin/bash<br />
text data bss dec hex filename<br />
586946 22444 18784 628174 995ce /bin/sh<br />
586946 22444 18784 628174 995ce /bin/bash<br />
<br />
Note above that "/bin/sh" and "/bin/bash" have equal text,data and bss numbers. It's<br />
highly likely that these are the same programs.<br />
<br />
$ ls -l /bin/sh<br />
lrwxrwxrwx 1 root root 4 Jan 14 2005 /bin/sh -> bash<br />
<br />
Yep, it's the same program. Here's a further definition of each segment.<br />
<br />
Text segment: The machine instructions that the CPU executes. This is usually<br />
read only and sharable.<br />
<br />
Data segment: Contains initialized variables in a program. You also know these<br />
as declarations and definitions.<br />
<br />
int max = 200;<br />
<br />
Uninitialized data segment: Think of this as a declaration only, or data that<br />
is only initialized by the kernel to arithmetic 0 or null pointers<br />
before program execution.<br />
<br />
char s[10];<br />
<br />
<br />
<br />
TIP 199:<br />
<br />
Using the at command.<br />
<br />
Below is a simple example if running the ls command at 11:42am that<br />
will send mail -m to the user that executed it.<br />
<br />
<br />
We'll execute job1 defined as follows and set to be executable. <br />
<br />
$ cat ./job1<br />
#!/bin/bash<br />
date >> /tmp/job1<br />
<br />
The at command is listed below. For queue "-q" names you can only<br />
specify one letter. Here we're using x. The letter determines the<br />
priority with "a" the highest.<br />
<br />
$ at -q x -f ./job1 -m 11:54am<br />
job 3 at 2005-10-04 11:54<br />
<br />
Now, if you execute the atq command, you'll get the following.<br />
<br />
$ atq<br />
3 2005-10-04 11:54 x chirico<br />
<br />
It's also possible to execute jobs at the command line entering<br />
a ctl-d at the end of the input.<br />
<br />
$ at -q x -m 12:08pm<br />
at> ls -l<br />
at> who<br />
at> date<br />
at> ^D<br />
<br />
<br />
Or for a job to execute 1 minute from now.<br />
<br />
$ at -q x -m `date -d '1 minute' +"%H:%M"`<br />
at> ls -l<br />
at> date<br />
<br />
<br />
Important points: The atd daemon must be running. To check if<br />
it's running do the following:<br />
<br />
$ /etc/init.d/atd status<br />
<br />
Also, if there is an /etc/at.allow file, then only users in that<br />
file will be allowed to execute at.<br />
<br />
If /etc/at.deny exists but is empty and there is no /etc/at.allow,<br />
then, everyone can execute the at command.<br />
<br />
<br />
<br />
TIP 200:<br />
<br />
lsusb - command will display all USB buses and all devices connected.<br />
<br />
$ lsusb<br />
Bus 005 Device 003: ID 413c:2010 Dell Computer Corp.<br />
Bus 005 Device 002: ID 413c:1003 Dell Computer Corp.<br />
Bus 005 Device 001: ID 0000:0000<br />
Bus 004 Device 001: ID 0000:0000<br />
Bus 003 Device 003: ID 0fc5:1227 Delcom Engineering<br />
Bus 003 Device 002: ID 046d:c016 Logitech, Inc. Optical Mouse<br />
Bus 003 Device 001: ID 0000:0000<br />
Bus 002 Device 001: ID 0000:0000<br />
Bus 001 Device 001: ID 0000:0000<br />
<br />
<br />
<br />
TIP 201:<br />
<br />
Memory fragmentation - if you suspect workload memory fragmentation issues<br />
and you want to monitor the current state of you system, then, consider<br />
looking at the output from /proc/buddyinfo on recent kernels.<br />
<br />
$ cat /proc/buddyinfo<br />
Node 0, zone DMA 541 218 42 2 0 0 0 1 1 1 0 <br />
Node 0, zone Normal 2508 2614 52 1 5 5 0 1 1 1 0 <br />
Node 0, zone HighMem 0 1 3 0 1 0 0 0 0 0 0 <br />
<br />
The following definition is taken from ./Documentation/filesystems/proc.txt in the <br />
Linux kernel source.<br />
<br />
Each column represents the number of pages of a certain order which are<br />
available. In this case, there are 0 chunks of 2^0*PAGE_SIZE available in<br />
ZONE_DMA, 4 chunks of 2^1*PAGE_SIZE in ZONE_DMA, 101 chunks of 2^4*PAGE_SIZE<br />
available in ZONE_NORMAL, etc...<br />
<br />
<br />
<br />
TIP 202:<br />
<br />
arp - Linux ARP kernel moduel. This command implements the Address Resolution Protocol.<br />
<br />
This is an example of the command.<br />
<br />
$ arp<br />
Address HWtype HWaddress Flags Mask Iface<br />
tape.squeezel.com ether 00:50:DA:60:5B:AD C eth0<br />
squeezel.squeezel.com ether 00:11:11:8A:BE:3F C eth0<br />
gw.squeezel.com ether 00:0F:66:47:15:73 C eth0<br />
<br />
<br />
TIP 203:<br />
<br />
dbench - performance monitoring. <br />
<br />
So, how does your system react when the load average is above 600. Have you even seen a <br />
computer with a load average of 600? Well, this could be your chance. <br />
<br />
Reference: http://freshmeat.net/projects/dbench/<br />
<br />
The following gives a load average of 10 on my system.<br />
<br />
$ dbench 34<br />
<br />
If you want a higher load, just increase the number.<br />
<br />
<br />
<br />
TIP 204:<br />
<br />
/etc guide - a listing of common files in the /etc directory.<br />
<br />
/etc/exports: this file is used to configure NFS.<br />
<br />
/etc/ftpusers: the users on your system who are restricted from FTP login.<br />
<br />
/etc/motd: message of the day, which users see after login.<br />
<br />
/etc/named.conf: DNS config file.<br />
<br />
/etc/profile: common user information.<br />
<br />
/etc/inittab: this file contains runlevel start information.<br />
<br />
/etc/services: the services and their respective ports.<br />
<br />
/etc/shells: this contains the names of all shells installed on the system.<br />
<br />
/etc/passwd: this file contains user information.<br />
<br />
/etc/group: security group rights.<br />
<br />
<br />
<br />
TIP 205: <br />
<br />
logger - is a bash command utility for writing to /var/log/messages or the<br />
other files defined in /etc/syslog.conf.<br />
<br />
$ logger -t TEST more of a test here<br />
<br />
This is what shows up in /var/log/messages<br />
<br />
Oct 28 07:15:50 squeezel TEST: more of a test here<br />
<br />
<br />
<br />
TIP 206: <br />
<br />
accton, lastcomm - accouting on and last command. This is <br />
a way to monitor users on your system. As root, you <br />
would implement this as follows:<br />
<br />
$ accton -h<br />
Usage: accton [-hV] [file]<br />
[--help] [--version]<br />
<br />
The system's default process accounting file is /var/account/pacct.<br />
<br />
Note the default file location is /var/account/pacct so we'll turn<br />
it on system wide with the following command.<br />
<br />
$ accton /var/account/pacct<br />
<br />
Now take a look at this file. It will grow. To see command that<br />
are executed, use the lastcomm command.<br />
<br />
$ lastcomm<br />
<br />
The above command gives output for all users. To get the data<br />
for user "chirico" execute the following command:<br />
<br />
$ lastcomm --user chirico<br />
<br />
You can also get a summary of commands with sa.<br />
<br />
[chirico@big ~]$ sa<br />
30 5.23re 0.00cp 10185k<br />
11 4.83re 0.00cp 8961k ***other<br />
8 0.13re 0.00cp 19744k nagios*<br />
4 0.00re 0.00cp 2542k automount*<br />
3 0.00re 0.00cp 680k sa<br />
2 0.13re 0.00cp 17424k check_ping<br />
2 0.13re 0.00cp 978k ping<br />
<br />
To turn off accounting, execute accton without a filename.<br />
<br />
$ accton<br />
<br />
<br />
<br />
TIP 207:<br />
<br />
CPU Temperature on a laptop. The following is the temperature<br />
of my Dell laptop. <br />
<br />
$ cat /proc/acpi/thermal_zone/THM/temperature<br />
temperature: 58 C<br />
<br />
<br />
<br />
<br />
TIP 208:<br />
<br />
script -f with mkfifo to allow another user to view what you type<br />
in real-time.<br />
<br />
<br />
Step 1. Create a fifo (first in first out) file that the other<br />
user can view. For this example create the file /tmp/scriptout<br />
<br />
[chirico@laptop ~]$ mkfifo /tmp/scriptout<br />
<br />
Step 2. Have the second user, voyeur user, cat this file. Output will block<br />
for them until you complete step 3. The other user, voyer,<br />
is executing the command below.<br />
<br />
[voyeur@laptop ~]$ cat /tmp/scriptout<br />
<br />
Step 3. The original user runs the following command.<br />
<br />
[chirico@laptop ~]$ script -f /tmp/scriptout<br />
Script started, file is /tmp/scriptout<br />
<br />
Now anything typed, including a vi session, will be displayed to the<br />
voyeur user in step 2. <br />
<br />
See TIP 46.<br />
<br />
<br />
<br />
TIP 209:<br />
<br />
fsck forced on next reboot. To do this, as root issue the following commands.<br />
<br />
$ cd /<br />
$ touch forcefsck<br />
<br />
Now reboot the system, and when it comes up fsck will be forced on the system.<br />
<br />
$ shutdown -r now<br />
<br />
<br />
<br />
TIP 210:<br />
<br />
/dev/random and /dev/urandom differ in their random generating properties. /dev/random<br />
only returns bytes when enough noise has been generated from the entropy pool. In<br />
contrast /dev/urandom will always return bytes.<br />
<br />
<br />
Reference: http://sourceforge.net/direct-dl/mchirico/cpearls/simple_but_common.tar.gz (rand.c)<br />
<br />
<br />
<br />
TIP 211:<br />
<br />
Want to find out the speed of your NIC? (Full Duplex or Half), then use ethtool.<br />
<br />
[root@squeezel ~]# ethtool eth0<br />
Settings for eth0:<br />
Supported ports: [ MII ]<br />
Supported link modes: 10baseT/Half 10baseT/Full<br />
100baseT/Half 100baseT/Full<br />
1000baseT/Half 1000baseT/Full<br />
Supports auto-negotiation: Yes<br />
Advertised link modes: 10baseT/Half 10baseT/Full<br />
100baseT/Half 100baseT/Full<br />
1000baseT/Half 1000baseT/Full<br />
Advertised auto-negotiation: Yes<br />
Speed: 100Mb/s<br />
Duplex: Full<br />
Port: Twisted Pair<br />
PHYAD: 1<br />
Transceiver: internal<br />
Auto-negotiation: on<br />
Supports Wake-on: g<br />
Wake-on: d<br />
Current message level: 0x000000ff (255)<br />
Link detected: yes<br />
<br />
<br />
<br />
<br />
TIP 212:<br />
<br />
rpm install hang? You might need to delete the lock state information. <br />
<br />
$ nl /etc/rc.d/rc.sysinit | grep rpm<br />
720 rm -f /var/lib/rpm/__db* &> /dev/null<br />
<br />
Note the command <br />
<br />
$ rm -f /var/lib/rpm/__db*<br />
<br />
Because sometimes you will run "rpm -ivh somerpm" and it will just sit<br />
there.<br />
<br />
<br />
<br />
<br />
TIP 213:<br />
<br />
Apache - limit access to certain directories based on IP address in the<br />
httpd.conf file.<br />
<br />
You can do this completely from /etc/httpd/conf/httpd.conf which<br />
are shown below for multiple IP addresses. Note that all 3 setting<br />
are the same.<br />
<br />
10.0.0.0/255.0.0.0<br />
10.0.0.0/8<br />
10<br />
<br />
However, the following is different<br />
<br />
10.0.0.0/24 only allows 10.0.0.1 to 10.0.0.254<br />
<br />
<br />
Some complete settings in /etc/httpd/conf/httpd.conf <br />
<br />
<Directory /var/www/html/chirico/><br />
Order allow,deny<br />
Allow from 10.0.0.0/8 # All 10.<br />
Allow from 192.168.0.0/16 # All 192.168<br />
Allow from 127 # All 127.<br />
</Directory><br />
<br />
Don't forget to reload httpd with the following command.<br />
<br />
$ /etc/init.d/httpd reload<br />
<br />
<br />
<br />
TIP 214:<br />
<br />
Open Files - determining how many files are currently open.<br />
<br />
$ cat /proc/sys/fs/file-nr<br />
2030 263 104851<br />
| | \- maximum open file descriptors <br />
| | <br />
| \- total free allocated file descriptors<br />
|<br />
(Total allocated file descriptors since boot)<br />
<br />
Note the maximum number can be set or changed.<br />
<br />
$ cat /proc/sys/fs/file-max<br />
104851<br />
<br />
To change this<br />
<br />
$ echo "804854" > /proc/sys/fs/file-max<br />
<br />
Note lsof | wc -l will report higher numbers because this includes<br />
open files that are not using file descriptors such as directories,<br />
memory mapped files, and executable text files.<br />
<br />
(Reference http://www.netadmintools.com/art295.html<br />
and also see the man page for this: man 5 proc )<br />
<br />
<br />
<br />
TIP 215:<br />
<br />
Ctrl-Alt-Del will cause an immediate reboot, without syncing dirty buffers by<br />
setting the value > 0 in /proc/sys/kernel/ctrl-alt-del.<br />
<br />
$ echo 1 > /proc/sys/kernel/ctrl-alt-del<br />
<br />
<br />
(Reference: man 5 proc)<br />
<br />
<br />
<br />
<br />
TIP 216:<br />
<br />
Redefining keys in X using xev and xmodmap. The program xev, used in an X window <br />
terminal screen will display information on mouse movements, keys pressed and <br />
released.<br />
<br />
$ xev<br />
<br />
Now type shift-4 and you'll notice the event details below:<br />
<br />
KeyPress event, serial 29, synthetic NO, window 0x3800001,<br />
root 0x60, subw 0x0, time 55307049, (418,242), root:(428,339),<br />
state 0x1, keycode 13 (keysym 0x24, dollar), same_screen YES,<br />
XLookupString gives 1 bytes: (24) "$"<br />
XmbLookupString gives 1 bytes: (24) "$"<br />
XFilterEvent returns: False<br />
<br />
KeyRelease event, serial 29, synthetic NO, window 0x3800001,<br />
root 0x60, subw 0x0, time 55307184, (418,242), root:(428,339),<br />
state 0x1, keycode 13 (keysym 0x24, dollar), same_screen YES,<br />
XLookupString gives 1 bytes: (24) "$"<br />
<br />
So, if you want to redefine this key to say copyright, see (/usr/X11R6/include/X11/keysymdef.h)<br />
you would type the following.<br />
<br />
$ xmodmap -e 'keycode 13 = 4 copyright'<br />
<br />
To get the key back to the dollar, issue the following command.<br />
<br />
$ xmodmap -e 'keycode 13 = 4 dollar'<br />
<br />
By the way it's possible to define multiple key codes for a sigle key. You'll need<br />
to have a key defined as the Mode_switch. Perhaps you'd like to use the Windows key,<br />
or the key with the Microsoft logo on it, since you're using Linux. This key is<br />
keycode 115<br />
<br />
$ xmodmap -e 'keycode 115 = Mode_switch'<br />
<br />
Now you could define 3 values to the shift-4. For this example use ld, Yen and dollar.<br />
<br />
$ xmodmap -e 'keycode 13 = 4 dollar sterling yen'<br />
<br />
So pressing the keys gives you the following:<br />
<br />
shift-$ (dollar sign)<br />
Windows-$ (lb sign)<br />
Windows-shift-$ (Yen sign)<br />
<br />
You could go crazy and redefine all you keys.<br />
<br />
(Thanks to hisham for this tip).<br />
<br />
<br />
<br />
TIP 217:<br />
<br />
Threads - which version of threads are you using?<br />
<br />
$ getconf GNU_LIBPTHREAD_VERSION<br />
NPTL 2.3.90<br />
<br />
For a history on threads used with gcc reference the following:<br />
<br />
http://en.wikipedia.org/wiki/NPTL<br />
<br />
<br />
<br />
<br />
TIP 218:<br />
<br />
Screenshots using ImageMagick. <br />
<br />
If you want the entire screen, execute the following:<br />
<br />
$ import -window root screen.png<br />
<br />
Or to crosshair select the region with your mouse, execute <br />
the following instead.<br />
<br />
$ import screen.png<br />
<br />
KDE has the ability to take screenshots with the command below.<br />
<br />
$ ksnapshot<br />
<br />
GNOME likewise has a command too.<br />
<br />
$ gnome-panel-screenshot --delay 6<br />
<br />
<br />
<br />
Visting ImageMagick again, the xwininfo command give window information and the id can be<br />
used to capture images with the import command.<br />
<br />
$ xwininfo<br />
<br />
xwininfo: Please select the window about which you<br />
would like information by clicking the<br />
mouse in that window.<br />
<br />
xwininfo: Window id: 0x1e00007 "chirico@squeezel:/work/svn/souptonuts - Shell - Konsole"<br />
<br />
Absolute upper-left X: 4<br />
Absolute upper-left Y: 21<br />
Relative upper-left X: 0<br />
Relative upper-left Y: 0<br />
Width: 880<br />
Height: 510<br />
Depth: 24<br />
Visual Class: TrueColor<br />
Border width: 0<br />
Class: InputOutput<br />
Colormap: 0x20 (installed)<br />
Bit Gravity State: NorthWestGravity<br />
Window Gravity State: NorthWestGravity<br />
Backing Store State: NotUseful<br />
Save Under State: no<br />
Map State: IsViewable<br />
Override Redirect State: no<br />
Corners: +4+21 -396+21 -396-493 +4-493<br />
-geometry 880x510+0+0<br />
<br />
Now use the import command with the Window id. My example is shown below.<br />
<br />
$ import -window 0x1e00007 id.miff<br />
<br />
And to quickly display this image that you just saved, use the display command.<br />
<br />
$ display id.miff <br />
<br />
<br />
<br />
TIP 219:<br />
<br />
File Access over SSH using FUSE (Filesystem in USErspace). This is a very good way to <br />
mount a remote filesystem locally. It's like a secure NFS mount, but you don't require <br />
admin privileges on the remote computer. You do need to have fuse-sshfs installed on <br />
the local computer that will perform the filesystem mount.<br />
<br />
The following works with Fedora Core 5. Only the users added to the fuse group can mout <br />
external drives. Below the user chirico is being added to the group fuse.<br />
<br />
$ yum install fuse-sshfs<br />
$ usermod -a -G fuse chirico<br />
<br />
You'll need to reboot.<br />
<br />
$ shutdown -r now<br />
<br />
<br />
Next I'm going to mount the remote filesystem v0.squeezel.com. This is done as user chirico<br />
on the local computer. I'm using root on the remote computer v0.squeezel.com because I<br />
want to mount the complete drive.<br />
<br />
$ mkdir v0<br />
$ sshfs root@v0.squeezel.com:/ v0<br />
$ cd v0<br />
$ ls -l<br />
bin dev home lost+found media mnt opt q sbin srv tmp var<br />
boot etc lib master_backup misc net proc root selinux sys usr<br />
<br />
<br />
Now to unmount the filesystem<br />
<br />
$ fusermount -u /home/chirico/v0<br />
<br />
Yes, you can mount the filesystem on boot. Below shows an example entry for /etc/fstab, but<br />
this only allows user on the current system to view what is is /mnt/v0. <br />
<br />
sshfs#root@v0.squeezel.com:/var/log /mnt/v0 fuse defaults 0 0<br />
<br />
References:<br />
(http://fuse.sourceforge.net/sshfs.html)<br />
<br />
<br />
<br />
<br />
TIP 220:<br />
<br />
OpenVPN - A full-featured SSL VPN solution. The following demonstrates<br />
a very simple OpenVPN setup between two Fedora Core 5 computers<br />
big.squeezel.com 192.168.1.12 and tape.squeezel.com 192.168.1.155<br />
<br />
As root install the package on both computers.<br />
<br />
$ yum -y install openvpn<br />
<br />
<br />
Setup on big.squeezel.com 192.168.1.12<br />
<br />
$ iptables -A INPUT -p udp -s 192.168.1.155 --dport 1194 -j ACCEPT<br />
$ iptables -A INPUT -i tun+ -j ACCEPT<br />
$ iptables -A INPUT -i tap+ -j ACCEPT<br />
$ iptables -A INPUT -i tap+ -j ACCEPT<br />
$ iptables -A FORWARD -i tap+ -j ACCEPT<br />
<br />
Note - make sure you have commented out the following line <br />
in /etc/sysconfig/iptables<br />
<br />
# -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited<br />
<br />
Now from continuting with the commands that need to be executed on <br />
big.squeezel.com 192.168.1.12 do one of the following<br />
<br />
$ openvpn --remote tape.squeezel.com --dev tun1 --ifconfig 10.4.0.1 10.4.0.2 --verb 9<br />
<br />
The above statement gives lots of errors. Once it's working you may want<br />
the following statement without the --verb 9 option.<br />
<br />
$ openvpn --remote tape.squeezel.com --dev tun1 --ifconfig 10.4.0.1 10.4.0.2<br />
<br />
After you finish the setup commands for tape.squeezel.com immediately below, you'll be<br />
able to access tape.squeezel.com as 10.4.0.2.<br />
<br />
<br />
Setup on tape.squeezel.com 192.168.1.155<br />
<br />
$ iptables -A INPUT -p udp -s 192.168.1.12 --dport 1194 -j ACCEPT<br />
$ iptables -A INPUT -i tun+ -j ACCEPT<br />
$ iptables -A INPUT -i tap+ -j ACCEPT<br />
$ iptables -A INPUT -i tap+ -j ACCEPT<br />
$ iptables -A FORWARD -i tap+ -j ACCEPT<br />
<br />
Note - again, make sure you have commented out the following line <br />
in /etc/sysconfig/iptables<br />
<br />
# -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited<br />
<br />
The openvpn commands are tape.squeezel.com are reversed from what is shown<br />
above.<br />
<br />
$ openvpn --remote big.squeezel.com --dev tun1 --ifconfig 10.4.0.2 10.4.0.1 --verb 9<br />
<br />
Or<br />
$ openvpn --remote big.squeezel.com --dev tun1 --ifconfig 10.4.0.2 10.4.0.1<br />
<br />
<br />
Now you can access all services and ports from big.squeezel.com on 10.4.0.1 for <br />
such services as MySQL, secure Web, imap, etc. A quick test is nmap as follows:<br />
<br />
$ nmap -A -T4 10.4.0.1<br />
<br />
Starting Nmap 4.03 ( http://www.insecure.org/nmap/ ) at 2006-05-20 13:54 EDT<br />
Interesting ports on 10.4.0.1:<br />
(The 1671 ports scanned but not shown below are in state: closed)<br />
PORT STATE SERVICE VERSION<br />
22/tcp open ssh OpenSSH 4.3 (protocol 2.0)<br />
111/tcp open rpcbind 2 (rpc #100000)<br />
3306/tcp open mysql MySQL (unauthorized)<br />
<br />
Nmap finished: 1 IP address (1 host up) scanned in 7.116 seconds<br />
<br />
<br />
<br />
TIP 221:<br />
<br />
openssl - Some common commands.<br />
<br />
Finding the openssldir (Directory for OpenSSL files).<br />
<br />
$ openssl version -a|grep OPENSSLDIR<br />
OPENSSLDIR: "/etc/pki/tls"<br />
<br />
Connect to a secure SMTP server with STARTTLS, assuming the server name is<br />
squeezel.squeezel.com<br />
<br />
$ openssl s_client -connect squeezel.squeezel.com:25 -starttls<br />
<br />
<br />
<br />
Reference (http://www.madboa.com/geek/openssl/)<br />
<br />
<br />
<br />
TIP 222:<br />
<br />
Bash functions. This is easy, and I find it very useful to create bash functions<br />
for repeated commands. For example, suppose you want to create a quick bash function<br />
to cd to /var/log, tail messages and tail secure. You can create this function as<br />
follows:<br />
<br />
[root@v5 log]# m()<br />
m()<br />
> { cd /var/log<br />
{ cd /var/log<br />
> tail messages<br />
tail messages<br />
> tail secure<br />
tail secure<br />
> }<br />
}<br />
<br />
Above I'm typing m() then hitting return. Note the echo on the next line followed<br />
by the prompt >. I then enter {. <br />
<br />
<br />
<br />
TIP 223:<br />
<br />
Stats on DNS Server. You can get stats on your DNS server. <br />
<br />
The following works for BIND 9:<br />
<br />
$ rndc stats<br />
<br />
On my system I see the output in "/var/named/chroot/var/named/data/named_stats.txt", which<br />
if an FC4 system. By the way, if you're using BIND 8, the command is "ndc stats", but that<br />
has a completely different format.<br />
<br />
<br />
Format of the output<br />
<br />
+++ Statistics Dump +++ (1153791199)<br />
success 297621<br />
referral 32<br />
nxrrset 21953<br />
nxdomain 33742<br />
recursion 28243<br />
failure 54<br />
--- Statistics Dump --- (1153791199)<br />
<br />
The number (1153791199) can be converted with the date command.<br />
<br />
$ date -d '1970-01-01 1153791199 sec'<br />
Tue Jul 25 02:33:19 EDT 2006<br />
<br />
That's 1153791199 seconds since 1970-01-01 UCT. Which is 4 hours fast,<br />
from EDT.<br />
<br />
<br />
<br />
TIP 224:<br />
<br />
snmp - simple network monitoring protocol. The following steps setup snmp on Fedora Core 5.<br />
<br />
$ yum install net-snmp*<br />
<br />
Next add the following line in "/etc/snmp/snmpd.conf" at the bottom.<br />
<br />
rocommunity pA33worD<br />
<br />
Start the snmp service.<br />
<br />
$ /etc/init.d/snmpd restart<br />
<br />
Once started, from the command prompt, it's possible to get stats on the computer.<br />
<br />
$ snmpwalk -v 1 -c pA33worD localhost system<br />
Or<br />
$ snmpwalk -v 1 -c pA33worD localhost interface<br />
<br />
Or<br />
$ snmpgetnext -v 1 -c pA33worD localhost sysUpTime<br />
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (26452) 0:04:24.52<br />
<br />
Note the Timeticks is in 100th of a second. So the computer above has been running<br />
for 264.52 seconds.<br />
<br />
Reference( TIP 225 shows how to use MRTG for gathering snmp stats).<br />
http://www.net-snmp.org/tutorial/tutorial-5/commands/snmpv3.html<br />
<br />
<br />
TIP 225:<br />
<br />
MRTG - Multi Router Traffic Grapher. <br />
<br />
$ cfgmaker --output=/etc/mrtg/v5.squeezel.com \<br />
ifref=ip --global "workdir:/var/www/html/mrtg/stats"\<br />
pA33worD@v5.squeezel.com<br />
<br />
Reference: http://www.chinalinuxpub.com/doc/www.siliconvalleyccie.com/linux-hn/mrtg.htm<br />
<br />
<br />
<br />
TIP 226:<br />
<br />
Back Trace - This is a method of getting a back trace for all processes on the system.<br />
it assumes the following: a. Kernel was build with CONFIG_MAGIC_SYS-REQ <br />
enabled (which Fedora 5 kernels are) b. You can get direct access to the <br />
monitor.<br />
<br />
Step 1.<br />
<br />
Ctl-Alt-F1 (This brings you to the text console)<br />
<br />
Step 2.<br />
<br />
Alt-ScrollLock <br />
Ctl-ScrollLock<br />
<br />
Note above that's Alt-ScrollLock followed by Ctl-ScrollLock. You should see<br />
a lot of text on the screen. To fast to read, but don't worry the text will<br />
be in /var/log/messages at the end.<br />
<br />
On my system the ScrollLock key is next to the NumLock key. <br />
<br />
<br />
<br />
<br />
TIP 227:<br />
<br />
Ext3 Tuning - One advantage of Ext3 over Ext2 is directory indexing, which imporves file<br />
access in directories containing large files or when the directory contains<br />
many files. Directory indexing improves performance by using hashed binary <br />
trees. <br />
<br />
There are two ways to enable dir_index. First, find the device using the mount<br />
command.<br />
<br />
$ mount<br />
<br />
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)<br />
proc on /proc type proc (rw)<br />
sysfs on /sys type sysfs (rw)<br />
devpts on /dev/pts type devpts (rw,gid=5,mode=620)<br />
/dev/sda1 on /boot type ext3 (rw) <--- This is the one you want<br />
tmpfs on /dev/shm type tmpfs (rw)<br />
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)<br />
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)<br />
automount(pid2001) on /net type autofs (rw,fd=4,pgrp=2001,minproto=2,maxproto=4) <br />
<br />
<br />
From the above command, the device used is /dev/sda1. Using the tune2fs command,<br />
directory indexing will only apply to directories created after running the <br />
command below. <br />
<br />
$ tune2fs -O dir_index /dev/sda1<br />
<br />
However, if you want it to apply to all directories, use the e2fsck command as <br />
shown below:<br />
<br />
$ e2fsck -D -f /dev/sda1<br />
<br />
You'll need to bypass the warning message.<br />
<br />
<br />
Reference: "Tuning Journaling File Systems: A small amount of effort an dtime can yield big<br />
results",by Steve Best. Linux Magazine, September 10, 2006. This author as has<br />
a very good book titled: "Linux Debugging and Performance Tuning."<br />
<br />
<br />
<br />
TIP 228:<br />
<br />
NIC bonding - binding two or more NICs to one IP address to improve performance. The following<br />
instructions were done on Fedora Core 5.<br />
<br />
Step 1.<br />
<br />
Create the file ifcfg-bond0 with the IP address, netmask and gateway. Shown<br />
below is my file.<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-bond0<br />
<br />
DEVICE=bond0<br />
IPADDR=192.168.1.12<br />
NETMASK=255.255.255.0<br />
GATEWAY=192.168.1.1<br />
USERCTL=no<br />
BOOTPROTO=none<br />
ONBOOT=yes<br />
<br />
Step 2.<br />
<br />
Modify eth0, eth1 and eth2. Shown below are each one of my files. Note that<br />
you must comment out, or remove the ip address, netmask, gateway and hardware<br />
address from each one of these files, since settings should only come from<br />
the ifcfg-bond0 file above. I've chosen to comment out the lines, instead of <br />
removing, should I decide to unbond my NICS sometime in the future.<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0<br />
<br />
# Linksys Gigabit Network Adapter<br />
DEVICE=eth0<br />
BOOTPROTO=none<br />
#HWADDR=00:12:17:5C:A7:9D<br />
#IPADDR=192.168.1.12<br />
#NETMASK=255.255.255.0<br />
#TYPE=Ethernet<br />
#GATEWAY=192.168.1.1<br />
#USERCTL=no<br />
#IPV6INIT=no<br />
#PEERDNS=yes<br />
ONBOOT=yes<br />
# Settings for Bond<br />
MASTER=bond0<br />
SLAVE=yes<br />
<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth1<br />
<br />
# Linksys Gigabit Network Adapter<br />
DEVICE=eth1<br />
BOOTPROTO=none<br />
#HWADDR=00:12:17:5C:A7:C9<br />
#IPADDR=192.168.1.13<br />
#NETMASK=255.255.255.0<br />
ONBOOT=yes<br />
#TYPE=Ethernet<br />
USERCTL=no<br />
#IPV6INIT=no<br />
#PEERDNS=yes<br />
#<br />
# Settings for bonding<br />
MASTER=bond0<br />
SLAVE=yes<br />
<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth2<br />
<br />
# Linksys Gigabit Network Adapter<br />
DEVICE=eth2<br />
BOOTPROTO=none<br />
#HWADDR=00:12:17:5C:A7:9D<br />
#IPADDR=192.168.1.12<br />
#NETMASK=255.255.255.0<br />
ONBOOT=yes<br />
#TYPE=Ethernet<br />
#GATEWAY=192.168.1.1<br />
#USERCTL=no<br />
#IPV6INIT=no<br />
#PEERDNS=yes<br />
MASTER=bond0<br />
SLAVE=yes<br />
<br />
Step 3.<br />
<br />
Set the load parameters for bond0 bonding kernel module. Append the<br />
following lines to /etc/modprobe.conf <br />
<br />
# bonding commands <br />
alias bond0 bonding<br />
options bond0 mode=balance-alb miimon=100<br />
<br />
<br />
Step 4.<br />
<br />
Load the bond driver module from the command prompt.<br />
<br />
$ modprobe bonding<br />
<br />
<br />
Step 5.<br />
<br />
Restart the network, or restart the computer. Note I restarted to computer,<br />
since my NICs above had MAC assignments.<br />
<br />
$ service network restart # Or restart computer<br />
<br />
Take a look at the proc settings. <br />
<br />
$ cat /proc/net/bonding/bond0 <br />
Ethernet Channel Bonding Driver: v3.0.3 (March 23, 2006)<br />
<br />
Bonding Mode: adaptive load balancing<br />
Primary Slave: None<br />
Currently Active Slave: eth2<br />
MII Status: up<br />
MII Polling Interval (ms): 100<br />
Up Delay (ms): 0<br />
Down Delay (ms): 0<br />
<br />
Slave Interface: eth2<br />
MII Status: up<br />
Link Failure Count: 0<br />
Permanent HW addr: 00:13:72:80:62:f0<br />
<br />
References:<br />
<br />
http://www.cyberciti.biz/nixcraft/vivek/blogger/2006/04/linux-bond-or-team-multiple-network.php<br />
Good, well written article describing the steps above.<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=24692&package_id=146474<br />
Documentation for bonding that can also be found in the kernel<br />
./Documentation/networking/bonding.txt<br />
<br />
<br />
<br />
TIP 229:<br />
<br />
/etc/nsswitch.conf - System Databases and Name Service Switch configuration file. <br />
<br />
This file determines lookup order of services. For example, to match a name<br />
to an IP address, an entry can be put into the /etc/hosts file. Or a DNS query<br />
can be made. What's the order? Normally, it's the entry in the /etc/hosts file.<br />
because /etc/nsswitch.conf contains the following setting<br />
<br />
hosts: files dns<br />
<br />
<br />
See man nsswitch.conf for more settings.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
THE FOLLOWING SECTIONS STARTS THE PROGRAMMING TIPS<br />
<br />
PROGRAMMING TIP 1:<br />
<br />
Simple open command that restarts the close if a signal<br />
occurs. Also note, the POSIX standards committee decided<br />
all new functions would not use errno and would instead<br />
directly return the error number in the function.<br />
<br />
A lot of functions return -1 on an error condition, then,<br />
set errno to the value of the error. This will still work<br />
for all the well known functions; but, it's changing.<br />
<br />
/* start of code open.c<br />
Compile gcc -o open open.c<br />
<br />
Reference (Look for simple_but_common_x.x.x.tar.gz):<br />
http://sourceforge.net/project/showfiles.php?group_id=79066<br />
<br />
*/<br />
#include <stdio.h><br />
#include <unistd.h><br />
#include <sys/types.h><br />
#include <sys/stat.h><br />
#include <fcntl.h><br />
#include <stdlib.h><br />
<br />
#include <string.h> /* for strerror(int errno) */<br />
#include <errno.h><br />
<br />
#define BUFLEN 100<br />
extern int errno;<br />
<br />
<br />
int<br />
main (void)<br />
{<br />
int fp,error;<br />
char buf[BUFLEN+1];<br />
<br />
if ((fp = open ("data", O_RDWR | O_CREAT, 0600)) == -1)<br />
{<br />
fprintf (stderr, "Can't open data: %s\n", strerror (errno));<br />
return 1;<br />
}<br />
<br />
snprintf (buf, BUFLEN, "123");<br />
write (fp, buf, strlen (buf));<br />
<br />
// Restart close should a signal occur */<br />
while((( error = close (fp) ) == -1) && (errno == EINTR));<br />
if(error == -1)<br />
perror("Failed to close the file\n");<br />
<br />
return 0;<br />
}<br />
/* end of open.c */<br />
<br />
<br />
<br />
PROGRAMMING TIP 2:<br />
<br />
Example of setting the effective UID on a file<br />
<br />
/* start of code<br />
gcc uid_open.c -o uid_open<br />
su<br />
chown root.chirico uid_open<br />
chmod u+s uid_open<br />
exit<br />
<br />
Now you can run this as chirico and write to the<br />
root directory<br />
<br />
<br />
*/<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <sys/types.h><br />
#include <sys/stat.h><br />
#include <fcntl.h><br />
#include <string.h><br />
#include <unistd.h><br />
<br />
<br />
int main()<br />
{<br />
int fd;<br />
<br />
if ((fd = open("/root/datajunk", O_RDWR | O_CREAT, 0600)) == -1) {<br />
fprintf(stderr, "Can't open file \n");<br />
return 1;<br />
}<br />
<br />
write(fd, "0123456", strlen("0123456"));<br />
close(fd);<br />
return 0;<br />
}<br />
<br />
/* end of code */<br />
<br />
<br />
<br />
PROGRAMMING TIP 3:<br />
<br />
Writing a C http post.<br />
<br />
For downloads reference:<br />
http://prdownloads.sourceforge.net/cpearls/spider.tar.gz?download<br />
<br />
<br />
<br />
PROGRAMMING TIP 4:<br />
<br />
Writing a 2.6.x Kernel Module:<br />
<br />
Look for the latest version of "procreadwrite". This is a 2.6 kernel<br />
modules that demonstrates how to create /proc entires and write directly<br />
to user-land via tty. It's updated to reflect replacement of "current->tty"<br />
with "current->signal->tty".<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=79066<br />
<br />
<br />
<br />
PROGRAMMING TIP 5:<br />
<br />
Creating a filename with '\n'. This goes with (TIP 71)<br />
<br />
/**** topen.c ***********************************************************<br />
Filenames can be created with any character except the null character<br />
and a slash.<br />
<br />
This example creates a file with returns '\n\n'<br />
<br />
There's a way to remove a file by inode:<br />
<br />
$ ls -libt *<br />
<br />
And, once you know the inode<br />
<br />
$ find . -inum <num> -exec mv '{}' goodstuff \;<br />
<br />
or<br />
<br />
$ find . -inum <num> -exec rm '{}' goodstuff \;<br />
<br />
or<br />
<br />
$ find . -inum <num> -exec cat '{}' \;<br />
<br />
<br />
<br />
Compile:<br />
<br />
gcc -o topen -Wall -W -O2 -s -pipe topen.c<br />
<br />
Reference:<br />
http://prdownloads.sourceforge.net/cpearls/simple_but_common_0.0.14.tar.gz?download<br />
<br />
*/<br />
#include <stdio.h><br />
#include <unistd.h><br />
#include <sys/types.h><br />
#include <sys/stat.h><br />
#include <fcntl.h><br />
#include <stdlib.h><br />
<br />
#include <string.h> /* for strerror(int errno) */<br />
#include <errno.h><br />
<br />
#define BUFLEN 100<br />
extern int errno;<br />
<br />
<br />
int<br />
main (void)<br />
{<br />
int fp,error;<br />
char buf[BUFLEN+1];<br />
<br />
if ((fp = open ("\n\n\n\n\n\n\n\n\n", O_RDWR | O_CREAT, 0600)) == -1)<br />
{<br />
fprintf (stderr, "Can't open data: %s\n", strerror (errno));<br />
return 1;<br />
}<br />
<br />
snprintf (buf, BUFLEN, "123");<br />
write (fp, buf, strlen (buf));<br />
<br />
// Restart close should a signal occur */<br />
while((( error = close (fp) ) == -1) && (errno == EINTR));<br />
if(error == -1)<br />
perror("Failed to close the file\n");<br />
<br />
return 0;<br />
<br />
}<br />
<br />
<br />
<br />
<br />
<br />
**Note, if you want email notification after every 50 new tips have been<br />
added, then, click on the following link:<br />
<br />
https://sourceforge.net/project/filemodule_monitor.php?filemodule_id=120838<br />
<br />
<br />
<br />
PROGRAMMING TIP 6:<br />
<br />
Working With The Lemon Parser Generator.<br />
http://prdownloads.sourceforge.net/souptonuts/lemon_examples.tar.gz?download<br />
<br />
<br />
PROGRAMMING TIP 7:<br />
<br />
copy command for std container output.<br />
<br />
#include <iostream><br />
#include <list><br />
#include <vector><br />
#include <iterator><br />
<br />
using namespace std;<br />
int main(void)<br />
{<br />
vector<int> v;<br />
list<int> l;<br />
<br />
v.push_back(1);<br />
v.push_back(2);<br />
copy(v.begin(),v.end(),ostream_iterator<int>(cout,"\n"));<br />
<br />
<br />
l.push_back(23);<br />
l.push_back(12);<br />
copy(l.begin(),l.end(),ostream_iterator<int>(cout,"\n"));<br />
<br />
}<br />
<br />
<br />
<br />
PROGRAMMING TIP 8:<br />
<br />
/* Copyright (c) 2005 Mike Chirico mchirico@comcast.net mchirico@users.sourceforge.net<br />
<br />
<br />
Example of using virtual functions. Note the use of "initialization lists"<br />
for assinging the variable first and last.<br />
<br />
Compile:<br />
g++ -o virtualfunc -Wall -W -O2 -s -pipe virtual_function.cc<br />
<br />
Download:<br />
http://prdownloads.sourceforge.net/cpearls/simple_but_common_cpp.tar.gz?download<br />
<br />
<br />
*/<br />
<br />
#include <iostream><br />
#include <string><br />
#include <list><br />
#include <algorithm><br />
#include <iterator><br />
#include <functional><br />
<br />
<br />
using namespace std;<br />
<br />
class Employee {<br />
string first,last;<br />
public:<br />
Employee(const string& fn="John",const string& ln="Smith"): first(fn),last(ln) {}<br />
virtual void print() const {<br />
cout << "First name: " << first << ", Last name: " << last << endl;<br />
}<br />
virtual ~Employee() {}<br />
};<br />
<br />
class Manager : public Employee {<br />
int level;<br />
list<Employee*> subordinates;<br />
public:<br />
Manager(const string& fn="Ivan",const string& ln="Stedwick", int lvl=1): Employee(fn,ln), level(lvl) {}<br />
void print() {<br />
cout << "Manager level: " << level << " ";<br />
Employee::print();<br />
cout << "Supervises:" << endl;<br />
for_each(subordinates.begin(),subordinates.end(),mem_fun(&Employee::print));<br />
cout << endl << endl;<br />
}<br />
void addstaff(Employee& staff){<br />
subordinates.push_front(&staff);<br />
}<br />
void addstaff(Employee* staff){<br />
subordinates.push_front(staff);<br />
}<br />
<br />
};<br />
<br />
<br />
int main()<br />
{<br />
Employee p0("Lisa","Payne");<br />
Manager m0;<br />
<br />
m0.addstaff(new Employee("Zoe","Bear")); /* uses void addstaff(Employee* staff) */<br />
m0.addstaff(new Employee("Leah","Bopper"));<br />
m0.addstaff(new Employee("Abby","Chicken"));<br />
m0.addstaff(p0); /* void addstaff(Employee& staff) needed for this one */<br />
m0.addstaff(new Employee());<br />
m0.print();<br />
<br />
<br />
return 0;<br />
}<br />
<br />
<br />
<br />
PROGRAMMING TIP 9:<br />
<br />
/* Named Constructor Idiom.<br />
Reference: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6<br />
<br />
*/<br />
#include <iostream><br />
#include <cmath><br />
using namespace std;<br />
<br />
class Point {<br />
<br />
public:<br />
static Point rectangular(float x, float y);<br />
static Point polar(float radius, float angle);<br />
float get_x() { return x_; }<br />
float get_y() { return y_; }<br />
<br />
private:<br />
Point(float x, float y);<br />
float x_, y_;<br />
};<br />
<br />
inline Point::Point(float x, float y)<br />
: x_(x), y_(y) {}<br />
<br />
inline Point Point::rectangular(float x, float y)<br />
{ return Point(x,y); }<br />
<br />
inline Point Point::polar(float radius, float angle)<br />
{ return Point(radius*cos(angle),radius*sin(angle)); }<br />
<br />
int main(void)<br />
{<br />
Point p1 = Point::rectangular(5.7,1.2);<br />
Point p2 = Point::polar(5.7,1.2);<br />
<br />
cout << "(" << p1.get_x() << ", " << p1.get_y() << ")" << endl;<br />
cout << "(" << p2.get_x() << ", " << p2.get_y() << ")" << endl;<br />
}<br />
<br />
<br />
PROGRAMMING TIP 10:<br />
<br />
/* Copy_constructor_assignment.cc<br />
Copyright (c) 2004 GPL Mike Chirico, mchirico@comcast.net or mchirico@users.sourceforge.net<br />
<br />
Reference: "The C++ Programming Language", 3rd ed, by Stroustrup<br />
pg. 246.<br />
<br />
<br />
Download:<br />
http://prdownloads.sourceforge.net/cpearls/simple_but_common.tar.gz?download<br />
<br />
*/<br />
<br />
<br />
#include <iostream><br />
<br />
<br />
class Name {<br />
public:<br />
char* s;<br />
};<br />
<br />
<br />
class Table {<br />
Name *p;<br />
size_t sz;<br />
public:<br />
Table(size_t s=15) {<br />
p = new Name[sz=s];<br />
for(size_t i=0; i< sz; ++i) p[i].s="****";<br />
}<br />
Table(const Table &t);<br />
Table& operator=(const Table&);<br />
int prt();<br />
void asgn(char* ts,size_t index);<br />
~Table(){ delete[] p; }<br />
};<br />
<br />
<br />
<br />
Table& Table::operator=(const Table &t)<br />
{<br />
if( this != &t) {<br />
delete[] p;<br />
p = new Name[sz=t.sz];<br />
for(size_t i=0; i< t.sz; ++i) p[i]=t.p[i];<br />
}<br />
return *this;<br />
}<br />
<br />
int Table::prt()<br />
{<br />
for(size_t i=0; i< sz; ++i) std::cout << p[i].s << " ";<br />
std::cout << std::endl;<br />
return 0;<br />
}<br />
<br />
/*<br />
asgn will increase the array of strings, if needed<br />
to size index+1, and add the string ts to position<br />
index.<br />
*/<br />
void Table::asgn(char* ts,size_t index)<br />
{<br />
if(index < sz ) {<br />
p[index].s=ts;<br />
}else if ( index >= sz ){<br />
Name *tp;<br />
tp=p;<br />
<br />
p = new Name[index+1];<br />
<br />
for(size_t i=0; i< sz; ++i) p[i].s=tp[i].s;<br />
delete [] tp;<br />
for(size_t i=sz; i < index; ++i)p[i].s="****";<br />
<br />
p[index].s=ts;<br />
sz=index+1;<br />
}<br />
<br />
}<br />
<br />
int main(void)<br />
{<br />
<br />
Table t1;<br />
Table t2(5);<br />
<br />
// this is bigger than initial sz<br />
t1.asgn("myname",20);<br />
t1.prt();<br />
t2.prt();<br />
<br />
t1=t2;<br />
<br />
t1.prt();<br />
t2.prt();<br />
}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
REFERENCES:<br />
<br />
(1) http://www.tldp.org/LDP/abs/html/index.html<br />
(2) http://www.shelldorado.com/<br />
(3) http://www.faqs.org/ftp/usenet/news.answers/unix-faq/faq/part1<br />
(4) http://www-106.ibm.com/developerworks/library/l-rpm1/<br />
(5) http://www-136.ibm.com/developerworks/linux/<br />
(6) http://www.gnu.org/manual/manual.html<br />
(7) http://fedora.redhat.com/<br />
(8) http://souptonuts.sourceforge.net/chirico/index.php<br />
(9) http://www.faqs.org/faqs/<br />
(10) http://www.faqs.org/docs/linux_network/<br />
(11) http://www.tml.hut.fi/~viu/linux/sag/sag-0.6.2.html/index.html<br />
(12) http://www.yolinux.com/TUTORIALS/LinuxTutorialSysAdmin.html<br />
(13) http://sed.sourceforge.net/grabbag/scripts/<br />
<br />
<br />
SUMMARY:<br />
(1)(2)(3) Excellent resource for bash scripts.<br />
(4) rpm resource<br />
(6) GNU Manuals Online<br />
(7) Fedora<br />
(8) Authors Website<br />
(11)(12) System Admin<br />
(13) Excellent source of sed scripts<br />
<br />
<br />
HIGHLY RECOMMENDED BOOKS:<br />
<br />
"UNIX Network Programming, The Sockets Networking API", Volume 1, Third Edition.<br />
W. Richard Stevens, Bill Fenner, Andrew M. Rudoff.<br />
<br />
"UNIX Network Programming, Interprocess Communications", Volume 2, Second Edition.<br />
W. Richard Stevens.<br />
<br />
"UNIX SYSTEMS Programming, Communication, Concurrency, and Threads", Kay A. Robbins,<br />
Steven Robbins<br />
<br />
"Programming with POSIX Threads", David R. Butenhof. Addison-Wesley<br />
<br />
"The C++ Programming Language" Third Edition. Bjarne Stroustrup. Addison-Wesley.<br />
<br />
"C Programming Language" (2nd Edition), Second Edition, Kernighan and Ritchie<br />
<br />
"Advanced Linux Programming" by Mark Mitchell, Jeffrey Oldham, and Alex Samuel, of<br />
CodeSourcery LL. This book if free at the following resource:<br />
http://www.advancedlinuxprogramming.com/<br />
<br />
"Accelerated C++, Practical Programming by Example" Andrew Koenig, Barbara E. Moo.<br />
Addison-Wesley.<br />
<br />
"C: A Reference Manual", Fifth Edition, Samuel P. Harbison, Guy L. Steele.<br />
<br />
"C++ Standard Library: A Tutorial and Reference, The", Nicolai M. Josuttis. Addison Wesley.<br />
<br />
"C++ Templates: The Complete Guide", David Vandevoorde, Nicolai M. Josuttis. Addison Wesley.<br />
<br />
"Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions", Herb Sutter.<br />
Addison Wesley.<br />
<br />
"More Exceptional C++", Herb Sutter.<br />
<br />
"Exceptional C++ Style: 40 New Engineering Puzzles, Programming Problems, and Solutions",<br />
Herb Sutter. Addison Wesley.<br />
<br />
"The Art of Computer Programming (TAOCP)", Vol 1,Vol 2, Vol 3. Donald E. Knuth. Addison-Wesley.<br />
<br />
"Programming Perl, 3rd Edition", Tom Christiansen, Jon Orwant, Larry Wall. O'Reilly.<br />
http://www.unix.org.ua/orelly/perl/prog3/<br />
<br />
"Programming from the Ground Up", Jonathan Bartlett, Edited by Dominick Bruno, Jr.<br />
http://savannah.nongnu.org/download/pgubook/<br />
<br />
"Expert C Programming", Peter van der Linden, Prentice Hall PTR.<br />
<br />
<br />
"C++ Coding Standards 101 Rules, Guidelines, and Best Practices", by Herb Sutter and<br />
Andrei Alexandrescu. http://www.gotw.ca/publications/c++cs/bibliography.htm<br />
<br />
"Linux Kernel Development: A practical guide to the design and implementation of<br />
the Linux kernel", by Robert Love, Sams Publishing.<br />
<br />
"C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond", by<br />
David Abrahams and Aleksey Gurtovoy. Addison Wesley.<br />
<br />
<br />
<br />
HIGHLY RECOMMENDED: PHILOSOPHICAL<br />
<br />
"Zen and the Art of Motorcycle Maintenance: An Inquiry into Values", Robert Pirsig.<br />
http://www.virtualschool.edu/mon/Quality/PirsigZen/index.html<br />
<br />
"Lila: An Inquiry Into Morals", Robert Pirsig.<br />
<br />
<br />
<br />
RECOMMENDED BOOKS:<br />
<br />
"Structure and Interpretation of Computer Programs", Harold Abelson, Gerald Jay Sussman,<br />
Julie Sussman. This book is free:<br />
http://mitpress.mit.edu/sicp/full-text/book/book.html<br />
and<br />
http://www.gnu.org/software/mit-scheme/<br />
<br />
<br />
RECOMMENDED HOTOS:<br />
<br />
Linux Networking-HOWTO (Previously the Net-3 Howto)<br />
http://en.tldp.org/HOWTO/NET3-4-HOWTO.html<br />
<br />
<br />
<br />
<br />
<br />
<br />
CORRECTIONS:<br />
<br />
<br />
The following people made suggestions and corrections:<br />
- Jorge Fabregas <fabregasj@prtc.net> TIP 21<br />
- Malcolm Parsons <malcolm.parsons@gmail.com> TIP 44<br />
- Andreas Haunschmidt <Andreas.Haunschmidt@utanet.at> TIP 102, TIP 90<br />
- P@draigBrady.com (Following links )<br />
- Jacques.GARNIER-EXTERIEUR@EU.RHODIA.COM TIP 46<br />
<br />
http://www.pixelbeat.org/cmdline.html<br />
http://www.pixelbeat.org/rotagator/linux.tips/rotagator.fortune<br />
http://www.pixelbeat.org/scripts/<br />
<br />
- Tobias Nix <tobias.nix@gmail.com> TIP 12<br />
<br />
<br />
<br />
<br />
</nowiki></pre></div>WikiSysophttps://wiki.gacq.com/index.php?title=Debian&diff=2777Debian2009-01-11T14:54:52Z<p>WikiSysop: Revertidas las ediciones realizadas por TabocAbovi (Talk); a la última edición de Gacq</p>
<hr />
<div>=Configuration=<br />
==sources.list sample==<br />
/etc/apt/sources.list<br />
<pre><nowiki><br />
deb http://server:80/apt-cacher/mirrors.kernel.org/debian/ testing main contrib non-free<br />
deb http://server:80/apt-cacher/mirrors.kernel.org/debian/ unstable main contrib non-free<br />
deb http://server:80/apt-cacher/security.debian.org/ testing/updates main contrib non-free<br />
deb http://server:80/apt-cacher/www.debian-multimedia.org/ testing main<br />
deb http://server:80/apt-cacher/www.debian-multimedia.org/ sid main<br />
</nowiki></pre><br />
<br />
apt-get update<br />
apt-get install debian-multimedia-keyring<br />
<br />
==Missing GPG key 07DC563D1F41B907 error==<br />
'''Error message'''<br />
<pre><nowiki><br />
W: GPG error: http://gacq.com testing Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 07DC563D1F41B907<br />
W: You may want to run apt-get update to correct these problems<br />
</nowiki></pre><br />
<br />
;fix it running<br />
apt-get install debian-multimedia-keyring<br />
<br />
;with other keys<br />
gpg --keyserver subkeys.pgp.net --recv-keys A70DAF536070D3A1<br />
gpg --export --armor A70DAF536070D3A1 | apt-key add -<br />
<br />
==Set Default Release to older== <br />
/etc/apt/apt.conf<br />
<pre><nowiki><br />
APT::Default-Release "testing";<br />
</nowiki></pre><br />
<br />
==Using a proxy==<br />
Agregar a /etc/apt/apt.conf<br />
<br />
<pre><nowiki><br />
Acquire::http::Proxy "http://proxy.uolfast.com.ar:80";<br />
</nowiki></pre><br />
<br />
==Using APT with more than 2 sources==<br />
<br />
APT's Default-Release setting (aka apt-get --target-release) is useful if your /etc/apt/sources.list file contains exactly 2 releases (such as stable and testing, or testing and unstable). If you want to track more than 2 releases (stable, testing, and unstable, or two of those plus a non-Debian source), it has problems. This document explains how to do better. Updates can be found at http://www.argon.org/~roderick/apt-pinning.html. <br />
<br />
Say you've got testing and unstable in your sources.list, an APT::Default-Release of "testing" in apt.conf<br />
<br />
=APT caches=<br />
==apt-cacher==<br />
<pre><nowiki><br />
apt-get install apt-cacher<br />
</nowiki></pre><br />
<br />
*http://bulma.net/impresion.phtml?nIdNoticia=1915<br />
<br />
=Misc=<br />
==Show package executables==<br />
<pre><nowiki><br />
for i in `dpkg -L xmms`; do if [ -x $i ] && [ ! -d $i ]; then ls -l $i; fi; done<br />
</nowiki></pre><br />
<br />
=Corruptions=<br />
*http://www.debianhelp.co.uk/debianproblem.htm<br />
<br />
=Installation=<br />
Cuando estamos instalando sobre hardware nuevo podemos usar estas versiones del instalador modificadas:<br />
*[http://kmuto.jp/debian/d-i/ Backported d-i images archive]<br />
<br />
=Upgrades=<br />
*[[Debian Sarge (oldstable) to Etch (stable) dist-upgrade]]<br />
<br />
==Errors==<br />
===No common CD-ROM drive was detected.===<br />
SATA driver can block access to CD drive in installations from CD. On systems having a SATA IDE controller that also has the CD drive connected to it, you may see the installer hanging during hardware detection for the CD drive or failing to read the CD just afterwards. A possible reason is that the SATA driver (ata_piix and maybe others) is blocking access to the CD drive.<br />
You can try to work around this by booting the installer in expert mode and, in the "Detect and mount CD-ROM" step, selecting only the drivers needed for CD support. These are (ide-)generic, ide-cd and isofs.<br />
The drivers needed to access the disk will still be loaded, but at a later stage. By loading the CD drivers before the SATA driver in this way, you may be able to complete the installation. Note that CD-ROM access may still be an issue after rebooting into the installed system.<br />
<br />
<br />
==Instalando desde un drive USB==<br />
wget http://ftp.debian.org/debian/dists/testing/main/installer-i386/current/images/hd-media/boot.img.gz<br />
gzip -dc boot.img.gz >/dev/sdX<br />
init 6<br />
<br />
=Repositorios=<br />
<br />
/etc/apt/apt.conf<br />
[..]<br />
APT::Default-Release "testing";<br />
<br />
<br />
<br />
*[http://www.apt-get.org Unofficial APT repositories]<br />
<br />
*[http://www.freesoftwaremagazine.com/free_issues/issue_10/jump_to_debian/ A guide to why the Debian distro is a good choice]<br />
<br />
= Automatix para Etch =<br />
Este programa automatiza la instalación de muchas y muy útiles aplicaciones en la vida diaria de un usuario normal. Las características más importantes del programa son:<br />
<br />
*Códecs de audio y vídeo más comunes<br />
*Plugins más comunes para navegadores(Java, Flash, ...), fuentes TrueType.<br />
*Herramientas adicionales de empaquetamiento (rar y ace)<br />
*Adobe Reader y plugins del Firefox<br />
*Software de grabación de CD/DVD GnomeBaker<br />
*Instala clientes FTP para GNOME con SSH<br />
*Instala audio (Audacity) y video (Kino) y editores ID3 TAG (Easytag)<br />
*Instala ripeador de DVD (dvdrip)<br />
*Instala los plugins multimedia para Firefox y Mplayer<br />
*Instala Totem-xine y Beep Media Player (con docklet)<br />
*Habilita el menú Debian<br />
*Instala Azureus, Bittornado, Avidemux, Sun 1.5 JRE, Wine...<br />
*Herramientas de programación como Anjuta (C/C++ IDE)<br />
<br />
*http://debcentral.org/downloads/apps/dcconfig_0.4-3_i386.deb</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2734Installing Debian on Dell M12102009-01-05T03:43:32Z<p>WikiSysop: Deshecha la edición 2727 de SitboLipas (disc.)</p>
<hr />
<div>[[Imagen:XPS-foto.jpg|right]]<br />
'''My laptop was stolen :( Unmaintained page from June 2007'''<br />
<br />
'''Now mainteined by me!. This guide is really usefull!...''' --[[Usuario:Yaco|Yaco]] 19:52 19 dic 2007 (ART) <br />
<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || driver linux-uvc only support V4L2<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:green" | Works ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || working for other people<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || working for other people<br />
|-<br />
! S-Video output || style="background:green" | Works ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:green" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:green" | Works || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
=Specifications=<br />
*Dell XPS M1210 Laptop - AR$ 5.200 (1.700 U$S) - July 2006<br />
**Intel Core 2 Duo Processor T2300 @ 1.66GHz<br />
**1GB of Dual Channel DDR2 memory<br />
**12.1" Widescreen WXGA (1280 x 800) display with TrueLife<br />
**256MB NVIDIA GeForceTM Go 7400 TurboCache<br />
**60GB 5400RPM SATA hard drive<br />
**8x DVD/CD Burner (DVD+/-RW)<br />
**Webcam<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build - Kernel source from sid<br />
<br />
==Detected by preinstaled windows (the last words of)==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=Base installation=<br />
;Debian GNU/Linux Lenny (testing) Daily Build Debian Installer<br />
Kernel built in module for lan interface does not work, I used an old Etch (testing) net installer<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Free drivers (nv)==<br />
;Installed during xserver installation<br />
<br />
==Proprietary drivers (nvidia)==<br />
;Only for 3D acceleration and other advanced features, if not use free driver, you'll feel better.<br />
<br />
===Installation===<br />
apt-get install nvidia-kernel-2.6.18-4-686 nvidia-glx nvidia-settings nvidia-xconfig<br />
<br />
==Configuration==<br />
===Automatic===<br />
nvidia-xconfig<br />
<br />
===Manually===<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
apt-get install firmware-ipw3945 ipw3945d ipw3945-modules-`uname -r`<br />
<br />
;Optional<br />
apt-get install network-manager<br />
<br />
network-manager-gnome requires users to be in the group 'netdev' for it to work. If users aren't in the group 'netdev' then it won't automatically appear, and work, in the Notification Area.<br />
<br />
If you're looking for a manual installation procedure see the [[ipw3945 driver manual installation for Debian Etch]]<br />
<br />
=WebCam - Only work with v4l2=<br />
==Manual==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
<br />
==Using packages (not working?)==<br />
apt-get install linux-uvc-source libpt-plugins-v4l2<br />
m-a prepare<br />
m-a a-i linux-uvc<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
<br />
==Testing Webcam==<br />
<br />
===Using Mplayer===<br />
Just run this and you should see the webcam image:<br />
$ mplayer -v tv:// -tv device=/dev/video0:driver=v4l2:outfmt=yuy2 -vc rawyuy2 -fps 15 -vo x11<br />
===Using Luvcview===<br />
Using luvcview we can take pics and record video.<br />
<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20070512.tar.gz<br />
tar -xvf luvcview-20070512.tar.gz<br />
cd luvcview-20070512<br />
make<br />
sudo make install<br />
luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
Now you can use the buttons (a bit ugly) or the following hotkeys while running the program:<br />
<br />
*'''n''' -> BRIGHTNESS UP<br />
*'''b''' -> BRIGHTNESS DOWN<br />
*'''x''' -> CONTRAST UP<br />
*'''w''' -> CONTRAST DOWN<br />
*'''c''' -> SATURATION UP<br />
*'''v''' -> SATURATION DOWN<br />
*'''z''' -> GAIN UP<br />
*'''a''' -> GAIN DOWN<br />
*'''r''' -> SHARPNESS UP<br />
*'''e''' -> SHARPNESS DOWN<br />
*'''s''' -> SCREENSHOT<br />
*'''p''' -> RECORD A VIDEO<br />
*'''l''' -> RESET<br />
*'''q''' -> QUIT<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=Frontal multimedia buttons=<br />
Configure the frontal buttons using [http://lineak.sourceforge.net/ LineAK].<br />
apt-get install lineak<br />
<br />
Then you should add button configurations in '''/etc/lineakd.def'''. Add the following lines to the end of the file:<br />
<br />
# Dell XPS M1210<br />
[DXPS]<br />
brandname = "Laptop/notebook"<br />
odelname = "Dell XPS and Inspiron 9100"<br />
[KEYS]<br />
Play = 162<br />
Previous = 144<br />
Next = 153<br />
Stop = 164<br />
VolumeUp = 176<br />
VolumeDown = 174<br />
Mute = 160<br />
[END KEYS]<br />
[END DXPS]<br />
# end Dell XPS/I9100 Laptop<br />
<br />
Now do:<br />
<br />
$ lineakd -c DXPS<br />
<br />
Then you can attach a command to the different buttons. Make your changes in '''$HOME/.lineakd/lineakd.conf'''. This is just an example using Amarok (media player) and Aumix for volume control:<br />
<br />
Mute = "aumix -v 0"<br />
Next = "amarok -f"<br />
Play = "amarok -t"<br />
Previous = "amarok -r"<br />
Stop = "amarok -s"<br />
VolumeDown = "aumix -v -5"<br />
VolumeUp = "aumix -v +5"<br />
<br />
Finally, you have to run the lineak daemon:<br />
<br />
$ lineakd&<br />
<br />
Add this to any start script (like .xinitrc) to run it on start up.<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
*[http://criadoindomable.wordpress.com/2008/01/09/modem-para-las-dell-inspiron-en-ubuntu-710/ Modem para las Dell Inspiron en Ubuntu 7.10]<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://www.centre-cired.fr/forum/article441.html<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]<br />
<br />
==Others==<br />
*[http://mundogeek.net/archivos/2007/04/23/temperatura-de-portatiles-dell-en-ubuntu/ Temperatura de portátiles Dell en Ubuntu]<br />
*[http://mundogeek.net/archivos/2007/04/23/desactivar-touchpad-mientras-se-escribe-en-linux/ Desactivar touchpad mientras se escribe en Linux]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2733Installing Debian on Dell M12102009-01-05T03:42:12Z<p>WikiSysop: Revertidas las ediciones realizadas por EltelTsitr (Talk); a la última edición de SitboLipas</p>
<hr />
<div>elalric<br />
[[Imagen:XPS-foto.jpg|right]]<br />
'''My laptop was stolen :( Unmaintained page from June 2007'''<br />
<br />
'''Now mainteined by me!. This guide is really usefull!...''' --[[Usuario:Yaco|Yaco]] 19:52 19 dic 2007 (ART) <br />
<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || driver linux-uvc only support V4L2<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:green" | Works ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || working for other people<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || working for other people<br />
|-<br />
! S-Video output || style="background:green" | Works ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:green" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:green" | Works || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
=Specifications=<br />
*Dell XPS M1210 Laptop - AR$ 5.200 (1.700 U$S) - July 2006<br />
**Intel Core 2 Duo Processor T2300 @ 1.66GHz<br />
**1GB of Dual Channel DDR2 memory<br />
**12.1" Widescreen WXGA (1280 x 800) display with TrueLife<br />
**256MB NVIDIA GeForceTM Go 7400 TurboCache<br />
**60GB 5400RPM SATA hard drive<br />
**8x DVD/CD Burner (DVD+/-RW)<br />
**Webcam<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build - Kernel source from sid<br />
<br />
==Detected by preinstaled windows (the last words of)==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=Base installation=<br />
;Debian GNU/Linux Lenny (testing) Daily Build Debian Installer<br />
Kernel built in module for lan interface does not work, I used an old Etch (testing) net installer<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Free drivers (nv)==<br />
;Installed during xserver installation<br />
<br />
==Proprietary drivers (nvidia)==<br />
;Only for 3D acceleration and other advanced features, if not use free driver, you'll feel better.<br />
<br />
===Installation===<br />
apt-get install nvidia-kernel-2.6.18-4-686 nvidia-glx nvidia-settings nvidia-xconfig<br />
<br />
==Configuration==<br />
===Automatic===<br />
nvidia-xconfig<br />
<br />
===Manually===<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
apt-get install firmware-ipw3945 ipw3945d ipw3945-modules-`uname -r`<br />
<br />
;Optional<br />
apt-get install network-manager<br />
<br />
network-manager-gnome requires users to be in the group 'netdev' for it to work. If users aren't in the group 'netdev' then it won't automatically appear, and work, in the Notification Area.<br />
<br />
If you're looking for a manual installation procedure see the [[ipw3945 driver manual installation for Debian Etch]]<br />
<br />
=WebCam - Only work with v4l2=<br />
==Manual==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
<br />
==Using packages (not working?)==<br />
apt-get install linux-uvc-source libpt-plugins-v4l2<br />
m-a prepare<br />
m-a a-i linux-uvc<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
<br />
==Testing Webcam==<br />
<br />
===Using Mplayer===<br />
Just run this and you should see the webcam image:<br />
$ mplayer -v tv:// -tv device=/dev/video0:driver=v4l2:outfmt=yuy2 -vc rawyuy2 -fps 15 -vo x11<br />
===Using Luvcview===<br />
Using luvcview we can take pics and record video.<br />
<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20070512.tar.gz<br />
tar -xvf luvcview-20070512.tar.gz<br />
cd luvcview-20070512<br />
make<br />
sudo make install<br />
luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
Now you can use the buttons (a bit ugly) or the following hotkeys while running the program:<br />
<br />
*'''n''' -> BRIGHTNESS UP<br />
*'''b''' -> BRIGHTNESS DOWN<br />
*'''x''' -> CONTRAST UP<br />
*'''w''' -> CONTRAST DOWN<br />
*'''c''' -> SATURATION UP<br />
*'''v''' -> SATURATION DOWN<br />
*'''z''' -> GAIN UP<br />
*'''a''' -> GAIN DOWN<br />
*'''r''' -> SHARPNESS UP<br />
*'''e''' -> SHARPNESS DOWN<br />
*'''s''' -> SCREENSHOT<br />
*'''p''' -> RECORD A VIDEO<br />
*'''l''' -> RESET<br />
*'''q''' -> QUIT<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=Frontal multimedia buttons=<br />
Configure the frontal buttons using [http://lineak.sourceforge.net/ LineAK].<br />
apt-get install lineak<br />
<br />
Then you should add button configurations in '''/etc/lineakd.def'''. Add the following lines to the end of the file:<br />
<br />
# Dell XPS M1210<br />
[DXPS]<br />
brandname = "Laptop/notebook"<br />
odelname = "Dell XPS and Inspiron 9100"<br />
[KEYS]<br />
Play = 162<br />
Previous = 144<br />
Next = 153<br />
Stop = 164<br />
VolumeUp = 176<br />
VolumeDown = 174<br />
Mute = 160<br />
[END KEYS]<br />
[END DXPS]<br />
# end Dell XPS/I9100 Laptop<br />
<br />
Now do:<br />
<br />
$ lineakd -c DXPS<br />
<br />
Then you can attach a command to the different buttons. Make your changes in '''$HOME/.lineakd/lineakd.conf'''. This is just an example using Amarok (media player) and Aumix for volume control:<br />
<br />
Mute = "aumix -v 0"<br />
Next = "amarok -f"<br />
Play = "amarok -t"<br />
Previous = "amarok -r"<br />
Stop = "amarok -s"<br />
VolumeDown = "aumix -v -5"<br />
VolumeUp = "aumix -v +5"<br />
<br />
Finally, you have to run the lineak daemon:<br />
<br />
$ lineakd&<br />
<br />
Add this to any start script (like .xinitrc) to run it on start up.<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
*[http://criadoindomable.wordpress.com/2008/01/09/modem-para-las-dell-inspiron-en-ubuntu-710/ Modem para las Dell Inspiron en Ubuntu 7.10]<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://www.centre-cired.fr/forum/article441.html<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]<br />
<br />
==Others==<br />
*[http://mundogeek.net/archivos/2007/04/23/temperatura-de-portatiles-dell-en-ubuntu/ Temperatura de portátiles Dell en Ubuntu]<br />
*[http://mundogeek.net/archivos/2007/04/23/desactivar-touchpad-mientras-se-escribe-en-linux/ Desactivar touchpad mientras se escribe en Linux]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Linux_tips&diff=2731Linux tips2008-12-31T15:00:52Z<p>WikiSysop: Revertidas las ediciones realizadas por C4tboCcdro (Talk); a la última edición de Gacq</p>
<hr />
<div><pre><nowiki><br />
Mike Chirico (mchirico@users.sourceforge.net) or (mchirico@comcast.net)<br />
Copyright (C) 2004 (GNU Free Documentation License)<br />
Last Updated: Thu Dec 28 16:42:50 EST 2006<br />
<br />
The latest version of this document can be found at:<br />
http://souptonuts.sourceforge.net/how_to_linux_and_open_source.htm<br />
or text version ( if you have trouble downloading the full document: over 140 pages )<br />
http://prdownloads.sourceforge.net/souptonuts/How_to_Linux_and_Open_Source.txt?download<br />
<br />
<br />
<br />
<br />
For tips on Gmail with Postix and Fetchmail<br />
http://souptonuts.sourceforge.net/postfix_tutorial.html<br />
<br />
For tips on using SQLite (over 25 pages)<br />
http://prdownloads.sourceforge.net/souptonuts/README_sqlite_tutorial.html?download<br />
<br />
<br />
For tips on MySQL reference:<br />
http://prdownloads.sourceforge.net/souptonuts/README_mysql.txt?download<br />
<br />
<br />
For a recommended reading list<br />
http://prdownloads.sourceforge.net/souptonuts/Recommended_Reading.html?download<br />
<br />
<br />
For tips on upgrading RedHat 9 or 8.0 to 2.6.x src kernel<br />
http://prdownloads.sourceforge.net/souptonuts/README_26.txt?download<br />
<br />
<br />
For tips on Comcast Email with Home Linux Box<br />
http://prdownloads.sourceforge.net/souptonuts/README_COMCAST_EMAIL.txt?download<br />
<br />
<br />
<br />
**Note, if you want email notification after every 50 new tips have been<br />
added, then, click on the following link:<br />
https://sourceforge.net/project/filemodule_monitor.php?filemodule_id=120838<br />
<br />
<br />
<br />
TIP 1:<br />
<br />
Is NTP Working?<br />
<br />
STEP 1 (Test the current server):<br />
<br />
Try issuing the following command:<br />
<br />
$ ntpq -pn<br />
<br />
remote refid st t when poll reach delay offset jitter<br />
===================================================<br />
tock.usno.navy 0.0.0.0 16 u - 64 0 0.000 0.000 4000.00<br />
<br />
The above is an example of a problem.<br />
Compare it to a working configuration.<br />
<br />
$ ntpq -pn<br />
<br />
remote refid st t when poll reach delay offset jitter<br />
========================================================<br />
+128.4.40.12 128.4.40.10 2 u 107 128 377 25.642 3.350 1.012<br />
127.127.1.0 127.127.1.0 10 l 40 64 377 0.000 0.000 0.008<br />
+128.91.2.13 128.4.40.12 3 u 34 128 377 21.138 6.118 0.398<br />
*192.5.41.41 .USNO. 1 u 110 128 377 33.69 9.533 3.534<br />
<br />
STEP 2 (Configure the /etc/ntp.conf):<br />
<br />
$ cat /etc/ntp.conf<br />
<br />
# My simple client-only ntp configuration.<br />
server timeserver1.upenn.edu<br />
# ping -a timeserver1.upenn.edu shows the IP address 128.91.2.13<br />
# which is used in the restrict below<br />
restrict 128.91.2.13<br />
server tock.usno.navy.mil<br />
restrict 192.5.41.41<br />
server 128.4.40.12<br />
restrict 128.4.40.12<br />
server 127.127.1.0 # local clock<br />
fudge 127.127.1.0 stratum 10<br />
driftfile /etc/ntp/drift<br />
restrict default ignore<br />
restrict 127.0.0.0 mask 255.0.0.0<br />
authenticate no<br />
<br />
STEP 3 (Configure /etc/ntp/step-tickers):<br />
<br />
The values for server above are placed in the "/etc/ntp/step-tickers" file<br />
<br />
$ cat /etc/ntp/step-tickers<br />
<br />
timeserver1.upenn.edu<br />
tock.usno.navy.mil<br />
128.4.40.12<br />
<br />
The startup script /etc/rc.d/init.d/ntpd will grab the servers in this<br />
file and execute the ntpdate command as follows:<br />
<br />
/usr/sbin/ntpdate -s -b -p 8 timeserver1.upenn.edu<br />
<br />
Why? Because if the time is off ntpd will not start. The command above set the<br />
clock. If System Time deviates from true time by more than 1000 seconds, then,<br />
the ntpd daemon will enter panic mode and exit.<br />
<br />
STEP 4 (Restart the service and check):<br />
<br />
Issue the restart command<br />
<br />
/etc/init.d/ntpd restart<br />
<br />
check the values for "ntpq -pn",<br />
which should match step 1.<br />
<br />
ntpq -pn<br />
<br />
SPECIAL NOTE:<br />
<br />
Time is always stored in the kernel as the number of seconds since<br />
midnight of the 1st of January 1970 UTC, regardless of whether the<br />
hardware clock is stored as UTC or not. Conversions to local time<br />
are done at run-time. So, it's easy to get the time in different<br />
timezones for only the current session as follows:<br />
<br />
<br />
$ export TZ=EST<br />
$ date<br />
Mon Aug 2 10:34:04 EST 2004<br />
<br />
$ export TZ=NET<br />
$ date<br />
Mon Aug 2 15:34:18 NET 2004<br />
<br />
The following are possible values for TZ:<br />
<br />
Hours From Greenwich Mean Time (GMT) Value Description<br />
0 GMT Greenwich Mean Time<br />
+1 ECT European Central Time<br />
+2 EET European Eastern Time<br />
+2 ART<br />
+3 EAT Saudi Arabia<br />
+3.5 MET Iran<br />
+4 NET<br />
+5 PLT West Asia<br />
+5.5 IST India<br />
+6 BST Central Asia<br />
+7 VST Bangkok<br />
+8 CTT China<br />
+9 JST Japan<br />
+9.5 ACT Central Australia<br />
+10 AET Eastern Australia<br />
+11 SST Central Pacific<br />
+12 NST New Zealand<br />
-11 MIT Samoa<br />
-10 HST Hawaii<br />
-9 AST Alaska<br />
-8 PST Pacific Standard Time<br />
-7 PNT Arizona<br />
-7 MST Mountain Standard Time<br />
-6 CST Central Standard Time<br />
-5 EST Eastern Standard Time<br />
-5 IET Indiana East<br />
-4 PRT Atlantic Standard Time<br />
-3.5 CNT Newfoundland<br />
-3 AGT Eastern South America<br />
-3 BET Eastern South America<br />
-1 CAT Azores<br />
<br />
DST timezone<br />
<br />
<br />
0 BST for British Summer.<br />
+400 ADT for Atlantic Daylight.<br />
+500 EDT for Eastern Daylight.<br />
+600 CDT for Central Daylight.<br />
+700 MDT for Mountain Daylight.<br />
+800 PDT for Pacific Daylight.<br />
+900 YDT for Yukon Daylight.<br />
+1000 HDT for Hawaii Daylight.<br />
-100 MEST for Middle European Summer,<br />
MESZ for Middle European Summer,<br />
SST for Swedish Summer and FST for French Summer.<br />
-700 WADT for West Australian Daylight.<br />
-1000 EADT for Eastern Australian Daylight.<br />
-1200 NZDT for New Zealand Daylight.<br />
<br />
The following is an example of setting the TZ environment variable<br />
for the timezone, only when timezone changes go into effect.<br />
<br />
$ export TZ=EST+5EDT,M4.1.0/2,M10.5.0/2<br />
<br />
Take a look at the last line "M10.5.0/2". What does it mean? Here is the<br />
documentation<br />
<br />
<br />
Mm.w.d This specifies day d (0 <= d <= 6) of week w (1 <= w <= 5) of<br />
month m (1 <= m <= 12). Week 1 is the first week in which day d<br />
occurs and week 5 is the last week in which day d occurs. Day 0<br />
is a Sunday.<br />
<br />
The time fields specify when, in the local time currently in<br />
effect, the change to the other time occurs. If omitted,<br />
the default is 02:00:00.<br />
<br />
So this is what it means. M10 stands for October, the 5 is the fifth week<br />
that includes a Sunday (note 0 in M10.5.0/2 is Sunday). To see that it is<br />
the fifth week see the calendar below. The time change occurs a 2am in<br />
the morning.<br />
<br />
October<br />
Su Mo Tu We Th Fr Sa<br />
1 2<br />
3 4 5 6 7 8 9<br />
10 11 12 13 14 15 16<br />
17 18 19 20 21 22 23<br />
24 25 26 27 28 29 30<br />
31<br />
<br />
Prove it. Take the following program sunrise, which can calcuates sunrise<br />
and sunset for an latitude and longitude. This program can be downloaded<br />
from the following location:<br />
http://sourceforge.net/direct-dl/mchirico/souptonuts/working_with_time.tar.gz<br />
<br />
Below is a bash script that will run the program for the next 100 days.<br />
<br />
#!/bin/bash<br />
# program: next100days Mike Chirico<br />
# download:<br />
# http://sourceforge.net/direct-dl/mchirico/souptonuts/working_with_time.tar.gz<br />
#<br />
# This will calculate the sunrise and sunset for<br />
# latitude 39.95 Note must convert to degrees<br />
# longitude 75.15 Note must convert to degrees<br />
lat=39.95<br />
long=75.15<br />
for (( i=0; i <= 100; i++))<br />
do<br />
sunrise `date -d "+$i day" "+%Y %m %d"` $lat $long<br />
done<br />
<br />
Take a look at the following sample output.<br />
<br />
$ export TZ=EST+5EDT,M4.1.0/2,M10.5.0/2<br />
$ ./next100days<br />
<br />
Sunrise 08-24-2004 06:21:12 Sunset 08-24-2004 19:43:42<br />
Sunrise 08-25-2004 06:22:09 Sunset 08-25-2004 19:42:12<br />
Sunrise 08-26-2004 06:23:06 Sunset 08-26-2004 19:40:41<br />
Sunrise 08-27-2004 06:24:03 Sunset 08-27-2004 19:39:09<br />
Sunrise 08-28-2004 06:25:00 Sunset 08-28-2004 19:37:37<br />
Sunrise 08-29-2004 06:25:56 Sunset 08-29-2004 19:36:04<br />
Sunrise 08-30-2004 06:26:53 Sunset 08-30-2004 19:34:31<br />
Sunrise 08-31-2004 06:27:50 Sunset 08-31-2004 19:32:57<br />
Sunrise 09-01-2004 06:28:46 Sunset 09-01-2004 19:31:22<br />
Sunrise 09-02-2004 06:29:43 Sunset 09-02-2004 19:29:47<br />
..[values omitted ]<br />
Sunrise 10-28-2004 07:25:31 Sunset 10-28-2004 18:02:34<br />
Sunrise 10-29-2004 07:26:38 Sunset 10-29-2004 18:01:19<br />
Sunrise 10-30-2004 07:27:46 Sunset 10-30-2004 18:00:06<br />
Sunrise 10-31-2004 06:28:53 Sunset 10-31-2004 16:58:54<br />
Sunrise 11-01-2004 06:30:01 Sunset 11-01-2004 16:57:44<br />
Sunrise 11-02-2004 06:31:10 Sunset 11-02-2004 16:56:35<br />
<br />
Compare 10-30-2004 with 10-31-2004. Sunrise is an hour earlier because<br />
daylight saving time has ended, just as predicted.<br />
<br />
There is an easier way to switch between timezones. Take a look at the<br />
directory zoneinfo as follows:<br />
<br />
$ ls /usr/share/zoneinfo<br />
<br />
Africa Chile Factory Iceland Mexico posix UCT<br />
America CST6CDT GB Indian Mideast posixrules Universal<br />
Antarctica Cuba GB-Eire Iran MST PRC US<br />
Arctic EET GMT iso3166.tab MST7MDT PST8PDT UTC<br />
Asia Egypt GMT0 Israel Navajo right WET<br />
Atlantic Eire GMT-0 Jamaica NZ ROC W-SU<br />
Australia EST GMT+0 Japan NZ-CHAT ROK zone.tab<br />
Brazil EST5EDT Greenwich Kwajalein Pacific Singapore Zulu<br />
Canada Etc Hongkong Libya Poland SystemV<br />
CET Europe HST MET Portugal Turkey<br />
<br />
TZ can be set to any one of these files. Some of these are directories and contain<br />
subdirectories, such as ./posix/America. This way you don not have to enter the<br />
timezone, offset, and range for dst, since it has already been calculated.<br />
<br />
$ export TZ=:/usr/share/zoneinfo/posix/America/Aruba<br />
$ export TZ=:/usr/share/zoneinfo/Egypt<br />
<br />
<br />
Reference:<br />
http://prdownloads.sourceforge.net/cpearls/date_calc.tar.gz?download<br />
<br />
Also see (TIP 27).<br />
Also see (TIP 103) using chrony which is very similiar to ntpd.<br />
Note time settings can usually be found in /etc/sysconfig/clock<br />
<br />
<br />
<br />
<br />
TIP 2:<br />
<br />
cpio works like tar, only better.<br />
<br />
STEP 1 (Create two directories with data ../dir1 an ../dir2)<br />
<br />
mkdir -p ../dir1<br />
mkdir -p ../dir2<br />
cp /etc/*.conf ../dir1/.<br />
cp /etc/*.cnf ../dir2/.<br />
<br />
Which will backup all your cnf and conf files.<br />
<br />
STEP 2 (Piping the files to tar)<br />
<br />
cpio works like tar but can take input<br />
from the "find" command.<br />
<br />
$ find ../dir1/ | cpio -o --format=tar > test.tar<br />
or<br />
$ find ../dir1/ | cpio -o -H tar > test2.tar<br />
<br />
Same command without the ">"<br />
<br />
$ find ../dir1/ | cpio -o --format=tar -F test.tar<br />
or<br />
$ find ../dir1/ | cpio -o -H tar -F test2.tar<br />
<br />
Using append<br />
<br />
$ find ../dir1/ | cpio -o --format=tar -F test.tar<br />
or<br />
$ find ../dir2/ | cpio -o --format=tar --append -F test.tar<br />
<br />
STEP 3 (List contents of the tar file)<br />
<br />
$ cpio -it < test.tar<br />
or<br />
$ cpio -it -F test.tar<br />
<br />
STEP 4 (Extract the contents)<br />
<br />
$ cpio -i -F test.tar<br />
<br />
<br />
<br />
TIP 3:<br />
<br />
Working with tar. The basics with encryption.<br />
<br />
STEP 1 (Using the tar command on the directory /stuff)<br />
<br />
Suppose you have a directory /stuff<br />
To tar everything in stuff to create a ".tar" file.<br />
<br />
$ tar -cvf stuff.tar stuff<br />
<br />
Which will create "stuff.tar".<br />
<br />
STEP 2 (Using the tar command to create a ".tar.gz" of /stuff)<br />
<br />
$ tar -czf stuff.tar.gz stuff<br />
<br />
STEP 3 (List the files in the archive)<br />
<br />
$ tar -tzf stuff.tar.gz<br />
or<br />
$ tar -tf stuff.tar<br />
<br />
STEP 4 (A way to list specific files)<br />
<br />
Note, pipe the results to a file and edit<br />
<br />
$ tar -tzf stuff.tar.gz > mout<br />
<br />
Then, edit mout to only include the files you want<br />
<br />
$ tar -T mout -xzf stuff.tar.gz<br />
<br />
The above command will only get the files in mout.<br />
Of couse, if you want them all<br />
<br />
$ tar -xzf stuff.tar.gz<br />
<br />
STEP 5 (ENCRYPTION)<br />
<br />
$ tar -zcvf - stuff|openssl des3 -salt -k secretpassword | dd of=stuff.des3<br />
<br />
This will create stuff.des3...don't forget the password you<br />
put in place of secretpassword. This can be done interactively as<br />
well.<br />
<br />
$ dd if=stuff.des3 |openssl des3 -d -k secretpassword|tar zxf -<br />
<br />
NOTE: above there is a "-" at the end... this will<br />
extract everything.<br />
<br />
<br />
<br />
TIP 4:<br />
<br />
Creating a Virtual File System and Mounting it with a Loopback Device.<br />
<br />
STEP 1 (Construct a 10MB file)<br />
<br />
$ dd if=/dev/zero of=/tmp/disk-image count=20480<br />
<br />
By default dd uses block of 512 so the size will be 20480*512<br />
<br />
STEP 2 (Make an ext2 or ext3 file system) -- ext2 shown here.<br />
<br />
$ mke2fs -q<br />
<br />
or if you want ext3<br />
<br />
$ mkfs -t ext3 -q /tmp/disk-image<br />
<br />
yes, you can even use reiser, but you'll need to create a bigger<br />
disk image. Something like "dd if=/dev/zero of=/tmp/disk-image count=50480".<br />
<br />
$ mkfs -t reiserfs -q /tmp/disk-image<br />
<br />
Hit yes for confirmation. It only asks this because it's a file<br />
<br />
<br />
STEP 3 (Create a directory "virtual-fs" and mount. This has to be done as root)<br />
<br />
$ mkdir /virtual-fs<br />
$ mount -o loop=/dev/loop0 /tmp/disk-image /virtual-fs<br />
<br />
SPECIAL NOTE: if you mount a second device you will have to increase the<br />
loop count: loop=/dev/loop1, loop=/dev/loop2, ... loop=/dev/loopn<br />
<br />
Now it operates just like a disk. This virtual filesystem can be mounted<br />
when the system boots by adding the following to the "/etc/fstab" file. Then,<br />
to mount, just type "mount /virtual-fs".<br />
<br />
/tmp/disk-image /virtual-fs ext2 rw,loop=/dev/loop0 0 0<br />
<br />
STEP 4 (When done, umount it)<br />
<br />
$ umount /virtual-fs<br />
<br />
<br />
SPECIAL NOTE: If you are using Fedora core 2, in the /etc/fstab you can take<br />
advantage of acl properties for this mount. Note the acl next to the<br />
rw entry. This is shown here with ext3.<br />
<br />
/tmp/disk-image /virtual-fs ext3 rw,acl,loop=/dev/loop1 0 0<br />
<br />
Also, if you are using Fedora core 2 and above, you can mount the file<br />
on a cryptoloop.<br />
<br />
$ dd if=/dev/urandom of=disk-aes count=20480<br />
<br />
<br />
$ modprobe loop<br />
$ modprobe cryptoloop<br />
$ modprobe aes<br />
<br />
$ losetup -e aes /dev/loop0 disk-aes<br />
$ mkfs -t ext2 /dev/loop0<br />
$ mount -o loop,encryption=aes disk-aes <mount point><br />
<br />
<br />
If you do not have Fedora core 2, then, you can build the kernel from source<br />
with some of the following options (not complete, yet)<br />
reference:<br />
http://cvs.sourceforge.net/viewcvs.py/cpearls/cpearls/src/posted_on_sf/acl/ehd.pdf?rev=1.1&view=log<br />
<br />
Cryptographic API Support (CONFIG_CRYPTO)<br />
generic loop cryptographic (CONFIG_CRYPTOLOOP)<br />
Cryptographic ciphers (CONFIG_CIPHERS)<br />
Enable one or more ciphers (CONFIG CIPHER .*) such as AES.<br />
<br />
<br />
HELPFUL INFORMATION: It is possible to bind mount partitions, or associate the<br />
mounted partition to a directory name.<br />
<br />
# mount --bind /virtual-fs /home/mchirico/vfs<br />
<br />
Also, if you want to see what filesystems are currently mounted, "cat" the<br />
file "/etc/mtab"<br />
<br />
$ cat /etc/mtab<br />
<br />
Also see TIP 91.<br />
<br />
<br />
<br />
TIP 5:<br />
<br />
Setting up 2 IP address on "One" NIC. This example is on ethernet.<br />
<br />
STEP 1 (The settings for the initial IP address)<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0<br />
<br />
DEVICE=eth0<br />
BOOTPROTO=static<br />
BROADCAST=192.168.99.255<br />
IPADDR=192.168.1.155<br />
NETMASK=255.255.252.0<br />
NETWORK=192.168.1.0<br />
ONBOOT=yes<br />
<br />
STEP 2 (2nd IP address: )<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0:1<br />
<br />
DEVICE=eth0:1<br />
BOOTPROTO=static<br />
BROADCAST=192.168.99.255<br />
IPADDR=192.168.1.182<br />
NETMASK=255.255.252.0<br />
NETWORK=192.168.1.0<br />
ONBOOT=yes<br />
<br />
SUMMARY Note, in STEP 1 the filename is "ifcfg-eth0", whereas in<br />
STEP 2 it's "ifcfg-eth0:1" and also not the matching<br />
entries for "DEVICE=...". Also, obviously, the<br />
"IPADDR" is different as well.<br />
<br />
<br />
<br />
TIP 6:<br />
<br />
Sharing Directories Among Several Users.<br />
<br />
Several people are working on a project in "/home/share"<br />
and they need to create documents and programs so that<br />
others in the group can edit and execute these documents<br />
as needed. Also see (TIP 186) for adding existing users<br />
to groups.<br />
<br />
$ /usr/sbin/groupadd share<br />
$ chown -R root.share /home/share<br />
$ /usr/bin/gpasswd -a <username> share<br />
$ chmod 2775 /home/share<br />
<br />
$ ls -ld /home/share<br />
drwxrwsr-x 2 root share 4096 Nov 8 16:19 /home/share<br />
^---------- Note the s bit, which was set with the chmod 2775<br />
<br />
$ cat /etc/group<br />
...<br />
share:x:502:chirico,donkey,zoe<br />
... ^------- users are added to this group.<br />
<br />
The user may need to login again to get access. Or, if the user is currently<br />
logged in, they can run the following command:<br />
<br />
$ su - <username><br />
<br />
Note, the above step is recommended over "newgrp - share" since currently<br />
newgrp in FC2,FC3, and FC4 gets access to the group but the umask is not<br />
correctly formed.<br />
<br />
As root you can test their account.<br />
<br />
$ su - <username> "You need to '-' to pickup thier environment '$ su - chirico' "<br />
<br />
Note: SUID, SGID, Sticky bit. Only the left most octet is examined, and "chmod 755" is used<br />
as an example of the full command. But, anything else could be used as well. Normally<br />
you'd want executable permissions.<br />
<br />
Octal digit Binary value Meaning Example usage<br />
0 000 all cleared $ chmod 0755 or chmod 755<br />
1 001 sticky $ chmod 1755<br />
2 010 setgid $ chmod 2755<br />
3 011 setgid, sticky $ chmod 3755<br />
4 100 setuid $ chmod 4755<br />
5 101 setuid, sticky $ chmod 5755<br />
6 110 setuid, setgid $ chmod 6755<br />
7 111 setuid, setgid, sticky $ chmod 7755<br />
<br />
A few examples applied to a directory below. In the first example all users in the group can<br />
add files to directory "dirA" and they can delete their own files. Users cannot delete other<br />
user's files.<br />
<br />
Sticky bit:<br />
$ chmod 1770 dirA<br />
<br />
Below files created within the directory have the group ID of the directory, rather than that<br />
of the default group setting for the user who created the file.<br />
<br />
Set group ID bit:<br />
$ chmod 2755 dirB<br />
<br />
<br />
<br />
<br />
TIP 7:<br />
<br />
Getting Infomation on Commands<br />
<br />
The "info" is a great utility for getting information about the system.<br />
Here's a quick key on using "info" from the terminal prompt.<br />
<br />
'q' exits.<br />
'u' moves up to the table of contents of the current section.<br />
'n' moves to the next chapter.<br />
'p' moves to the previous chapter.<br />
'space' goes into the selected section.<br />
<br />
<br />
The following is a good starting point:<br />
<br />
$ info coreutils<br />
<br />
Need to find out what a certain program does?<br />
<br />
$ whatis open<br />
open (2) - open and possibly create a file or device<br />
open (3) - perl pragma to set default PerlIO layers for input and output<br />
open (3pm) - perl pragma to set default PerlIO layers for input and output<br />
open (n) - Open a file-based or command pipeline channel<br />
<br />
To get specific information about the open commmand<br />
<br />
$ man 2 open<br />
<br />
also try 'keyword' search, which is the same as the apropos command.<br />
For example, to find all the man pages on selinux, type the following:<br />
<br />
$ man -k selinux<br />
<br />
or the man full word search. Same as whatis command.<br />
<br />
$ man -f <some string><br />
<br />
This is a hint once you are inside man.<br />
<br />
space moves forward one page<br />
b moves backward<br />
y scrolls up one line "yikes, I missed it!"<br />
g goes to the beginning<br />
q quits<br />
/<string> search, repeat seach n<br />
m mark, enter a letter like "a", then, ' to go back<br />
' enter a letter that is marked.<br />
<br />
<br />
<br />
To get section numbers<br />
<br />
$ man 8 ping<br />
<br />
Note the numbers are used as follows<br />
(This is OpenBSD)<br />
<br />
1 General Commands<br />
2 System Calls and Error Numbers<br />
3 C Libraries<br />
3p perl<br />
4 Devices and device drivers<br />
5 File Formats and config files<br />
6 Game instructions<br />
7 Miscellaneous information<br />
8 System maintenance<br />
9 Kernel internals<br />
<br />
To find the man page directly, "ls" command:<br />
<br />
$ whereis -m ls<br />
ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1/ls.1 /usr/share/man/man1p/ls.1p<br />
<br />
To read this file directly, do the following:<br />
<br />
$ man /usr/share/man/man1/ls.1.gz<br />
<br />
If you want to know the manpath, execute manpath.<br />
<br />
$ manpath<br />
/usr/share/man:/usr/X11R6/man:/usr/local/share/man:/usr/local/pgsql/man:/usr/man:/usr/local/man<br />
<br />
<br />
<br />
TIP 8:<br />
<br />
How to Put a "Running Job" in the Background.<br />
<br />
You're running a job at the terminal prompt, and it's taking<br />
a very long time. You want to put the job in the backgroud.<br />
<br />
"CTL - z" Temporarily suspends the job<br />
$ jobs This will list all the jobs<br />
$ bg %jobnumber (bg %1) To run in the background<br />
$ fg %jobnumber To bring back in the foreground<br />
<br />
Need to kill all jobs -- say you're using several suspended<br />
emacs sessions and you just want everything to exit.<br />
<br />
$ kill -9 `jobs -p`<br />
<br />
The "jobs -p" gives the process number of each job, and the<br />
kill -9 kills everything. Yes, sometimes "kill -9" is excessive<br />
and you should issue a "kill -15" that allows jobs to clean-up.<br />
However, for exacs session, I prefer "kill -9" and haven't had<br />
a problem.<br />
<br />
Sometimes you need to list the process id along with job<br />
information. For instance, here's process id with the listing.<br />
<br />
$ jobs -l<br />
<br />
Note you can also renice a job, or give it lower priority.<br />
<br />
$ nice -n +15 find . -ctime 2 -type f -exec ls {} \; > last48hours<br />
^z<br />
$ bg<br />
<br />
So above that was a ctl-z to suppend. Then, bg to run it in<br />
the background. Now, if you want to change the priority lower<br />
you just renice it, once you know the process id.<br />
<br />
$ jobs -pl<br />
[1]+ 29388 Running nice -n +15 find . -ctime 2 -exec ls -l {} \; >mout &<br />
<br />
$ renice +30 -p 29388<br />
29388: old priority 15, new priority 19<br />
<br />
19 was the lowest priority for this job. You cannot increase<br />
the priority unless you are root.<br />
<br />
<br />
<br />
TIP 9:<br />
<br />
Need to Delete a File for Good -- not even GOD can recover.<br />
<br />
You have a file "secret". The following makes it so no one<br />
can read it. If the file was 12 bytes, it's now 4096 after it<br />
has been over written 100 times. There's no way to recover this.<br />
<br />
$ shred -n 100 -z secret<br />
<br />
Want to remove the file? Use the "u" option.<br />
<br />
$ shred -n 100 -z -u test2<br />
<br />
It can be applied to a device<br />
<br />
$ shred -n 100 -z -u /dev/fd0<br />
<br />
<br />
CAUTION: Note that shred relies on a very important assumption: that the file system overwrites data<br />
in place. This is the traditional way to do things, but many modern file system designs do not sat-<br />
isfy this assumption. The following are examples of file systems on which shred is not effective, or<br />
is not guaranteed to be effective in all file system modes:<br />
<br />
* log-structured or journaled file systems, such as those supplied with<br />
<br />
AIX and Solaris (and JFS, ReiserFS, XFS, Ext3, etc.)<br />
<br />
<br />
<br />
Also see (TIP 52).<br />
<br />
<br />
<br />
TIP 10:<br />
<br />
Who and What is doing What on Your System - finding open sockets,<br />
files etc.<br />
<br />
$ lsof<br />
or as root<br />
$ watch lsof -i<br />
<br />
To list all open Internet files, use:<br />
<br />
$ lsof -i -U<br />
<br />
(See TIP 118)<br />
<br />
Also try fuser. Suppose you have a mounted file-system, and you need<br />
to umount it. To list the users on the file-system /work<br />
<br />
$ fuser -u /work<br />
<br />
To kill all processes accessing the file system /work in any way.<br />
<br />
$ fuser -km /work<br />
<br />
Or better yet, maybe you want to eject a cdrom on /mnt/cdrom<br />
<br />
$ fuser -km /mnt/cdrom<br />
<br />
<br />
If you need IO load information about your system, you can execute<br />
iostat. But note, the very first iostat gives a snapshot since<br />
the last boot. You typically want the following command, which gives<br />
you 3 outputs every 5 seconds.<br />
<br />
$ iostat -xtc 5 3<br />
Linux 2.6.12-1.1376_FC3smp (squeezel.squeezel.com) 10/05/2005<br />
<br />
Time: 07:05:04 PM<br />
avg-cpu: %user %nice %system %iowait %idle<br />
0.97 0.06 1.94 0.62 96.41<br />
<br />
Time: 07:05:09 PM<br />
avg-cpu: %user %nice %system %iowait %idle<br />
0.60 0.00 1.70 0.00 97.70<br />
<br />
Time: 07:05:14 PM<br />
avg-cpu: %user %nice %system %iowait %idle<br />
1.00 0.00 1.60 0.00 97.39<br />
<br />
vmstat reports memory statistics.<br />
<br />
<br />
$ vmstat<br />
$ ifconfig<br />
$ cat /proc/sys/vm/.. (entries under here)<br />
<br />
<br />
*NOTE: (TIP 77) shows sample usage of "ifconfig". Also<br />
(TIP 84) shows sample output of "$ cat /proc/cpuinfo". You can download iostat<br />
and other packages from (http://perso.wanadoo.fr/sebastien.godard/download_en.html).<br />
You also may want to look at iozone (TIP 178).<br />
<br />
Also<br />
<br />
$ cat /proc/meminfo<br />
$ cat /proc/stat<br />
<br />
$ cat /proc/uptime<br />
1078623.55 1048008.34 First number is the number of seconds since boot.<br />
The second number is the number of idle seconds.<br />
<br />
$ cat /proc/loadavg<br />
0.25 0.14 0.10 1/166 7778 This shows load at 1,5, and 15 minutes,<br />
a total of 1 current running process out<br />
from a total of 166. The 7778 is the last<br />
process id used.<br />
Ref: http://www.teamquest.com/resources/gunther/ldavg1.shtml<br />
<br />
Or current process open file descriptors<br />
<br />
$ ls -l /proc/self/fd/0<br />
lrwx------ 1 chirico chirico 64 Jun 29 13:17 0 -> /dev/pts/51<br />
lrwx------ 1 chirico chirico 64 Jun 29 13:17 1 -> /dev/pts/51<br />
lrwx------ 1 chirico chirico 64 Jun 29 13:17 2 -> /dev/pts/51<br />
lr-x------ 1 chirico chirico 64 Jun 29 13:17 3 -> /proc/26667/fd<br />
<br />
So you could, $ echo "stuff" > /dev/pts/51, to get output. Note, tree is also<br />
helpful here:<br />
<br />
$ tree /proc/self<br />
<br />
/proc/self<br />
|-- auxv<br />
|-- cmdline<br />
|-- cwd -> /work/souptonuts/documentation/theBook<br />
|-- environ<br />
|-- exe -> /usr/bin/tree<br />
|-- fd<br />
| |-- 0 -> /dev/pts/51<br />
| |-- 1 -> /dev/pts/51<br />
| |-- 2 -> /dev/pts/51<br />
| `-- 3 -> /proc/26668/fd<br />
|-- maps<br />
|-- mem<br />
|-- mounts<br />
|-- root -> /<br />
|-- stat<br />
|-- statm<br />
|-- status<br />
|-- task<br />
| `-- 26668<br />
| |-- auxv<br />
| |-- cmdline<br />
| |-- cwd -> /work/souptonuts/documentation/theBook<br />
| |-- environ<br />
| |-- exe -> /usr/bin/tree<br />
| |-- fd<br />
| | |-- 0 -> /dev/pts/51<br />
| | |-- 1 -> /dev/pts/51<br />
| | |-- 2 -> /dev/pts/51<br />
| | `-- 3 -> /proc/26668/task/26668/fd<br />
| |-- maps<br />
| |-- mem<br />
| |-- mounts<br />
| |-- root -> /<br />
| |-- stat<br />
| |-- statm<br />
| |-- status<br />
| `-- wchan<br />
`-- wchan<br />
<br />
10 directories, 28 files<br />
<br />
Need a listing of the system settings?<br />
<br />
$ sysctl -a<br />
<br />
Need IPC (Shared Memory Segments, Semaphore Arrays, Message Queue) status<br />
etc?<br />
<br />
$ ipcs<br />
$ ipcs -l "This gives limits"<br />
<br />
Need to "watch" everything a user does? The following watches donkey.<br />
<br />
$ watch lsof -u donkey<br />
<br />
Or, to see what in going on in directory "/work/junk"<br />
<br />
$ watch lsof +D /work/junk<br />
<br />
<br />
<br />
TIP 11:<br />
<br />
How to make a File "immutable" or "unalterable" -- it cannot be changed<br />
or deleted even by root. Note this works on (ext2/ext3) filesystems.<br />
And, yes, root can delete after it's changed back.<br />
<br />
As root:<br />
<br />
$ chattr +i filename<br />
<br />
And to change it back:<br />
<br />
$ chattr -i filename<br />
<br />
List attributes<br />
<br />
$ lsattr filename<br />
<br />
<br />
<br />
TIP 12:<br />
<br />
SSH - How to Generate the Key Pair.<br />
<br />
<br />
On the local server<br />
<br />
$ ssh-keygen -t dsa -b 2048<br />
<br />
This will create the two files:<br />
<br />
.ssh/id_dsa (Private key)<br />
.ssh/id_dsa.pub (Public key you can share)<br />
<br />
Next insert ".ssh/id_dsa.pub" on the remote server<br />
in the file ".ssh/authorized_keys" and ".ssh/authorized_keys2"<br />
and change the permission of each file to (chmod 600). Plus, make<br />
sure the directory ".ssh" exists on the remote computer with 700 rights.<br />
Ok, assuming 192.168.1.155 is the remote server and "donkey" is the<br />
account on that remote server.<br />
<br />
$ ssh donkey@192.168.1.155 "mkdir -p .ssh"<br />
$ ssh donkey@192.168.1.155 "chmod 700 .ssh"<br />
$ scp ./.ssh/id_dsa.pub donkey@192.168.1.155:.ssh/newkey.pub<br />
<br />
Now connect to that remote server "192.168.1.155" and add .ssh/newkey.pub<br />
to both "authorized_keys" and "authorized_keys2". When done, the permission<br />
on<br />
(This is on the remote server)<br />
<br />
$chmod 600 .ssh/authorized_key*<br />
<br />
Next, go back to the local server and issue the following:<br />
<br />
$ ssh-agent $SHELL<br />
$ ssh-add<br />
<br />
The "ssh-add" will allow you to enter the passphrase and it will<br />
save it for the current login session.<br />
<br />
You don't have to enter a password when running "ssh-keygen" above. But,<br />
remember anyone with root access can "su - <username>" and then connect<br />
to your computers. It's harder, however, not impossible, for root to do<br />
this if you have a password.<br />
<br />
(Reference TIP 151)<br />
<br />
<br />
<br />
TIP 13:<br />
<br />
Securing the System: Don't allow root to login remotely. Instead,<br />
the admin could login as another account, then, "su -". However,<br />
root can still login "from the local terminal".<br />
<br />
In the "/etc/ssh/sshd_config" file change the following lines:<br />
<br />
Protocol 2<br />
PermitRootLogin no<br />
PermitEmptyPasswords no<br />
<br />
Then, restart ssh<br />
<br />
/etc/init.d/sshd restart<br />
<br />
Why would you want to do this? It's not possible for anyone to guess<br />
or keep trying the root account. This is especially good for computers<br />
on the Internet. So, even if the "root" passwords is known, they can't<br />
get access to the system remotely. Only from the terminal, which is locked<br />
in your computer room. However, if anyone has a account on the server,<br />
then, they can login under their account then "su -".<br />
<br />
Suppose you only want a limited number of users: "mchirico" and "donkey".<br />
Add the following line to "/etc/ssh/sshd_config". Note, this allows access<br />
for chirico and donkey, but everyone else is denied.<br />
<br />
# Once you add AllowUsers - everyone else is denied.<br />
AllowUsers mchirico donkey<br />
<br />
<br />
<br />
TIP 14:<br />
<br />
Keep Logs Longer with Less Space.<br />
<br />
Normally logs rotate monthly, over writing all the old data. Here's a<br />
sample "/etc/logrotate.conf" that will keep 12 months of backup<br />
compressing the logfiles<br />
<br />
$ cat /etc/logrotate.conf<br />
<br />
# see "man logrotate" for details<br />
# rotate log files weekly<br />
#chirico changes to monthly<br />
monthly<br />
<br />
# keep 4 weeks worth of backlogs<br />
# keep 12 months of backup<br />
rotate 12<br />
<br />
# create new (empty) log files after rotating old ones<br />
create<br />
<br />
# uncomment this if you want your log files compressed<br />
compress<br />
<br />
# RPM packages drop log rotation information into this directory<br />
include /etc/logrotate.d<br />
<br />
# no packages own wtmp -- we'll rotate them here<br />
/var/log/wtmp {<br />
monthly<br />
create 0664 root utmp<br />
rotate 1<br />
}<br />
<br />
# system-specific logs may be also be configured here.<br />
<br />
<br />
Note: see tip 1. The clock should always be correctly set.<br />
<br />
<br />
<br />
TIP 15:<br />
<br />
What Network Services are Running?<br />
<br />
$ netstat -atup<br />
<br />
or<br />
<br />
$ netstat -ap|grep LISTEN|less<br />
<br />
This can be helpful to determine the services running.<br />
<br />
Need stats on dropped UDP packets?<br />
<br />
$ netstat -s -u<br />
<br />
or TCP<br />
<br />
$ netstat -s -t<br />
<br />
or summary of everything<br />
<br />
$ netstat -s<br />
<br />
or looking for error rates on the interface?<br />
<br />
$ netstat -i<br />
<br />
Listening interfaces?<br />
<br />
$ netstat -l<br />
<br />
(Tip above provided by Amos Shapira)<br />
<br />
Also see TIP 77.<br />
<br />
<br />
<br />
TIP 16:<br />
<br />
Apache: Creating and Using an ".htaccess" File<br />
<br />
<br />
Below is a sample ".htaccess" file which goes in<br />
"/usr/local/apache/htdocs/chirico/alpha/.htaccess" for this<br />
example<br />
<br />
<br />
AuthUserFile /usr/local/apache/htdocs/chirico/alpha/.htpasswd<br />
AuthGroupFile /dev/null<br />
AuthName "Your Name and regular password required"<br />
AuthType Basic<br />
<br />
<Limit GET POST><br />
require valid-user<br />
</Limit><br />
<br />
In order for this to work /usr/local/apache/conf/httpd.conf must<br />
have the following line in it:<br />
<br />
<br />
#<br />
<Directory /usr/local/apache/htdocs/chirico/alpha><br />
AllowOverride FileInfo AuthConfig Limit<br />
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec<br />
<Limit GET POST OPTIONS PROPFIND><br />
Order allow,deny<br />
Allow from all<br />
</Limit><br />
<LimitExcept GET POST OPTIONS PROPFIND><br />
Order deny,allow<br />
Deny from all<br />
</LimitExcept><br />
</Directory><br />
<br />
<br />
<br />
Also, a password file must be created<br />
<br />
$ /usr/local/apache/bin/htpasswd -c .htpasswd chirico<br />
<br />
And enter the user names and passwords.<br />
<br />
Next Reload Apache:<br />
<br />
$ /etc/init.d/httpd reload<br />
<br />
(Reference TIP 213 limit access to certain directories based on IP address).<br />
<br />
<br />
<br />
TIP 17:<br />
<br />
Working with "mt" Commands: reading and writing to tape.<br />
<br />
The following assumes the tape device is "/dev/st0"<br />
<br />
STEP 1 ( rewind the tape)<br />
<br />
# mt -f /dev/nst0 rewind<br />
<br />
STEP 2 (check to see if you are at block 0)<br />
<br />
# mt -f /dev/nst0 tell<br />
At block 0.<br />
<br />
STEP 3 (Backup "tar compress" directories "one" and "two")<br />
<br />
# tar -czf /dev/nst0 one two<br />
<br />
STEP 4 (Check to see what block you are at)<br />
<br />
# mt -f /dev/nst0 tell<br />
<br />
You should get something like block 2 at this point.<br />
<br />
STEP 5 (Rewind the tape)<br />
<br />
# mt -f /dev/nst0 rewind<br />
<br />
STEP 6 (List the files)<br />
<br />
# tar -tzf /dev/nst0<br />
one/<br />
one/test<br />
two/<br />
<br />
STEP 7 (Restore directory "one" into directory "junk"). Note, you<br />
have to first rewind the tape, since the last operation moved<br />
ahead 2 blocks. Check this with "mt -f /dev/nst0".<br />
<br />
# cd junk<br />
# mt -f /dev/nst0 rewind<br />
# mt -f /dev/nst0 tell<br />
At block 0.<br />
# tar -xzf /dev/nst0 one<br />
<br />
STEP 8 (Next, take a look to see what block the tape is at)<br />
<br />
# mt -f /dev/nst0 tell<br />
At block 2.<br />
<br />
STEP 9 (Now backup directories three and four)<br />
<br />
# tar -czf /dev/nst0 three four<br />
<br />
After backing up the files, the tape should be past block 2.<br />
Check this.<br />
<br />
# mt -f /dev/nst0 tell<br />
At block 4.<br />
<br />
Currently the following exist:<br />
<br />
At block 1:<br />
one/<br />
one/test<br />
two/<br />
<br />
At block 2:<br />
three/<br />
three/samplehere<br />
four/<br />
<br />
At block 4:<br />
(* This is empty *)<br />
<br />
A few notes. You can set the blocking factor and a label<br />
with tar. For example:<br />
<br />
$ tar --label="temp label" --create --blocking-factor=128 --file=/dev/nst0 Notes<br />
<br />
But note if you try to read it with the default, incorrect blocking<br />
factor, then, you will get the following error:<br />
<br />
$ tar -t --file=/dev/nst0<br />
tar: /dev/nst0: Cannot read: Cannot allocate memory<br />
tar: At beginning of tape, quitting now<br />
tar: Error is not recoverable: exiting now<br />
<br />
However this is easily fixed with the correct blocking factor<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ tar -t --blocking-factor=128 --file=/dev/nst0<br />
temp label<br />
Notes<br />
<br />
Take advantage of the label command.<br />
<br />
$ MYCOMMENTS="Big_important_tape"<br />
$ tar --label="$(date +%F)"+"${MYCOMMENTS}"<br />
<br />
Writing to tape on a remote 192.168.1.155 computer<br />
<br />
$ tar cvzf - ./tmp | ssh -l chirico 192.168.1.155 '(mt -f /dev/nst0 rewind; dd of=/dev/st0 )'<br />
<br />
Restoring the contents from tape on a remote computer<br />
<br />
$ ssh -l chirico 192.168.1.155 '(mt -f /dev/nst0 rewind; dd if=/dev/st0 )'|tar xzf -<br />
<br />
Getting data off of tape with dd command with odd blocking factor. Just set ibs very high<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ tar --label="Contenets of Notes" --create --blocking-factor=128 --file=/dev/nst0 Notes<br />
$ mt -f /dev/nst0 rewind<br />
$ dd ibs=1048576 if=/dev/st0 of=notes.tar<br />
<br />
The above will probably work with ibs=64k as well<br />
<br />
(Also see TIP 136)<br />
<br />
<br />
<br />
TIP 18:<br />
<br />
Encrypting Data to Tape using "tar" and "openssl".<br />
<br />
The following shows an example of writing the contents of "tapetest" to tape:<br />
<br />
$ tar zcvf - tapetest|openssl des3 -salt -k secretpassword | dd of=/dev/st0<br />
<br />
Reading the data back:<br />
<br />
$ dd if=/dev/st0|openssl des3 -d -k secretpassword|tar xzf -<br />
<br />
<br />
<br />
TIP 19:<br />
<br />
Mounting an ISO Image as a Filesystem -- this is great if you don't have the DVD<br />
hardware, but, need to get at the data. The following show an example of<br />
mounting the Fedora core 2 as a file.<br />
<br />
$ mkdir /iso0<br />
$ mount -o loop -t iso9660 /FC2-i386-DVD.iso /iso0<br />
<br />
Or to mount automatically at boot, add the following to "/etc/fstab"<br />
<br />
/FC2-i386-DVD.iso /iso0 iso9660 rw,loop 0 0<br />
<br />
<br />
Reference: http://umn.dl.sourceforge.net/sourceforge/souptonuts/README_fedora.txt<br />
<br />
<br />
<br />
TIP 20:<br />
<br />
Getting Information about the Hard drive and list all PCI devices.<br />
<br />
$ hdparm /dev/hda<br />
<br />
/dev/hda:<br />
multcount = 16 (on)<br />
IO_support = 0 (default 16-bit)<br />
unmaskirq = 0 (off)<br />
using_dma = 1 (on)<br />
keepsettings = 0 (off)<br />
readonly = 0 (off)<br />
readahead = 256 (on)<br />
geometry = 16383/255/63, sectors = 234375000, start = 0<br />
<br />
or for SCSI<br />
<br />
$ hdparm /dev/sda<br />
<br />
Try it with the -i option for information<br />
<br />
$ hdparm -i /dev/hda<br />
<br />
/dev/hda:<br />
<br />
Model=IC35L120AVV207-1, FwRev=V24OA66A, SerialNo=VNVD09G4CZ6E0T<br />
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }<br />
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=52<br />
BuffType=DualPortCache, BuffSize=7965kB, MaxMultSect=16, MultSect=16<br />
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=234375000<br />
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}<br />
PIO modes: pio0 pio1 pio2 pio3 pio4<br />
DMA modes: mdma0 mdma1 mdma2<br />
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5<br />
AdvancedPM=yes: disabled (255) WriteCache=enabled<br />
Drive conforms to: ATA/ATAPI-6 T13 1410D revision 3a: 2 3 4 5 6<br />
<br />
How fast is your drive?<br />
<br />
$ hdparm -tT /dev/hda<br />
<br />
/dev/hda:<br />
Timing buffer-cache reads: 128 MB in 0.41 seconds =315.32 MB/sec<br />
Timing buffered disk reads: 64 MB in 1.19 seconds = 53.65 MB/sec<br />
<br />
Need to find your device?<br />
<br />
$ mount<br />
or<br />
$ cat /proc/partitions<br />
or<br />
$ dmesg | egrep '^(s|h)d'<br />
<br />
which for my system lists:<br />
<br />
hda: IC35L120AVV207-1, ATA DISK drive<br />
hdc: Lite-On LTN486S 48x Max, ATAPI CD/DVD-ROM drive<br />
hda: max request size: 1024KiB<br />
hda: 234375000 sectors (120000 MB) w/7965KiB Cache, CHS=16383/255/63, UDMA(100)<br />
<br />
By the way, if you want to turn on dma<br />
<br />
$ hdparm -d1 /dev/hda<br />
setting using_dma to 1 (on)<br />
using_dma = 1 (on)<br />
<br />
(Also see TIP 122 )<br />
<br />
List all PCI devices<br />
<br />
$ lspci -v<br />
<br />
00:00.0 Host bridge: Intel Corp. 82845G/GL [Brookdale-G] Chipset Host Bridge (rev<br />
Subsystem: Dell Computer Corporation: Unknown device 0160<br />
Flags: bus master, fast devsel, latency 0<br />
Memory at f0000000 (32-bit, prefetchable) [size=128M]<br />
Capabilities: <available only to root><br />
<br />
... lots more ...<br />
<br />
Note, there is also lspci -vv for even more information.<br />
<br />
(Also see TIP 200)<br />
<br />
TIP 21:<br />
<br />
Setting up "cron" Jobs.<br />
<br />
If you want to use the emacs editor for editing cron jobs, then,<br />
set the following in your "/home/user/.bash_profile"<br />
<br />
EDITOR=emacs<br />
<br />
Then, to edit cron jobs<br />
<br />
$ crontab -e<br />
<br />
You may want to put in the following header<br />
<br />
#MINUTE(0-59) HOUR(0-23) DAYOFMONTH(1-31) MONTHOFYEAR(1-12) DAYOFWEEK(0-6) Note 0=Sun and 7=Sun<br />
#<br />
#14,15 10 * * 0 /usr/bin/somecommmand >/dev/null 2>&1<br />
<br />
The sample "commented out command" will run at 10:14 and 10:15 every Sunday. There will<br />
be no "mail" sent to the user because of the ">/dev/null 2>&1" entry.<br />
<br />
$ crontab -l<br />
<br />
The above will list all cron jobs. Or if you're root<br />
<br />
$ crontab -l -u <username><br />
$ crontab -e -u <username><br />
<br />
Reference "man 5 crontab":<br />
<br />
The time and date fields are:<br />
<br />
field allowed values<br />
----- --------------<br />
minute 0-59<br />
hour 0-23<br />
day of month 1-31<br />
month 1-12 (or names, see below)<br />
day of week 0-7 (0 or 7 is Sun, or use names)<br />
<br />
A field may be an asterisk (*), which always stands for ``first-last''.<br />
<br />
Ranges of numbers are allowed. Ranges are two numbers separated with a<br />
hyphen. The specified range is inclusive. For example, 8-11 for an<br />
``hours'' entry specifies execution at hours 8, 9, 10 and 11.<br />
<br />
Lists are allowed. A list is a set of numbers (or ranges) separated by<br />
commas. Examples: ``1,2,5,9'', ``0-4,8-12''.<br />
<br />
Ranges can include "steps", so "1-9/2" is the same as "1,3,5,7,9".<br />
<br />
Note, you can run just every 5 minutes as follows:<br />
<br />
*/5 * * * * /etc/mrtg/domrtg >/dev/null 2>&1<br />
<br />
To run jobs hourly,daily,weekly or monthly you can add shell scripts into the<br />
appropriate directory:<br />
<br />
/etc/cron.hourly/<br />
/etc/cron.daily/<br />
/etc/cron.weekly/<br />
/etc/cron.monthly/<br />
<br />
Note that the above are pre-configured schedules set in "/etc/crontab", so<br />
if you want, you can change the schedule. Below is my /etc/crontab:<br />
<br />
$ cat /etc/crontab<br />
SHELL=/bin/bash<br />
PATH=/sbin:/bin:/usr/sbin:/usr/bin<br />
MAILTO=root<br />
HOME=/<br />
<br />
# run-parts<br />
01 * * * * root run-parts /etc/cron.hourly<br />
02 4 * * * root run-parts /etc/cron.daily<br />
22 4 * * 0 root run-parts /etc/cron.weekly<br />
42 4 1 * * root run-parts /etc/cron.monthly<br />
<br />
<br />
<br />
TIP 22:<br />
<br />
Keeping Files in Sync Between Servers.<br />
<br />
The remote computer is "192.168.1.171" and has the account "donkey". You want<br />
to "keep in sync" the files under "/home/cu2000/Logs" on the remote computer<br />
with files on "/home/chirico/dev/MEDIA_Server" on the local computer.<br />
<br />
$ rsync -Lae ssh donkey@192.168.1.171:/home/cu2000/Logs /home/chirico/dev/MEDIA_Server<br />
<br />
"rsync" is a convient command for keeping files in sync, and as shown here will work<br />
through ssh. The -L option tells rsync to treat symbolic links like ordinary files.<br />
<br />
Also see [http://www.rsnapshot.org/]<br />
<br />
<br />
<br />
TIP 23:<br />
<br />
Looking up the Spelling of a Word.<br />
<br />
$ look <partial spelling><br />
<br />
so the following will list all words that<br />
start with stuff<br />
<br />
$ look stuff<br />
stuff<br />
stuffage<br />
stuffata<br />
stuffed<br />
stuffender<br />
stuffer<br />
stuffers<br />
stuffgownsman<br />
stuffier<br />
stuffiest<br />
stuffily<br />
stuffiness<br />
stuffinesses<br />
stuffiness's<br />
stuffing<br />
stuffings<br />
stuffing's<br />
stuffless<br />
stuffs<br />
stuffy<br />
<br />
It helps to have a large "linuxwords" dictionary. You can download<br />
a much bigger dictionary from the following:<br />
<br />
http://prdownloads.sourceforge.net/souptonuts/linuxwords.1.tar.gz?download<br />
<br />
Note: vim users can setup the .vimrc file with the following. Now when you type <br />
CTL-X CTL-T in insert mode, you'll get a thesaurus lookup.<br />
<br />
set dictionary+=/usr/share/dict/words<br />
set thesaurus+=/usr/share/dict/words<br />
<br />
Or, you can call aspell with the F6 command after putting the folling entry in your<br />
.vimrc file<br />
<br />
:nmap <F6> :w<CR>:!aspell -e -c %<CR>:e<CR><br />
<br />
Now, hit F6 when you're in vim, and you'll get a spell checker.<br />
<br />
<br />
There is also an X Windows dictionary that runs with the following command.<br />
<br />
$ gnome-dictionary<br />
<br />
<br />
<br />
TIP 24:<br />
<br />
Find out if a Command is Aliased.<br />
<br />
$ type -all <command><br />
<br />
Example:<br />
<br />
$ type -all ls<br />
ls is aliased to `ls --color=tty'<br />
ls is /bin/ls<br />
<br />
<br />
<br />
TIP 25:<br />
<br />
Create a Terminal Calculator<br />
<br />
Put the following in your .bashrc file<br />
<br />
function calc<br />
{<br />
echo "${1}"|bc -l;<br />
}<br />
<br />
Or, run it at the shell prompt. Now<br />
"calc" from the shell will work as follows:<br />
<br />
$ calc 3+45<br />
48<br />
<br />
All functions with a "(" or ")" must be enclosed<br />
in quotes. For instance, to get the sin of .4<br />
<br />
$ calc "s(.4)"<br />
.38941834230865049166<br />
<br />
(See TIP 115 using the expr command)<br />
<br />
<br />
<br />
TIP 26:<br />
<br />
Kill a User and All Their Current Processes.<br />
<br />
<br />
#!/bin/bash<br />
# This program will kill all processes from a<br />
# user. The user name is read from the command line.<br />
#<br />
# This program also demonstrates reading a bash variable<br />
# into an awk script.<br />
#<br />
# Usage: kill9user <user><br />
#<br />
kill -9 `ps aux|awk -v var=$1 '$1==var { print $2 }'`<br />
<br />
or if you want want to create the above script the command<br />
below will kill the user "donkey" and all of his processes.<br />
<br />
$ kill -9 `ps aux|awk -v var="donkey" '$1==var { print $2 }'`<br />
<br />
Check their cron jobs and "at" jobs, if you have a security issue.<br />
<br />
$ crontab -u <user> -e<br />
<br />
Lock the account:<br />
<br />
$ passwd -l <user><br />
<br />
Remove all authorized_keys<br />
<br />
$ rm /home/user/.shosts<br />
$ rm /home/user/.rhosts<br />
$ rm -rf /home/user/.ssh<br />
$ rm /home/user/.forward<br />
<br />
or consider<br />
<br />
$ mv /home/user /home/safeuser<br />
<br />
<br />
Change the shell<br />
<br />
$ chsh -s /bin/true <user><br />
<br />
Do an inventory<br />
<br />
$ find / -user <user> > list_of_user_files<br />
<br />
NOTE: Also see (TIP 10).<br />
<br />
To see all users, except the current user. Do not use the<br />
dash "ps -aux" is wrong but the following is correct:<br />
<br />
$ ps aux| awk '!/'${USER}'/{printf("%s \n",$0)}'<br />
<br />
or (ww = wide, wide output)<br />
<br />
$ ps auwwx| awk '!/'${USER}'/{printf("%s \n",$0)}'<br />
<br />
<br />
The following codes may be useful:<br />
<br />
D Uninterruptible sleep (usually IO)<br />
R Running or runnable (on run queue)<br />
S Interruptible sleep (waiting for an event to complete)<br />
T Stopped, either by a job control signal or because it is being traced.<br />
W paging (not valid since the 2.6.xx kernel)<br />
X dead (should never be seen)<br />
Z Defunct ("zombie") process, terminated but not reaped by its parent.<br />
<br />
For BSD formats and when the stat keyword is used, additional<br />
characters may be displayed:<br />
<br />
< high-priority (not nice to other users)<br />
N low-priority (nice to other users)<br />
L has pages locked into memory (for real-time and custom IO)<br />
s is a session leader<br />
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)<br />
+ is in the foreground process group<br />
<br />
<br />
Also see TIP 28. and TIP 89.<br />
<br />
<br />
<br />
TIP 27:<br />
<br />
Format Dates for Logs and Files<br />
<br />
$ date "+%m%d%y %A,%B %d %Y %X"<br />
061704 Thursday,June 17 2004 07:13:40 PM<br />
<br />
$ date "+%m%d%Y"<br />
06172004<br />
<br />
$ date -d '1 day ago' "+%m%d%Y"<br />
06162004<br />
<br />
$ date -d '3 months 1 day 2 hour 15 minutes 2 seconds ago'<br />
<br />
or to go into the future remove the "ago"<br />
<br />
$ date -d '3 months 1 day 2 hour 15 minutes 2 seconds '<br />
<br />
Also the following works:<br />
<br />
$ date -d '+2 year +1 month -1 week +3 day -8 hour +2 min -5 seconds'<br />
<br />
Quick question: If there are 100,000,000 stars in the visible sky, and you can<br />
count them, round the clock, at a rate of a star per second starting now, when<br />
would you finish counting? Would you still be alive?<br />
<br />
$ date -d '+100000000 seconds'<br />
<br />
Sooner than you think!<br />
<br />
This can be assigned to variables<br />
<br />
$ mdate=`date -d '3 months 1 day 2 hour 15 minutes 2 seconds ' "+%m%d%Y_%A_%B_%D_%Y_%X" `<br />
$ echo $mdate<br />
09182004_Saturday_September_09/18/04_2004_09:40:41 PM<br />
^---- Easy to sort ^-------^----- Easy to read<br />
<br />
See TIP 28 below.<br />
<br />
See TIP 87 when working with large delta time changes -40 years, or -200 years ago, or even<br />
1,000,000 days into the future.<br />
<br />
Also see (TIP 1) for working with time zones.<br />
<br />
<br />
<br />
TIP 28:<br />
<br />
Need Ascii Codes? For instance, for printing quotes:<br />
<br />
awk 'BEGIN { msg = "Don\047t Panic!"; printf "%s \n",msg }'<br />
or<br />
awk 'BEGIN { msg = "Don\x027t Panic!"; printf "%s \n",msg }'<br />
<br />
It's better to use \047, because certain characters that follow \x027 may cause problems.<br />
<br />
For example, take a look at the following two lines. The first line prints a "}" caused<br />
by the extra D in \x027D. The the line immediately below does not work as expected.<br />
<br />
awk 'BEGIN {printf("The D causes problems \x027D\n")}'<br />
<br />
However, the line below works fine:<br />
<br />
awk 'BEGIN {printf("The D does not cause problems \047D\n")}'<br />
<br />
Or if you wanted to use the date command in "awk" to print date.time.nanosecond.timezone for<br />
each line of a file "test".<br />
<br />
The following date can be used in awk because the single quotes are enclosed within the<br />
double quotes.<br />
<br />
date '+%m%d%Y.%H%M%S.%N%z'<br />
<br />
$ awk 'BEGIN { "date '+%m%d%Y.%H%M%S.%N%z'" | getline MyDate } { print MyDate,$0 }' < data<br />
<br />
But it's also possible to replace "+" with \x2B, "%" with \x25, and "d" with \x64 as follows:<br />
<br />
$ awk 'BEGIN { "date \x27\x2B\x25m\x25\x64\x25Y.\x25H\x25M\x25S.\x25N\x25z\x27" | getline MyDate } { print MyDate,$0 }' < test<br />
<br />
07062004.113820.346033000-0400 bob 71<br />
07062004.113820.346033000-0400 tom 43<br />
07062004.113820.346033000-0400 sal 34<br />
07062004.113820.346033000-0400 bob 89<br />
07062004.113820.346033000-0400 tom 66<br />
07062004.113820.346033000-0400 sal 99<br />
<br />
For this example it's not needed because single quotes are used inside of double quotes; however, there may be times when<br />
hex replacement is easier.<br />
<br />
<br />
$ man ascii<br />
<br />
Oct Dec Hex Char Oct Dec Hex Char<br />
-----------------------------------------------------------<br />
000 0 00 NUL '\0' 100 64 40 @<br />
001 1 01 SOH 101 65 41 A<br />
002 2 02 STX 102 66 42 B<br />
003 3 03 ETX 103 67 43 C<br />
004 4 04 EOT 104 68 44 D<br />
005 5 05 ENQ 105 69 45 E<br />
006 6 06 ACK 106 70 46 F<br />
007 7 07 BEL '\a' 107 71 47 G<br />
010 8 08 BS '\b' 110 72 48 H<br />
011 9 09 HT '\t' 111 73 49 I<br />
012 10 0A LF '\n' 112 74 4A J<br />
013 11 0B VT '\v' 113 75 4B K<br />
014 12 0C FF '\f' 114 76 4C L<br />
015 13 0D CR '\r' 115 77 4D M<br />
016 14 0E SO 116 78 4E N<br />
017 15 0F SI 117 79 4F O<br />
020 16 10 DLE 120 80 50 P<br />
021 17 11 DC1 121 81 51 Q<br />
022 18 12 DC2 122 82 52 R<br />
023 19 13 DC3 123 83 53 S<br />
024 20 14 DC4 124 84 54 T<br />
025 21 15 NAK 125 85 55 U<br />
026 22 16 SYN 126 86 56 V<br />
027 23 17 ETB 127 87 57 W<br />
030 24 18 CAN 130 88 58 X<br />
031 25 19 EM 131 89 59 Y<br />
032 26 1A SUB 132 90 5A Z<br />
033 27 1B ESC 133 91 5B [<br />
034 28 1C FS 134 92 5C \ '\\'<br />
035 29 1D GS 135 93 5D ]<br />
036 30 1E RS 136 94 5E ^<br />
037 31 1F US 137 95 5F _<br />
040 32 20 SPACE 140 96 60 `<br />
041 33 21 ! 141 97 61 a<br />
042 34 22 " 142 98 62 b<br />
043 35 23 # 143 99 63 c<br />
044 36 24 $ 144 100 64 d<br />
045 37 25 % 145 101 65 e<br />
046 38 26 & 146 102 66 f<br />
047 39 27 ' 147 103 67 g<br />
050 40 28 ( 150 104 68 h<br />
051 41 29 ) 151 105 69 i<br />
052 42 2A * 152 106 6A j<br />
053 43 2B + 153 107 6B k<br />
054 44 2C , 154 108 6C l<br />
055 45 2D - 155 109 6D m<br />
056 46 2E . 156 110 6E n<br />
057 47 2F / 157 111 6F o<br />
060 48 30 0 160 112 70 p<br />
061 49 31 1 161 113 71 q<br />
062 50 32 2 162 114 72 r<br />
063 51 33 3 163 115 73 s<br />
064 52 34 4 164 116 74 t<br />
065 53 35 5 165 117 75 u<br />
066 54 36 6 166 118 76 v<br />
067 55 37 7 167 119 77 w<br />
070 56 38 8 170 120 78 x<br />
071 57 39 9 171 121 79 y<br />
072 58 3A : 172 122 7A z<br />
073 59 3B ; 173 123 7B {<br />
074 60 3C < 174 124 7C |<br />
075 61 3D = 175 125 7D }<br />
076 62 3E > 176 126 7E ~<br />
077 63 3F ? 177 127 7F DEL<br />
<br />
<br />
<br />
TIP 29:<br />
<br />
Need a WWW Browser for the Terminal Session? Try lynx or elinks.<br />
<br />
$ lynx<br />
<br />
Or to read all these tips, with the latest updates<br />
<br />
$ lynx http://umn.dl.sourceforge.net/sourceforge/souptonuts/How_to_Linux_and_Open_Source.txt<br />
<br />
<br />
Or, better yet elinks.<br />
<br />
$ elinks http://somepage.<br />
<br />
You can get elinks at the following site:<br />
<br />
http://elinks.or.cz/<br />
<br />
<br />
<br />
TIP 30:<br />
<br />
screen - screen manager with VT100/ANSI terminal emulation<br />
<br />
This is an excellent utility. But if you work a lot in Emacs,<br />
then, you should place the following in your ~./.bashrc<br />
<br />
alias s='screen -e^Pa -D -R'<br />
<br />
After loging in again (or source .bashrc) ,<br />
type the following to load "screen":<br />
<br />
$ s<br />
<br />
If you're using the not using the alias command above, substitute<br />
CTL-a for CTL-p below. :<br />
<br />
CTL-p CTL-C To get a new session<br />
CTL-p " To list sessions, and arrow keys to move<br />
CTL-p SHFT-A To name sessions<br />
CTL-p S To split screens<br />
CLT-p Q To unsplit screens<br />
CLT-p TAB To switch between screens<br />
CLT-p :resize n To resize screen to n rows, on split screen<br />
<br />
<br />
Screen is very powerful. Should you become disconneced, you can<br />
still resume work after loggin in.<br />
<br />
$ man screen<br />
<br />
The above command will give you more information.<br />
<br />
<br />
<br />
TIP 31:<br />
<br />
Need to Find the Factors of a Number?<br />
<br />
$ factor 2345678992<br />
2345678992: 2 2 2 2 6581 22277<br />
<br />
It's a quick way to find out if a number is prime<br />
<br />
$ factor 7867<br />
7867: 7867<br />
<br />
<br />
<br />
TIP 32:<br />
<br />
Less is More -- piping to less to scroll backword and forward<br />
<br />
For large "ls" listings try the followin, then, use the arrow key<br />
to move up and down the list.<br />
<br />
$ ls /some_large_dir/ | less<br />
<br />
or<br />
<br />
$ cat some_large_file | less<br />
<br />
or<br />
<br />
$ less some_large_file<br />
<br />
<br />
<br />
TIP 33:<br />
<br />
C "indent" Settings for Kernel Development<br />
<br />
$ indent -kr -i8 program.c<br />
<br />
<br />
<br />
TIP 34:<br />
<br />
FTP auto-login. "ftp" to a site and have the password stored.<br />
<br />
For instance, here's a sample ".net" file in a user's home<br />
directory for uploading to sourceforge. Note, sourceforge will<br />
take any password, so m@temp.com is used here for login "anonymous".<br />
<br />
$ cat ~/.netrc<br />
machine upload.sourceforge.net login anonymous password m@temp.com<br />
default login anonymous password user@site<br />
<br />
It might be a good idea to change the rights on this file<br />
<br />
$ chmod 0400 ~/.netrc<br />
<br />
<br />
#!/bin/bash<br />
#<br />
# Sample ftp automated script to download<br />
# file to ${dwnld}<br />
#<br />
dwnld="/work/faq/unix-faq"<br />
cd ${dwnld}<br />
ftp << FTPSTRING<br />
prompt off<br />
open rtfm.mit.edu<br />
cd /pub/usenet-by-group/news.answers/unix-faq/faq<br />
mget contents<br />
mget diff<br />
mget part*<br />
bye<br />
FTPSTRING<br />
<br />
<br />
(Also see TIP 114 for ncftpget, which is a very powerful restarting<br />
ftp program)<br />
<br />
<br />
<br />
TIP 35:<br />
<br />
Bash Brace Expansion<br />
<br />
$ echo f{ee,ie,oe,um}<br />
fee fie foe fum<br />
<br />
This works with almost any command<br />
<br />
$ mkdir -p /work/junk/{one,two,three,four}<br />
<br />
<br />
<br />
TIP 36:<br />
<br />
Getting a List of Users on the System<br />
<br />
$ cut -d: -f1 /etc/passwd | sort<br />
<br />
<br />
<br />
TIP 37:<br />
<br />
Editing a Bash Command<br />
<br />
Try typing a long command say, then, type "fc" for an easy way<br />
to edit the command.<br />
<br />
$ find /etc -iname '*.cnf' -exec grep -H 'log' {} \;<br />
$ fc<br />
<br />
"fc" will bring the last command typed into an editor, "emacs" if<br />
that's the default editor. Type "fc -l" to list last few commands.<br />
<br />
To seach for a command, try typing "CTL-r" at the shell prompt for<br />
searching. "CTL-t" to transpose, say "sl" was typed by you want "ls".<br />
<br />
<br />
<br />
Hints when using "fc: in emacs:<br />
<br />
ESC-b move one word backward<br />
ESC-f move one word forward<br />
ESC-DEL kill one word backward<br />
CTL-k kill point to end<br />
CTL-y un-yank killed region at point<br />
<br />
<br />
<br />
TIP 38:<br />
<br />
Moving around Directories.<br />
<br />
Change to the home directory:<br />
$ cd ~<br />
or<br />
$ cd<br />
<br />
To go back to the last directory<br />
$ cd -<br />
<br />
Instead of "cd" to a directory try "pushd" and look<br />
at the heading...you can see a list of directories.<br />
<br />
$ pushd /etc<br />
$ pushd /usr/local<br />
<br />
Then, to get back "popd" or "popd 1"<br />
<br />
To list all the directories pushed on the stack<br />
use the "dirs -v" command.<br />
<br />
$ dirs -v<br />
0 /usr/local<br />
1 /etc<br />
2 /work/souptonuts/documentation/theBook<br />
<br />
Now, if you "pushd +1" you will be moved to "/etc", since<br />
is number "1" on the stack, and this directory will become<br />
"0".<br />
<br />
$ pwd<br />
/usr/local<br />
$ pushd +1<br />
$ pwd<br />
/etc<br />
<br />
$ dirs -v<br />
0 /etc<br />
1 /work/souptonuts/documentation/theBook<br />
2 /usr/local<br />
<br />
<br />
<br />
TIP 39:<br />
<br />
Need an Underscore after a Variable?<br />
<br />
Enclose the variable in "{}".<br />
<br />
$echo ${UID}_<br />
<br />
Compare to<br />
<br />
$echo $UID_<br />
<br />
Also try the following:<br />
<br />
<br />
$ m="my stuff here"<br />
$ echo -e ${m// /'\n'}<br />
my<br />
stuff<br />
here<br />
<br />
<br />
<br />
TIP 40:<br />
<br />
Bash Variable Offset and String Operators<br />
<br />
$ r="this is stuff"<br />
$ echo ${r:3}<br />
$ echo ${r:5:2}<br />
<br />
Note, ${varname:offset:length}<br />
<br />
<br />
${varname:?message} If varname exist and isn't null return value, else,<br />
print var and message.<br />
<br />
$ r="new stuff"<br />
$ echo ${r:? "that's r for you"}<br />
new stuff<br />
$ unset r<br />
$ echo ${r:? "that's r for you"}<br />
bash: r: that's r for you<br />
<br />
${varname:+word} If varname exist and not null return word. Else, return null.<br />
<br />
${varname:-word} If varname exist and not null return value. Else, return word.<br />
<br />
Working with arrays in bash - bash arrays.<br />
<br />
$ unset p<br />
$ p=(one two three)<br />
<br />
$ echo -e "${p[@]}"<br />
one two three<br />
<br />
or<br />
<br />
$ echo -e "${p[*]}"<br />
one two three<br />
<br />
$ echo -e "${#p[@]}"<br />
3<br />
<br />
$ echo -e "${p[0]}"<br />
one<br />
<br />
$ echo -e "${p[1]}"<br />
two<br />
<br />
Also see (TIP 95)<br />
<br />
<br />
<br />
TIP 41:<br />
<br />
Loops in Bash<br />
<br />
<br />
The command below loops through directories listed in $PATH.<br />
<br />
$ path=$PATH:<br />
$ while [ $path ]; do echo " ${path%%:*} "; path=${path#*:}; done<br />
<br />
The command below will also loop through directories in your path.<br />
<br />
$IFS=:<br />
$ for dir in $PATH<br />
> do<br />
> ls -ld $dir<br />
> done<br />
drwxr-xr-x 2 root root 4096 Jun 10 20:16 /usr/local/bin<br />
drwxr-xr-x 2 root root 4096 Jun 13 23:12 /bin<br />
drwxr-xr-x 3 root root 40960 Jun 12 08:00 /usr/bin<br />
drwxr-xr-x 2 root root 4096 Feb 14 03:12 /usr/X11R6/bin<br />
drwxrwxr-x 2 chirico chirico 4096 Jun 6 13:06 /home/chirico/bin<br />
<br />
Other ways of doing loops:<br />
<br />
for (( i=1; i <= 20; i++))<br />
do<br />
echo -n "$i "<br />
done<br />
<br />
Note, to do it all on one line, do the following:<br />
<br />
$ for (( i=1; i <= 20; i++)); do echo -n "$i"; done<br />
<br />
Below, is an example of declaring i an integer so that you do not<br />
have to preface with let.<br />
<br />
$ declare -i i<br />
$ i=5;<br />
$ while (( $i > 1 )); do<br />
> i=i-1<br />
> echo $i<br />
> done<br />
4<br />
3<br />
2<br />
<br />
You can also use "while [ $i -gt 1 ]; do" in place of "while (( $i > 1 )); do"<br />
<br />
To get a listing of all declared values<br />
<br />
$ declare -i<br />
<br />
<br />
Try putting a few words in the file "test"<br />
<br />
$ while read filename; do echo "- $filename "; done < test |nl -w1<br />
<br />
Or, using an array<br />
<br />
declare -a Array<br />
Array[0]="zero"<br />
Array[1]="one"<br />
Array[2]="two"<br />
for i in `seq ${#Array[@]}`<br />
do<br />
echo $Array[$i-1]<br />
done<br />
<br />
Also see (TIP 95 and TIP 133).<br />
<br />
<br />
<br />
TIP 42:<br />
<br />
"diff" and "patch".<br />
<br />
You have created a program "prog.c", saved as this name and also copied<br />
to "prog.c.old". You post "prog.c" to users. Next, you make changes<br />
to prog.c<br />
<br />
$ diff -c prog.c.old prog.c > prog.patch<br />
<br />
Now, users can get the latest updates by running.<br />
<br />
$ patch < prog.patch<br />
<br />
By the way, you can make backups of your data easily.<br />
<br />
$ cp /etc/fstab{,.bak}<br />
<br />
Now, you do your edits to "/etc/fstab" and if you need<br />
to go back to the original, you can find it at<br />
"/etc/fstab.bak".<br />
<br />
<br />
<br />
TIP 43:<br />
<br />
"cat" the Contents of Files Listed in a File, in That Order.<br />
<br />
SETUP (Assume you have the following)<br />
<br />
$ cat file_of_files<br />
file1<br />
file2<br />
<br />
$ cat file1<br />
This is the data in file1<br />
<br />
$ cat file 2<br />
This is the data in file2<br />
<br />
So there are 3 files here "file_of_files" which contains the name of<br />
other files. In this case "file1" and "file2". And the contents of<br />
"file1" and "file2" is shown above.<br />
<br />
$ cat file_of_files|xargs cat<br />
This is the data in file1<br />
This is the data in file2<br />
<br />
<br />
<br />
<br />
TIP 44:<br />
<br />
Columns and Rows -- getting anything you want.<br />
<br />
Assume you have the following file.<br />
<br />
$ cat data<br />
1 2 3<br />
4 5<br />
6 7 8 9 10<br />
11 12<br />
13 14<br />
<br />
How to you get everything in 2 columns?<br />
<br />
$ cat data|tr ' ' '\n'|xargs -l2<br />
1 2<br />
3 4<br />
5 6<br />
7 8<br />
9 10<br />
11 12<br />
13 14<br />
<br />
Three columns?<br />
<br />
$ cat data|tr ' ' '\n'|xargs -l3<br />
1 2 3<br />
4 5 6<br />
7 8 9<br />
10 11 12<br />
13 14<br />
<br />
What's the row sum of the "three columns?"<br />
<br />
$ cat data|tr ' ' '\n'|xargs -l3|tr ' ' '+'|bc<br />
6<br />
15<br />
24<br />
33<br />
27<br />
<br />
or<br />
<br />
$ tr ' ' '\n' < data |xargs -l3|tr ' ' '+'|bc<br />
<br />
NOTE "Steven Heiner's rule":<br />
<br />
cat one_file | program<br />
<br />
can always be rewritten as<br />
<br />
program < one_file<br />
<br />
Note: thanks to Steven Heiner (http://www.shelldorado.com/) the above can be<br />
shortened as follows:<br />
<br />
$ tr ' ' '\n' < data|xargs -l3|tr ' ' '+'|bc<br />
<br />
Need to "tr" from the stdin?<br />
<br />
$ tr "xy" "yx"| ... | ...<br />
<br />
But there is a the "Stephane CHAZELAS" condition here<br />
<br />
"Note that tr, sed, and awk mail fail on files containing '\0'<br />
sed and awk have unspecified behaviors if the input<br />
doesn't end in a '\n' (or to sum up, cat works for<br />
binary and text files, text utilities such as sed or awk<br />
work only for text files).<br />
<br />
<br />
<br />
TIP 45:<br />
<br />
Auto Directory Spelling Corrections.<br />
<br />
To turn this on:<br />
<br />
$ shopt -s cdspell<br />
<br />
Now mispell a directory in the cd command.<br />
<br />
$ cd /usk/local<br />
^-------- still gets you to --<br />
|<br />
/usr/local<br />
<br />
What other options can you set? The following will list<br />
all the options:<br />
<br />
$ shopt -p<br />
<br />
<br />
<br />
TIP 46:<br />
<br />
Record Eveything Printed on Your Terminal Screen.<br />
<br />
$ script -a <filename><br />
<br />
Now start doing stuff and "everything" is appended to <filename>.<br />
For example<br />
<br />
$ script installation<br />
<br />
$ (command)<br />
<br />
$ (result)<br />
<br />
$ ...<br />
<br />
$ ...<br />
<br />
$ (command)<br />
<br />
$ (result)<br />
<br />
$ exit<br />
<br />
The whole session log is in the installation file that you can later<br />
read and/or cleanup and add to a documentation.<br />
<br />
This command can also be used to redirect the contents to another user,<br />
but you must be root to do this.<br />
<br />
Step 1 - find out what pts they are using.<br />
<br />
$ w<br />
<br />
Step 2 - Run script on that pts. After running this command below<br />
everything you type will appear on their screen.<br />
<br />
$ script /dev/pts/4<br />
<br />
<br />
Thanks to Jacques.GARNIER-EXTERIEUR@EU.RHODIA.COM for his contribution<br />
to this tip.<br />
<br />
Also reference TIP 208.<br />
<br />
<br />
<br />
TIP 47:<br />
<br />
Monitor all Network Traffic Except Your Current ssh Connection.<br />
<br />
$ tcpdump -i eth0 -nN -vvv -xX -s 1500 port not 22<br />
<br />
Or to filter out port 123 as well getting the full length of the packet<br />
(-s 0), use the following:<br />
<br />
$ tcpdump -i eth0 -nN -vvv -xX -s 0 port not 22 and port not 123<br />
<br />
Or to filter only a certain host say 81.169.158.205<br />
<br />
$ tcpdump -i eth0 -nN -vvv -xX port not 22 and host 81.169.158.205<br />
<br />
Just want ip addresses and a little bit of data, then,<br />
use this. The "-c 20" is to stop after 20 packets.<br />
<br />
$ tcpdump -i eth0 -nN -s 1500 port not 22 -c 20<br />
<br />
If you're looking for sign of DOS attacks, the following show just the SYN<br />
packets on all interfaces:<br />
<br />
$ tcpdump 'tcp[13] & 2 == 2'<br />
<br />
<br />
<br />
TIP 48:<br />
<br />
Where are the GNU Reference Manuals?<br />
<br />
http://www.gnu.org/manual/manual.html<br />
<br />
Also worth a look the "Linux Documentation Project"<br />
<br />
http://en.tldp.org/<br />
<br />
and Red Hat manuals<br />
<br />
http://www.redhat.com/docs/manuals/enterprise/<br />
<br />
<br />
<br />
TIP 49:<br />
<br />
Setting or Changing the Library Path.<br />
<br />
The following contains the settings to be added or deleted<br />
<br />
/etc/ld.so.conf<br />
<br />
After this file is edited, you must run the following:<br />
<br />
$ ldconfig<br />
<br />
See "man ldconfig" for more information.<br />
<br />
<br />
<br />
TIP 50:<br />
<br />
Working with Libraries in C<br />
<br />
Assume the following 3 programs:<br />
<br />
$ cat ./src/test.c<br />
<br />
int test(int t)<br />
{<br />
printf("%d\n",t);<br />
return t;<br />
}<br />
<br />
<br />
$ cat ./src/prog1.c<br />
<br />
/*<br />
program: prog1.c<br />
dependences: test.c<br />
<br />
compiling this program:<br />
gcc -o prog test.c prog1.c<br />
<br />
Note the libpersonal include<br />
should be remove if NOT using the<br />
library<br />
*/<br />
<br />
#include <libpersonal.h><br />
#include <stdio.h><br />
int<br />
main(int argc, char **argv)<br />
{<br />
test(45);<br />
}<br />
<br />
$ cat ./include/libpersonal.h<br />
<br />
extern int test(int);<br />
<br />
<br />
Prog1.c needs the test function in test.c<br />
To compile, so that both programs work together, do the following:<br />
<br />
$ cd src<br />
$ gcc -o prog test.c prog1.c -I../include<br />
<br />
However, if you want to create your own static library, then, run the following:<br />
<br />
$ mkdir -p ../lib<br />
$ gcc -c test.c -o ../lib/test.o<br />
$ cd ../lib<br />
$ ar r libpersonal.a test.o<br />
$ ranlib libpersonal.a<br />
<br />
or, the ar and ranlib command can be combined as follows:<br />
<br />
$ ar rs libpersonal.a test.o<br />
<br />
To compile the program with the static library:<br />
<br />
$ cd ../src<br />
$ gcc -I../include -L../lib -o prog1 prog1.c -lpersonal<br />
<br />
<br />
The -I../include tells gcc to look in the ../include directory for<br />
libpersonal.h. and -L../lib, tells gcc to look for the<br />
"libpersonal.a" library.<br />
<br />
$ cd ..<br />
$ tree src lib include<br />
src<br />
|-- prog<br />
|-- prog1<br />
|-- prog1.c<br />
`-- test.c<br />
lib<br />
|-- libpersonal.a<br />
`-- test.o<br />
include<br />
`-- libpersonal.h<br />
<br />
This was a STATIC library. Often times you will want to use a SHARED<br />
or dynamic library.<br />
<br />
SHARED LIBRARY:<br />
<br />
You must recompile test.c with -fpic option.<br />
<br />
$ cd ../lib<br />
$ gcc -c -fpic ../src/test.c -o test.o<br />
<br />
Next create the libpersonal.so file.<br />
<br />
$ gcc -shared -o libpersonal.so test.o<br />
<br />
Now, compile the source prog1.c as follows:<br />
<br />
$ cd ../src<br />
$ gcc -Wl,-R../lib -L../lib -I../include -o prog2 prog1.c -lpersonal<br />
<br />
This should work fine. But, take a look at prog2 using the ldd command.<br />
<br />
$ ldd prog2<br />
<br />
libpersonal.so => ../lib/libpersonal.so (0x40017000)<br />
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)<br />
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)<br />
<br />
If you move the program prog2 to a different location, it will not run.<br />
Instead you will get the following error:<br />
<br />
prog2: error while loading shared libraries: libpersonal.so:<br />
cannot open shared object file: No such file or directory<br />
<br />
To fix this, you should specify the direct path to the library. And in my<br />
case it is rather long<br />
<br />
$ gcc -Wl,-R/work/souptonuts/documentation/theBook/lib -L../lib -I../include -o prog2 prog1.c -lpersonal<br />
<br />
SPECIAL NOTE: The -R must always follow the -Wl. (-Wl,-R<directory>) They always go together<br />
<br />
<br />
<br />
TIP 51:<br />
<br />
Actively Monitor a File and Send Email when Expression Occurs.<br />
<br />
This is a way to monitor "/var/log/messages" or any file for certain changes.<br />
The example below actively monitors "stuff" for the work "now" and as soon as<br />
"now" is added to the file, the contents of msg are sent to the user<br />
mikechirico@hotmail.com<br />
<br />
$ tail -f stuff | \<br />
awk ' /now/ { system("mail -s \"This is working\" mikechirico@hotmail.com < msg") }'<br />
<br />
Or, you can run a program, say get headings on slashdot from the program "getslash.php" which<br />
runs on "192.168.1.155" with account "chirico". Assuming you have ssh keys setup, then, the following<br />
will send mail from the output:<br />
<br />
$ ssh chirico@192.168.1.155 "./bin/getslash.php"|mail -s "Slash cron Headlines" mchirico@comcast.net<br />
<br />
See (TIP 80) for scraping the headings on slash dot and how to get a copy of "getslash.php". If you still<br />
want to use awk:<br />
<br />
$ ssh chirico@192.168.1.155 "./bin/getslash.php"| \<br />
awk '{ print $0 | "mail -s \x27 Slash Topics \x27 mchirico@comcast.net "}'<br />
<br />
Note the "\x27" is a quote. Maybe you only want articles dealing with "Linux":<br />
<br />
$ ssh chirico@192.168.1.155 "./bin/getslash.php"| \<br />
awk '/Linux/{ print $0 | "mail -s \x27 Slash Topics \x27 mchirico@comcast.net "}'<br />
<br />
For $60, you can get a numeric display from "delcom engineering" that you can send messages and<br />
data to. I get weather information off the internet and send it to this device.<br />
<br />
http://sourceforge.net/projects/delcom/<br />
<br />
(Reference TIP 151 for ssh tips)<br />
<br />
<br />
<br />
TIP 52:<br />
<br />
Need to Keep Secrets? Encrypt it.<br />
<br />
To Encrypt:<br />
<br />
$ openssl des3 -salt -in file.txt -out file.des3<br />
<br />
The above will prompt for a password, or you can put it in<br />
with a -k option, assuming you're on a trusted server.<br />
<br />
To Decrypt<br />
<br />
$ openssl des3 -d -salt -in file.des3 -out file.txt -k mypassword<br />
<br />
Need to encrypt what you type? Enter the following, then start typing<br />
and ^D to end.<br />
<br />
$ openssl des3 -salt -out stuff.txt<br />
<br />
<br />
<br />
TIP 53:<br />
<br />
Check that a File has Not Been Tampered With: Use Cryptographic Hashing Function.<br />
<br />
The md5sum is popular but dated<br />
<br />
$ md5sum file<br />
<br />
Instead, use one of the following;<br />
<br />
$ openssl dgst -sha1 -c file<br />
<br />
$ openssl dgst -ripemd160 -c file<br />
<br />
All calls give a fixed length string or "message digest".<br />
<br />
<br />
<br />
TIP 54:<br />
<br />
Need to View Information About a Secure Web Server? A SSL/TLS test.<br />
<br />
$ openssl s_client -connect www.sourceforge.net:443<br />
<br />
Above will give a long listing of certificates.<br />
<br />
Note, it is also possible to get certificate information about a mail server<br />
<br />
$ openssl s_client -connect mail.comcast.net:995 -showcerts<br />
<br />
When you do the above command you get two certificates. If you copy<br />
past both certificates by taking the following contents include the<br />
begin and end show below:<br />
<br />
-----BEGIN CERTIFICATE-----<br />
....<br />
-----END CERTIFICATE-----<br />
<br />
Then create files "comcast0.pem" and "comcast1.pem" out of these certificaties and<br />
put them in a directory "/home/donkey/.certs", then, with the openssl src package, in<br />
the "./tools/c_rehash" run<br />
<br />
$ c_rehash .certs<br />
Doing .certs<br />
comcast0.pem => 72f90dc0.0<br />
comcast1.pem => f73e89fd.0<br />
<br />
Now it's possible to have fetchmail work with these certs.<br />
<br />
#<br />
#<br />
# Sample .fetchmailrc file for Comcast<br />
#<br />
# Check mail every 90 seconds<br />
set daemon 90<br />
set syslog<br />
set postmaster donkey<br />
#set bouncemail<br />
#<br />
# Comcast email is zdonkey but computer account is just donkey<br />
#<br />
poll mail.comcast.net with proto POP3 and options no dns<br />
user 'zdonkey' with pass "somethin35" is 'donkey' here options ssl sslcertck sslcertpath '/home/donkey/.certs'<br />
smtphost comcast.net<br />
# currently not used<br />
mda '/usr/bin/procmail -d %T'<br />
<br />
<br />
REFERENCE: http://www.openssl.org/<br />
http://www.catb.org/~esr/fetchmail/fetchmail-6.2.5.tar.gz<br />
http://www.madboa.com/geek/openssl/<br />
<br />
<br />
<br />
TIP 55:<br />
<br />
cp --parents. What does this option do?<br />
<br />
Assume you have the following directory structure<br />
<br />
.<br />
|-- a<br />
| `-- b<br />
| `-- c<br />
| `-- d<br />
| |-- file1<br />
| `-- file2<br />
`-- newdir<br />
<br />
<br />
Issue the following command:<br />
<br />
$ cp --parents ./a/b/c/d/* ./newdir/<br />
<br />
Now you have the following:<br />
<br />
.<br />
|-- a<br />
| `-- b<br />
| `-- c<br />
| `-- d<br />
| |-- file1<br />
| `-- file2<br />
`-- newdir<br />
`-- a<br />
`-- b<br />
`-- c<br />
`-- d<br />
|-- file1<br />
`-- file2<br />
<br />
<br />
<br />
<br />
TIP 56:<br />
<br />
Quickly Locating files.<br />
<br />
The "locate" command quickly searches the indexed database for files. It just<br />
gives the name of the files; but, if you need more information use it as follows<br />
<br />
$ locate document|xargs ls -l<br />
<br />
The "locate" database may only get updated every 24 hours. For more recent finds,<br />
use the "find" command.<br />
<br />
<br />
<br />
TIP 57:<br />
<br />
Using the "find" Command.<br />
<br />
List only directories, max 2 nodes down that have "net" in the name<br />
<br />
$ find /proc -type d -maxdepth 2 -iname '*net*'<br />
<br />
Find all *.c and *.h files starting from the current "." position.<br />
<br />
$ find . \( -iname '*.c' -o -iname '*.h' \) -print<br />
<br />
Find all, but skip what's in "/CVS" and "/junk". Start from "/work"<br />
<br />
<br />
$ find /work \( -iregex '.*/CVS' -o -iregex '.*/junk' \) -prune -o -print<br />
<br />
Note -regex and -iregex work on the directory as well, which means<br />
you must consider the "./" that comes before all listings.<br />
<br />
Here is another example. Find all files except what is under the CVS, including<br />
CVS listings. Also exclude "#" and "~".<br />
<br />
$ find . -regex '.*' ! \( -regex '.*CVS.*' -o -regex '.*[#|~].*' \)<br />
<br />
Find a *.c file, then run grep on it looking for "stdio.h"<br />
<br />
$ find . -iname '*.c' -exec grep -H 'stdio.h' {} \;<br />
sample output --> ./prog1.c:#include <stdio.h><br />
./test.c:#include <stdio.h><br />
<br />
Looking for the disk-hog on the whole system?<br />
<br />
$ find / -size +10000k 2>/dev/null<br />
<br />
Looking for files changed in the last 24 hours? Make sure you add the<br />
minus sign "-1", otherwise, you will only find files changed exactly<br />
24 hours from now. With the "-1" you get files changed from now to 24<br />
hours.<br />
<br />
<br />
$ find . -ctime -1 -printf "%a %f\n"<br />
Wed Oct 6 12:51:56 2004 .<br />
Wed Oct 6 12:35:16 2004 How_to_Linux_and_Open_Source.txt<br />
<br />
Or if you just want files.<br />
<br />
$ find . -type f -ctime -1 -printf "%a %f\n"<br />
<br />
Details on file status change in the last 48 hours, current directory. Also note "-atime -2").<br />
<br />
$ find . -ctime -2 -type f -exec ls -l {} \;<br />
<br />
NOTE: if you don't use -type f, you make get "." returned, which<br />
when run through ls "ls ." may list more than what you want.<br />
<br />
Also you may only want the current directory<br />
<br />
$ find . -ctime -2 -type f -maxdepth 1 -exec ls -l {} \;<br />
<br />
To find files modified within the last 5 to 10 minutes<br />
<br />
$ find . -mmin +5 -mmin -10 <br />
<br />
<br />
For more example "find" commands, reference the following looking<br />
for the latest version of "bashscripts.x.x.x.tar.gz":<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=79320&package_id=80711<br />
<br />
See "TIP 71" for examples of find using the inode feature. " $ find . -inum <inode> -exec rm -- '{}' \; "<br />
<br />
If you don't want error messages, or need to redirect error messages "> /dev/null 2>&1", or see<br />
"TIP 81".<br />
<br />
<br />
<br />
TIP 58:<br />
<br />
Using the "rm" command.<br />
<br />
How do you remove a file that has the name "-". For instance, if you run the command<br />
"$ cat > - " and type some text followed by ^d, how does the "-" file get deleted?<br />
<br />
$ rm -- -<br />
<br />
The "--" nullifies any rm options.<br />
<br />
How do you delete the directory "one", all it's sub-directories, and any data?<br />
<br />
$ rm -rf ./one<br />
<br />
Note, to selectively delete stuff on a directory, use the find command "TIP 57".<br />
To delete by inode, see "TIP 71".<br />
<br />
<br />
<br />
TIP 59:<br />
<br />
Giving ownership.<br />
<br />
How do you give the user "donkey" ownership to all directories and files under<br />
"./fordonkey" ?<br />
<br />
$ chown -R donkey ./fordonkey<br />
<br />
<br />
<br />
TIP 60:<br />
<br />
Only Permit root login -- give others a message when they try to login.<br />
<br />
Create the file "/etc/nologin" with "nologin" containing the contents<br />
of the message.<br />
<br />
<br />
<br />
TIP 61:<br />
<br />
Limits: file size, open files, pipe size, stack size, max memory size<br />
cpu time, plus others.<br />
<br />
To get a listing of current limits:<br />
<br />
$ ulimit -a<br />
core file size (blocks, -c) 0<br />
data seg size (kbytes, -d) unlimited<br />
file size (blocks, -f) unlimited<br />
max locked memory (kbytes, -l) unlimited<br />
max memory size (kbytes, -m) unlimited<br />
open files (-n) 1024<br />
pipe size (512 bytes, -p) 8<br />
stack size (kbytes, -s) 8192<br />
cpu time (seconds, -t) unlimited<br />
max user processes (-u) 8179<br />
virtual memory (kbytes, -v) unlimited<br />
<br />
Note as a user you can decrease your limits in the current<br />
shell session; but, you cannot increase. This can be ideal<br />
for testing programs. But, first you may want to create<br />
another shell "sh" so that you can "go back to where started".<br />
<br />
$ ulimit -f 10<br />
<br />
Now try<br />
<br />
$ yes >> out<br />
File size limit exceeded<br />
<br />
To set limits on users, make changes to "/etc/security/limits.conf"<br />
<br />
bozo - maxlogins 1<br />
<br />
Will keep bozo from loging in more than once.<br />
<br />
To list hard limits:<br />
<br />
$ ulimit -Ha<br />
<br />
To list soft limits:<br />
<br />
$ ulimit -Sa<br />
<br />
To restrict user access by time, day make changes to<br />
"/etc/security/time.conf"<br />
<br />
Also take a look at "/etc/profile" to see what other changes<br />
can be made, plus take a look under "/etc/security/*.conf" for<br />
other configuration files.<br />
<br />
<br />
<br />
TIP 62:<br />
<br />
Stupid "cat" Tricks.<br />
<br />
Also see (TIP 43).<br />
<br />
If you have multiple blank lines, squeeze these lines down to one,<br />
then, try the following:<br />
<br />
$ cat -s <file><br />
<br />
Want to number the lines?<br />
<br />
$ cat -n <file><br />
<br />
Want to show tabs?<br />
<br />
$ cat -t <file><br />
<br />
Need to mark end of lines by "$"? The following was suggested by (Amos Shapira)<br />
<br />
$ cat -e <file><br />
<br />
Want to see all the ctl characters?<br />
<br />
/* ctlgen.c<br />
Program to generate ctl characters.<br />
<br />
Compile:<br />
<br />
gcc -o ctlgen ctlgen.c<br />
<br />
Run:<br />
<br />
./ctlgen > mout<br />
<br />
Now see the characters:<br />
<br />
cat -v mout<br />
<br />
Here's a sample output:<br />
<br />
<br />
$ cat -v mout|tail<br />
test M-v<br />
test M-w<br />
test M-x<br />
test M-y<br />
test M-z<br />
test M-{<br />
test M-|<br />
test M-}<br />
test M-~<br />
test M-^?<br />
<br />
*/<br />
#include <stdlib.h><br />
#include <stdio.h><br />
int main()<br />
{<br />
int i;<br />
<br />
for(i=0; i < 256; ++i)<br />
printf("test %c \n",i);<br />
<br />
return 0;<br />
}<br />
<br />
<br />
<br />
TIP 63:<br />
<br />
Guard against SYN attacks and "ping".<br />
<br />
As root do the following:<br />
<br />
echo 1 > /proc/sys/net/ipv4/tcp_syncookies<br />
<br />
Want to disable "ping" ?<br />
<br />
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
<br />
Disable broadcast/multicast "ping" ?<br />
<br />
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts<br />
<br />
And to enable again:<br />
<br />
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
<br />
<br />
<br />
TIP 64:<br />
<br />
Make changes to .bash_profile and need to update the current session?<br />
<br />
$ source .bash_profile<br />
<br />
With the above command, the user does not have to logout.<br />
<br />
<br />
<br />
TIP 65:<br />
<br />
What are the Special Shell Variables?<br />
<br />
<br />
$# The number of arguments.<br />
$@ All arguments, as separate words.<br />
$* All arguments, as one word.<br />
$$ ID of the current process.<br />
$? Exit status of the last command.<br />
$0,$1,..$9,${10},${11}...${N} Positional parameters. After "9" you must use the ${k} syntax.<br />
<br />
Note that 0 is true. For example if you execute the following, which is true you get zero.<br />
<br />
$ [[ -f /etc/passwd ]]<br />
$ echo $?<br />
0<br />
And the following is false, which returns a 1.<br />
<br />
$ [[ -f /etc/passwdjabberwisnohere ]]<br />
$ echo $?<br />
1<br />
<br />
So true=0 and false=1.<br />
<br />
<br />
Sample program "mdo" to show the difference between "$@" and "$*"<br />
<br />
#!/bin/bash<br />
function myarg<br />
{<br />
echo "$# in myarg function"<br />
}<br />
echo -e "$# parameters on the cmd line\n"<br />
echo -e "calling: myarg \"\$@\" and myarg \"\$*\"\n"<br />
myarg "$@"<br />
myarg "$*"<br />
echo -e "\ncalling: myarg \$@ and myarg \$* without quotes\n"<br />
myarg $@<br />
myarg $*<br />
<br />
<br />
The result of running "./mdo one two". Note that when quoted, myarg "$*",<br />
returns 1 ... all parameters are smushed together as one word.<br />
<br />
[chirico@third-fl-71 theBook]$ ./mdo one two<br />
2 parameters on the cmd line<br />
<br />
calling: myarg "$@" and myarg "$*"<br />
<br />
2 in myarg function<br />
1 in myarg function<br />
<br />
calling: myarg $@ and myarg $* without quotes<br />
<br />
2 in myarg function<br />
2 in myarg function<br />
<br />
Example program "mdo2" shows how the input separator can be changed.<br />
<br />
#!/bin/bash<br />
IFS=|<br />
echo -e "$*\n"<br />
IFS=,<br />
echo -e "$*\n"<br />
IFS=\;<br />
echo -e "$*\n"<br />
IFS=$1<br />
echo -e "$*\n"<br />
<br />
[chirico@third-fl-71 theBook]$ ./mdo2 one two three four five<br />
one two three four five<br />
<br />
one,two,three,four,five<br />
<br />
one;two;three;four;five<br />
<br />
oneotwoothreeofourofive<br />
<br />
<br />
<br />
TIP 66:<br />
<br />
Replace all "x" with "y" and all "y" with "x" in file data.<br />
<br />
$ cata data<br />
x y<br />
y x<br />
<br />
$ tr "xy" "yx" < data<br />
y x<br />
x y<br />
<br />
<br />
<br />
TIP 67:<br />
<br />
On a Linux 2.6.x Kernel, how do you directly measure disk activity,<br />
and where is this information documented?<br />
<br />
o The information is documented in the kernel source<br />
./Documentation/iostats.txt<br />
<br />
o The new way of getting this info in 2.6.x is<br />
$ cat /sys/block/hda/stat<br />
151121 5694 1932358 796675 37867 76770 916994 8353762 0 800672 9150437<br />
<br />
Field 1 -- # of reads issued<br />
This is the total number of reads completed successfully.<br />
Field 2 -- # of reads merged, field 6 -- # of writes merged<br />
Reads and writes which are adjacent to each other may be merged for<br />
efficiency. Thus two 4K reads may become one 8K read before it is<br />
ultimately handed to the disk, and so it will be counted (and queued)<br />
as only one I/O. This field lets you know how often this was done.<br />
Field 3 -- # of sectors read<br />
This is the total number of sectors read successfully.<br />
Field 4 -- # of milliseconds spent reading<br />
This is the total number of milliseconds spent by all reads (as<br />
measured from __make_request() to end_that_request_last()).<br />
Field 5 -- # of writes completed<br />
This is the total number of writes completed successfully.<br />
Field 7 -- # of sectors written<br />
This is the total number of sectors written successfully.<br />
Field 8 -- # of milliseconds spent writing<br />
This is the total number of milliseconds spent by all writes (as<br />
measured from __make_request() to end_that_request_last()).<br />
Field 9 -- # of I/Os currently in progress<br />
The only field that should go to zero. Incremented as requests are<br />
given to appropriate request_queue_t and decremented as they finish.<br />
Field 10 -- # of milliseconds spent doing I/Os<br />
This field is increases so long as field 9 is nonzero.<br />
Field 11 -- weighted # of milliseconds spent doing I/Os<br />
This field is incremented at each I/O start, I/O completion, I/O<br />
merge, or read of these stats by the number of I/Os in progress<br />
(field 9) times the number of milliseconds spent doing I/O since the<br />
last update of this field. This can provide an easy measure of both<br />
I/O completion time and the backlog that may be accumulating.<br />
<br />
Note, this is device specific.<br />
<br />
<br />
<br />
TIP 68:<br />
<br />
Passing Outbound Mail, plus Masquerading User and Hostname.<br />
<br />
Here's a specific example:<br />
<br />
How does one send and receive Comcast email from a home Linux box,<br />
which uses Comcast as the ISP, if the local account on the Linux<br />
box is different from the Comcast email. For instance, the<br />
account on the Linux box is "chirico@third-fl-71" and the Comcast<br />
email account is "mchirico@comcast.net". Note both the hostname and<br />
username are different.<br />
<br />
So, the user "chirico" using "mutt", "elm" or any email program would<br />
like to send out email to say "donkey@comcast.net"; yet, donkey would<br />
see the email from "mchirico@comcast.net" and not "chirico@third-fl-71"<br />
but chirico@third-fl-71 would get the replies.<br />
<br />
For a full description of how to solve this problem, including related<br />
"sendmail.mc", "site.config.m4", "genericstable", "genericsdomain",<br />
".procmailrc", and ".forward" files, reference the following:<br />
<br />
http://prdownloads.sourceforge.net/souptonuts/README_COMCAST_EMAIL.txt?download<br />
<br />
Included in the above link are instructions for building sendmail with<br />
"SASL" and "STARTTLS".<br />
<br />
<br />
<br />
TIP 69:<br />
<br />
How do you remove just the last 2 lines from a file and save the result?<br />
<br />
$ sed '$d' file | sed '$d' > savefile<br />
<br />
Or, as Amos Shapira pointed out, it's much easier with the head command.<br />
<br />
$ head -2 file<br />
<br />
And, of course, removing just the last line<br />
<br />
$ sed '$d' file > savefile<br />
<br />
(See REFERENCES (13))<br />
<br />
How do you remove extra spaces at the end of a line?<br />
<br />
$ sed 's/[ ]*$//g'<br />
<br />
How do you remove blank lines, or lines with just spaces and tabs,<br />
saving the origional file as file.backup?<br />
<br />
$ perl -pi.backup -e "s/^(\s)*\n//" file<br />
<br />
<br />
<br />
<br />
TIP 70:<br />
<br />
Generating Random Numbers.<br />
<br />
$ od -vAn -N4 -tu4 < /dev/urandom<br />
3905158199<br />
<br />
<br />
<br />
TIP 71:<br />
<br />
Deleting a File by it's Inode Value.<br />
<br />
See (PROGRAMMING TIP 5) for creating the file, or<br />
<br />
$ cat > '\n\n\n\n\n\n\n'<br />
type some text<br />
^D<br />
<br />
To list the inode and display the characters.<br />
<br />
$ ls -libt *<br />
<br />
To remove by inode. Note the "--" option. This<br />
will keep any special characters in the file from being<br />
interpreted at "rm" options.<br />
<br />
$ find . -inum <inode> -exec rm -- '{}' \;<br />
<br />
Or to check contents<br />
<br />
$ find . -inum <inode> -exec cat '{}' \;<br />
<br />
Reference:<br />
http://www.faqs.org/ftp/usenet/news.answers/unix-faq/faq/part2<br />
<br />
<br />
<br />
TIP 72:<br />
<br />
Sending Attachments Using Mutt -- On the Command Line.<br />
<br />
$ mutt -s "See Attachment" -a file.doc user@domain.net < message.txt<br />
<br />
or just the message:<br />
<br />
$ echo | mutt -a sample.tar.gz user@domain.net<br />
<br />
Reference:<br />
http://www.shelldorado.com/articles/mailattachments.html<br />
<br />
Also see (TIP 51).<br />
<br />
<br />
<br />
TIP 73:<br />
<br />
Want to find out what functions a program calls?<br />
<br />
$ strace <program><br />
<br />
Try this with "topen.c" (see PROGRAMMING TIP 5)<br />
<br />
$ strace ./topen<br />
<br />
<br />
<br />
TIP 74:<br />
<br />
RPM Usage Summary.<br />
<br />
Install. Full filename is needed.<br />
<br />
$ rpm -ivh Fedora/RPMS/postgresql-libs-7.4.2-1.i386.rpm<br />
<br />
To view list of files installed with a particular package.<br />
<br />
$ rpm -ql postgresql-libs<br />
/usr/lib/libecpg.so.4<br />
/usr/lib/libecpg.so.4.1<br />
/usr/lib/libecpg_compat.so.1<br />
/usr/lib/libecpg_compat.so.1.1<br />
/usr/lib/libpgtypes.so.1<br />
...<br />
<br />
Or, to get the file listing from a package that is not installed use the<br />
"-p" option.<br />
<br />
$ rpm -pql /iso0/Fedora/RPMS/libpcap-0.8.3-7.i386.rpm<br />
/usr/share/doc/libpcap-0.8.3/CHANGES<br />
/usr/share/doc/libpcap-0.8.3/LICENSE<br />
/usr/share/doc/libpcap-0.8.3/README<br />
/usr/share/man/man3/pcap.3.gz<br />
<br />
For dependencies listing, use the "R" option.<br />
<br />
$ rpm -qpR /iso0/Fedora/RPMS/libpcap-0.8.3-7.i386.rpm<br />
/sbin/ldconfig<br />
/sbin/ldconfig<br />
kernel >= 2.2.0<br />
libc.so.6<br />
libc.so.6(GLIBC_2.0)<br />
libc.so.6(GLIBC_2.1)<br />
libc.so.6(GLIBC_2.1.3)<br />
libc.so.6(GLIBC_2.3)<br />
openssl<br />
rpmlib(CompressedFileNames) <= 3.0.4-1<br />
rpmlib(PayloadFilesHavePrefix) <= 4.0-1<br />
<br />
To check the integrity, use the "-K" option.<br />
<br />
$ rpm -K /iso0/Fedora/RPMS/libpcap-0.8.3-7.i386.rpm<br />
/iso0/Fedora/RPMS/libpcap-0.8.3-7.i386.rpm: (sha1) dsa sha1 md5 gpg OK<br />
<br />
To list all packages installed.<br />
<br />
$ rpm -qa<br />
<br />
To find out which file a package belongs to.<br />
<br />
$ rpm -qf /usr/lib/libecpg.so.4.1<br />
<br />
To uninstall a package<br />
<br />
$ rpm -e<br />
<br />
For building rpm packages reference the following:<br />
http://www-106.ibm.com/developerworks/library/l-rpm1/<br />
<br />
To verify md5 sum so that you know it downloaded ok<br />
<br />
$ rpm -K *.rpm<br />
<br />
The following is a good reference:<br />
http://www.rpm.org/max-rpm/s1-rpm-install-additional-options.html<br />
<br />
<br />
<br />
TIP 75:<br />
<br />
Listing Output from a Bash Script.<br />
<br />
Add "set -x"<br />
<br />
#!/bin/bash<br />
set -x<br />
ls<br />
date<br />
<br />
Will list the files and output as follows:<br />
<br />
+ ls<br />
ChangeLog CVS data test<br />
+ date<br />
Thu Jul 1 20:41:04 EDT 2004<br />
<br />
<br />
<br />
TIP 76:<br />
<br />
Using wget.<br />
<br />
Grap a webpage and pipe it to less. For example suppose you wanted to pipe the<br />
contents of all these tips, directly from the web.<br />
<br />
$ wget -O - http://sourceforge.net/direct-dl/mchirico/souptonuts/How_to_Linux_and_Open_Source.txt|less<br />
<br />
<br />
<br />
TIP 77:<br />
<br />
Finding IP address and MAC address.<br />
<br />
$ /sbin/ifconfig<br />
<br />
Note the following output "eth0" and "eth0:1" which means<br />
two IP addresses are tied to 1 NIC (Network Interface Card).<br />
<br />
eth0 Link encap:Ethernet HWaddr 00:50:DA:60:5B:AD<br />
inet addr:192.168.1.155 Bcast:192.168.99.255 Mask:255.255.252.0<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br />
RX packets:982757 errors:116 dropped:0 overruns:0 frame:116<br />
TX packets:439297 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:1000<br />
RX bytes:693529078 (661.4 Mb) TX bytes:78400296 (74.7 Mb)<br />
Interrupt:10 Base address:0xa800<br />
<br />
eth0:1 Link encap:Ethernet HWaddr 00:50:DA:60:5B:AD<br />
inet addr:192.168.1.182 Bcast:192.168.3.255 Mask:255.255.252.0<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br />
RX packets:982757 errors:116 dropped:0 overruns:0 frame:116<br />
TX packets:439299 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:1000<br />
RX bytes:693529078 (661.4 Mb) TX bytes:78400636 (74.7 Mb)<br />
Interrupt:10 Base address:0xa800<br />
<br />
lo Link encap:Local Loopback<br />
inet addr:127.0.0.1 Mask:255.0.0.0<br />
UP LOOPBACK RUNNING MTU:16436 Metric:1<br />
RX packets:785 errors:0 dropped:0 overruns:0 frame:0<br />
TX packets:785 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:0<br />
RX bytes:2372833 (2.2 Mb) TX bytes:2372833 (2.2 Mb)<br />
<br />
<br />
<br />
TIP 78:<br />
<br />
DOS to UNIX and UNIX to DOS.<br />
<br />
$ dos2unix file.txt<br />
<br />
And to go the other way from UNIX to DOS<br />
<br />
$ unix2dos unixfile<br />
<br />
See the man page, since there are MAC options.<br />
<br />
<br />
NOTE: If you're working file DOS files, you'll probably want to use<br />
"zip" instead of "gzip" so users on Windows can unzip them.<br />
<br />
$ zip test.zip test.txt<br />
<br />
<br />
<br />
TIP 79:<br />
<br />
Need to Run Interactive Commands? Try "expect".<br />
http://expect.nist.gov/expect.tar.gz<br />
<br />
This simple example waits for the input "hi", in some form before<br />
returning, immediately, "hello there!". Otherwise, it will wait for<br />
60 seconds, then, return "hello there!".<br />
<br />
#!/usr/bin/expect<br />
set timeout 60<br />
expect "hi\n"<br />
send "hello there!\n"<br />
<br />
<br />
Reference:<br />
http://www.oreilly.com/catalog/expect/chapter/ch03.html<br />
<br />
http://www.cotse.com/dlf/man/expect/bulletproof1.htm<br />
<br />
<br />
<br />
TIP 80:<br />
<br />
Using PHP as a Command Line Scripting Language.<br />
<br />
The following will grab the complete file from slashdot.<br />
<br />
#!/usr/bin/php -q<br />
<br />
<?php<br />
$fileName = "http://slashdot.org/slashdot.xml";<br />
$rss = file($fileName) or die ("Cannot open file $fileName\n");<br />
for ($index=0; $index < count($rss); $index++)<br />
{<br />
echo $rss[$index];<br />
}<br />
?><br />
<br />
Note, if you want an example that parses the XML of<br />
slashdot, then, download the following:<br />
<br />
http://prdownloads.sourceforge.net/souptonuts/php_scripts.tar.gz?download<br />
<br />
<br />
<br />
TIP 81:<br />
<br />
Discarding all output -- including stderr messages.<br />
<br />
$ ls > /dev/null 2>&1<br />
<br />
Or sending all output to a file<br />
<br />
$ someprog > /tmp/file 2>&1<br />
<br />
Sometimes, find displays a lot of errors when searching through<br />
directories that the user doesn't have access to. To discard<br />
error messages "stderr", which is normally file descripter "2"<br />
work the following:<br />
<br />
$ find / -iname 'stuff' 2>/dev/null<br />
<br />
or to pipe results elsewhere<br />
<br />
$ find / -iname 'stuff' > /tmp/results_of_find 2>/dev/null<br />
<br />
Also see (TIP 118).<br />
<br />
<br />
<br />
TIP 82:<br />
<br />
Using MIX. D. Knuth's assembly language/machine-code instruction set used in<br />
his books to illustrate his algorithms.<br />
<br />
Download the source:<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=13897<br />
<br />
$ ./configure<br />
$ make<br />
$ make install<br />
<br />
Documentation can be found at the following link. The link on<br />
sourceforge is not correct, but, the one below works.<br />
<br />
http://www.gnu.org/software/mdk/manual/<br />
<br />
<br />
<br />
TIP 83:<br />
<br />
Gnuplot [ http://sourceforge.net/projects/gnuplot/ ].<br />
<br />
This software is ideal for printing graphs.<br />
<br />
gnuplot> set term png<br />
gnuplot> set output 'testcos.png'<br />
gnuplot> plot cos(x)*sin(x)<br />
gnuplot> exit<br />
<br />
Or the following command can be put into "file"<br />
<br />
$ cat > file<br />
set term png<br />
set output 'testcos.png'<br />
plot cos(x)*sin(x)<br />
exit<br />
^D<br />
<br />
Then, run as follows:<br />
<br />
$ gnuplot file<br />
<br />
Or, suppose you have the following file "/home/chirico/data". Comments<br />
with "#" are not read by gnuplot.<br />
<br />
# File /home/chirico/data<br />
#<br />
2005-07-26 1 2.3 3<br />
2005-07-27 2 3.4 5<br />
2005-07-28 3 4 6.6<br />
2005-07-29 4 6 2.5<br />
<br />
And you have the following new "file"<br />
<br />
set term png<br />
set xdata time<br />
set timefmt "%Y-%m-%d "<br />
set format x "%Y/%m/%d"<br />
set output '/var/www/html/chirico/gnuplot/data.png'<br />
plot '/home/chirico/data' using 1:2 w linespoints title '1st col', \<br />
'/home/chirico/data' using 1:3 w linespoints title '2nd col', \<br />
'/home/chirico/data' using 1:4 w linespoints title '3rd col'<br />
exit<br />
<br />
You can now get a graph of this data running the following:<br />
<br />
$ gnuplot file<br />
<br />
<br />
<br />
TIP 84:<br />
<br />
CPU Information - speed, processor, cache.<br />
<br />
$ cat /proc/cpuinfo<br />
<br />
processor : 0<br />
vendor_id : GenuineIntel<br />
cpu family : 15<br />
model : 2<br />
model name : Intel(R) Pentium(R) 4 CPU 2.20GHz<br />
stepping : 9<br />
cpu MHz : 2193.221<br />
cache size : 512 KB<br />
fdiv_bug : no<br />
hlt_bug : no<br />
f00f_bug : no<br />
coma_bug : no<br />
fpu : yes<br />
fpu_exception : yes<br />
cpuid level : 2<br />
wp : yes<br />
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr<br />
bogomips : 4325.37<br />
<br />
"bogomips" is a rough but good way to quickly compare two computer speeds. True it's a<br />
bogus reading; but, a "good enough" for government work calculation. See (TIP 10) for<br />
"vmstat" and "iostat".<br />
<br />
<br />
<br />
TIP 85:<br />
<br />
POVRAY - Making Animated GIFs<br />
<br />
To see this in action, reference:<br />
http://souptonuts.sourceforge.net/povray/orbit.pov.html<br />
<br />
These are the basic command to create:<br />
<br />
<br />
$ povray orbit.ini -Iorbit.pov<br />
$ convert -delay 20 *.ppm orbit.gif<br />
<br />
By the way, convert is a program from imagemagick, and it can<br />
be downloaded from ( http://www.imagemagick.org ).<br />
<br />
The following is "orbit.pov"<br />
<br />
<br />
#include "colors.inc"<br />
#include "finish.inc"<br />
#include "metals.inc"<br />
#include "textures.inc"<br />
#include "stones.inc"<br />
#include "skies.inc"<br />
<br />
camera {<br />
location < 2, 3, -8 ><br />
look_at < 0, 0, 0 ><br />
focal_point <0, 0, 0><br />
blur_samples 20<br />
}<br />
<br />
light_source {<br />
< 0, 10, 0><br />
color White<br />
area_light <2,0,0>,<0,0,2>, 2, 2<br />
adaptive 1<br />
fade_distance 8<br />
fade_power 1<br />
}<br />
<br />
sky_sphere {<br />
S_Cloud3<br />
}<br />
<br />
plane { <0, 1, 0>, -1<br />
texture {<br />
pigment {<br />
checker color Blue, color White<br />
}<br />
finish {Phong_Glossy}<br />
}<br />
}<br />
#declare ball0=<br />
sphere {<br />
<0.5, 0.5, 0>, 1<br />
texture {<br />
T_Silver_1E<br />
pigment {Yellow}<br />
}<br />
}<br />
<br />
#declare ball1=<br />
sphere {<br />
<3, 2, 0>, 0.5<br />
texture {<br />
T_Silver_1E<br />
pigment {Blue}<br />
}<br />
}<br />
<br />
#declare ball2=<br />
sphere {<br />
<3, 1, 0>, 1<br />
texture {<br />
T_Silver_1E<br />
pigment {Green}<br />
}<br />
}<br />
<br />
object {ball0 rotate 360*clock*y}<br />
object {ball1 rotate 720*clock*y}<br />
object {ball2 rotate 360*(1 - clock)*y}<br />
<br />
<br />
And, "orbit.ini" follows:<br />
<br />
Output_File_Type=P<br />
<br />
Width=320<br />
Height=240<br />
<br />
Initial_Frame=1<br />
Final_Frame=10<br />
Antialias=true<br />
<br />
Subset_Start_Frame=1<br />
Subset_End_Frame=10<br />
<br />
Cyclic_Animation=on<br />
<br />
<br />
<br />
TIP 86:<br />
<br />
GPG -- GnuPG<br />
<br />
Reference: http://www.gnupg.org/documentation/faqs.html<br />
http://codesorcery.net/mutt/mutt-gnupg-howto<br />
http://www.gnupg.org/(en)/download/index.html<br />
(SCRIPT 4) on following link:<br />
http://prdownloads.sourceforge.net/souptonuts/README_common_script_commands.html?download<br />
<br />
<br />
Generage key:<br />
<br />
$ gpg --gen-key<br />
<br />
Generate public key ID and fingerprint<br />
<br />
$ gpg --fingerprint<br />
<br />
Get a list of keys:<br />
<br />
$ gpg --list-keys<br />
<br />
pub 1024D/A11C1499 2004-07-15 Mike Chirico <mchirico@comcast.net><br />
sub 1024g/E1A3C2B3 2004-07-15<br />
<br />
Encrypt<br />
<br />
$ gpg -r Mike --encrypt sample.txt<br />
<br />
This will produce "sample.txt.asc", which is a binary file. Note, I can use "Mike" because that's the<br />
name on the list of keys. Again, it will be a binary file.<br />
<br />
Encrypt using "ASCII-armored text" (--armor), which is probably what you want when sending "in" the body of an<br />
email, or some document.<br />
<br />
$ gpg -r Mike --encrypt --armor sample.txt<br />
or<br />
$ gpg -r Mike -e -a sample.txt<br />
or<br />
$ gpg --output somefile.asc --armor -r Mike --encrypt --armor sample.txt<br />
<br />
The above 3 statements will still produce "sample.txt.asc", but look at it, or "$ cat sample.txt.asc" without <br />
fear, since there are no binary characters. Yes, you could even compile a program "$ g++ -o test test.c" , then,<br />
"$ gpg --output test.asc -r Mike --encrypt --armor test". However, when decrypting make sure to pipe<br />
the results.<br />
<br />
$ gpg --decrypt test.asc > test<br />
<br />
Export "public" key:<br />
<br />
$ gpg --armor --export Mike > m1.asc<br />
<br />
Signing the file "message.txt":<br />
<br />
$ gpg --clearsign message.txt<br />
<br />
<br />
Sending the key to the "key-server"<br />
<br />
First, list the keys.<br />
<br />
$ gpg --list-keys<br />
/home/chirico/.gnupg/pubring.gpg<br />
v------------------ Use this with "0x" in front -------<br />
pub 1024D/A11C1499 2004-07-15 Mike Chirico <mchirico@comcast.net> |<br />
sub 1024g/E1A3C2B3 2004-07-15 |<br />
|<br />
v----------------------------------------------------<br />
$ gpg --send-keys 0xA11C1499<br />
<br />
The above sends it to the keyserver defined in "/home/chirico/.gnupg/gpg.conf". Other key servers:<br />
<br />
wwwkeys.pgp.net<br />
search.keyserver.net<br />
pgp.ai.mit.edu<br />
<br />
When you go to your user-group meetings, you need to bring 2 forms of ID, and<br />
list your Key fingerprint. Shown below is the command for getting this fingerprint.<br />
<br />
$ gpg --fingerprint mchirico@comcast.net<br />
pub 1024D/A11C1499 2004-07-15<br />
Key fingerprint = 9D7F C80D BB7B 4BAB CCA4 1BE9 9056 5BEC A11C 1499<br />
uid Mike Chirico (http://souptonuts.sourceforge.net/chirico/index.php) <mchirico@comcast.net><br />
sub 1024g/E1A3C2B3 2004-07-15<br />
<br />
<br />
Receving keys:<br />
<br />
The following will retrieve my mchirico@comcast.net key<br />
<br />
$ gpg --recv-keys 0xA11C1499<br />
<br />
<br />
Special Note: If you get the following error "GPG: Warning: Using Insecure Memory" , then,<br />
" chmod 4755 /path/to/gpg" to setuid(root) permissioins on the gpg binary.<br />
<br />
<br />
NOTE: If using mutt, just before sending with the "y" option, hit "p" to sign or encrypt.<br />
<br />
It's possible to create a gpg/pgp email from the command line. For a tutorial on this,<br />
reference (SCRIPT 4) at the following link:<br />
http://prdownloads.sourceforge.net/souptonuts/README_common_script_commands.html?download<br />
<br />
<br />
<br />
TIP 87:<br />
<br />
Working with Dates: Steffen Beyer has developed a Perl and C module for working with dates<br />
<br />
This softare can be downloaded from the following location:<br />
http://www.engelschall.com/u/sb/download/pkg/Date-Calc-5.3.tar.gz<br />
<br />
$ wget http://www.engelschall.com/u/sb/download/pkg/Date-Calc-5.3.tar.gz<br />
$ tar -xzvf Date-Calc-5.3.tar.gz<br />
$ cd Date-Calc-5.3<br />
$ cp ./examples/cal.c .<br />
$ gcc cal.c DateCalc.c -o mcal<br />
<br />
The file cal.c contains sample function calls from DateCalc.c. Note, "DateCalc.c"<br />
is just a list of functions and includes for "DateCalc.h" and "ToolBox.h".<br />
<br />
Or, and this may be easier, just download the following:<br />
http://prdownloads.sourceforge.net/cpearls/date_calc.tar.gz?download<br />
<br />
The above link contains a few examples.<br />
<br />
<br />
<br />
TIP 88:<br />
<br />
Color patterns for mutt.<br />
<br />
The colors can be changed in the /home/user/.muttrc file. The first field begins with<br />
color, the second field is the foreground color, and the third field is the background<br />
color, or default.<br />
<br />
An example .muttrc for colors:<br />
<br />
# color patterns for mutt<br />
color normal white black # normal text<br />
color indicator black yellow # actual message<br />
color tree brightmagenta default # thread arrows<br />
color status brightyellow default # status line<br />
color error brightred default # errors<br />
color message magenta default # info messages<br />
color signature magenta default # signature<br />
color attachment brightyellow red # MIME attachments<br />
color search brightyellow red # search matches<br />
color tilde brightmagenta default # ~ at bottom of msg<br />
color markers red default # + at beginning of wrapped lines<br />
color hdrdefault cyan default # default header lines<br />
color bold red default # hiliting bold patterns in body<br />
color underline green default # hiliting underlined patterns in body<br />
color quoted cyan default # quoted text<br />
color quoted1 magenta default<br />
color quoted2 red default<br />
color quoted3 green default<br />
color quoted4 magenta default<br />
color quoted5 cyan default<br />
color quoted6 magenta default<br />
color quoted7 red default<br />
color quoted8 green default<br />
color quoted9 cyan default<br />
color body cyan default "((ftp|http|https)://|news:)[^ >)\"\t]+"<br />
color body cyan default "[-a-z_0-9.+]+@[-a-z_0-9.]+"<br />
color body red default "(^| )\\*[-a-z0-9*]+\\*[,.?]?[ \n]"<br />
color body green default "(^| )_[-a-z0-9_]+_[,.?]?[\n]"<br />
color body red default "(^| )\\*[-a-z0-9*]+\\*[,.?]?[ \n]"<br />
color body green default "(^| )_[-a-z0-9_]+_[,.?]?[ \n]"<br />
color index cyan default ~F # Flagged<br />
color index red default ~N # New<br />
color index magenta default ~T # Tagged<br />
color index cyan default ~D # Deleted<br />
<br />
<br />
Also see (TIP 190)<br />
<br />
<br />
<br />
TIP 89:<br />
<br />
ps command in detail<br />
<br />
<br />
Here are the possible codes when using state "$ ps -e -o state,cmd"<br />
<br />
<br />
PROCESS STATE CODES<br />
D uninterruptible sleep (usually IO)<br />
R runnable (on run queue)<br />
S sleeping<br />
T traced or stopped<br />
Z a defunct ("zombie") process<br />
<br />
< high-priority (not nice to other users)<br />
N low-priority (nice to other users)<br />
L has pages locked into memory (for real-time and custom IO)<br />
s is a session leader<br />
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)<br />
+ is in the foreground process group<br />
<br />
For instance:<br />
<br />
Note that the -o is for user defined, and -e is for select<br />
all process.<br />
<br />
$ ps -e -o pid,state,start,time,etime,cmd<br />
<br />
...<br />
9946 S 15:40:45 00:00:00 02:23:29 /bin/bash -i<br />
9985 T 15:41:24 00:00:01 02:22:50 emacs mout2<br />
10003 T 15:43:59 00:00:00 02:20:15 emacs NOTES<br />
10320 T 17:38:42 00:00:00 25:32 emacs stuff.c<br />
...<br />
<br />
You may want to command below, without the -e, which will give the<br />
process only under the current terminal.<br />
<br />
$ ps -o pid,state,start,time,etime,cmd<br />
<br />
Want to find what 's impacting your load?<br />
<br />
$ ps -e -o %cpu,pid,state,start,time,etime,%cpu,%mem,cmd|sort -rn|less<br />
<br />
<br />
<br />
$ ps aux<br />
<br />
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND<br />
root 1 0.0 0.0 1380 480 ? S Aug04 0:00 init [3]<br />
root 2 0.0 0.0 0 0 ? SWN Aug04 0:00 [ksoftirqd/0]<br />
root 3 0.0 0.0 0 0 ? SW< Aug04 0:00 [events/0]<br />
root 4 0.0 0.0 0 0 ? SW< Aug04 0:00 [khelper]<br />
...<br />
<br />
Or, if you want to see the environment add the -e option<br />
<br />
$ ps aeux<br />
<br />
...<br />
chirico 2735 0.0 0.1 4400 1492 pts/0 S Aug04 0:00 -bash USER=chirico LOGNAME=chirico HOME=/home/chirico PATH=/usr/<br />
chirico 2771 0.0 0.0 4328 924 pts/0 S Aug04 0:00 screen -e^Pa -D -R HOSTNAME=third-fl-71.localdomain TERM=xterm S<br />
chirico 2772 0.0 0.6 9476 6352 ? S Aug04 0:54 SCREEN -e^Pa -D -R HOSTNAME=third-fl-71.localdomain TERM=xterm S<br />
chirico 2773 0.0 0.1 4432 1548 pts/1 S Aug04 0:10 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
chirico 2797 0.0 0.1 4416 1496 pts/2 S Aug04 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
root 2821 0.0 0.0 4100 952 pts/2 S Aug04 0:00 su -<br />
root 2822 0.0 0.1 4384 1480 pts/2 S Aug04 0:00 -bash<br />
chirico 2862 0.0 0.1 4428 1524 pts/3 S Aug04 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
sporkey 2946 0.0 0.2 6836 2960 ? S Aug04 0:15 fetchmail<br />
chirico 2952 0.0 0.1 4436 1552 pts/5 S Aug04 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
chirico 3880 0.0 0.1 4416 1496 pts/6 S Aug05 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
root 3904 0.0 0.0 4100 956 pts/6 S Aug05 0:00 su - donkey<br />
donkey 3905 0.0 0.1 4336 1452 pts/6 S Aug05 0:00 -bash<br />
donkey 3938 0.0 0.2 6732 2856 ? S Aug05 0:14 fetchmail<br />
chirico 3944 0.0 0.1 4416 1496 pts/7 S Aug05 0:00 /bin/bash STY=2772.pts-0.third-fl-71 TERM=screen TERMCAP=SC|scre<br />
...<br />
<br />
There is also a -f "forrest" option. Also note below " -bash" is the start of a login shell.<br />
<br />
$ ps aeuxwwf <br />
<br />
The ww option above gives a wide format with all variables. Use the above command if you plan<br />
to parse through a Perl script. Otherwise, it may be easier to do a quick read using the command<br />
below, without "ww". <br />
<br />
$ ps aeuxf<br />
<br />
...<br />
root 2339 0.0 0.1 3512 1444 ? S Dec01 0:00 /usr/sbin/sshd<br />
root 25651 0.0 0.1 6764 1980 ? S Dec23 0:00 \_ /usr/sbin/sshd<br />
chirico 25653 0.0 0.2 6840 2236 ? S Dec23 0:14 \_ /usr/sbin/sshd<br />
chirico 25654 0.0 0.1 4364 1440 pts/4 S Dec23 0:00 \_ -bash USER=chirico LOGNAME=chirico HOME=/home/chirico<br />
chirico 25690 0.0 0.0 4328 920 pts/4 S Dec23 0:00 \_ screen -e^Pa -D -R HOSTNAME=third-fl-71.localdomain TERM=xterm<br />
root 2355 0.0 0.0 2068 904 ? S Dec01 0:00 xinetd -stayalive -pidfile /var/run/xinetd.pid<br />
...<br />
<br />
It is also possible to list the process by command line. For example, the following command will only list the emacs<br />
processes.<br />
<br />
$ ps -fC emacs<br />
UID PID PPID C STIME TTY TIME CMD<br />
chirico 5049 5020 0 May11 pts/13 00:00:00 emacs -nw Notes<br />
chirico 12368 5104 0 May12 pts/18 00:00:00 emacs -nw dnotify.c<br />
chirico 19792 18028 0 May13 pts/20 00:00:00 emacs -nw hello.c<br />
chirico 14034 27367 0 18:52 pts/8 00:00:00 emacs -nw How_to_Linux_and_Open_Source.txt<br />
<br />
You may also want to consider using top in batch mode. Here the "-n 1" means refresh once,<br />
and the "b" is for batch. The "fmt -s" is to put it in a more readable format.<br />
<br />
$ top -n 1 b |fmt -s >>statfile<br />
<br />
<br />
<br />
<br />
TIP 90:<br />
<br />
Learning Assembly.<br />
<br />
Once you have written the source, assuming the file is "exit.s", it can be compiled as follows:<br />
<br />
$ as exit.s -o exit.o<br />
$ ld exit.o -o exit<br />
<br />
<br />
Here is the program:<br />
<br />
#<br />
#INPUT: none<br />
#<br />
#OUTPUT: returns a status code. This can be viewed<br />
# by typing<br />
#<br />
# echo $?<br />
#<br />
# after running the program<br />
#<br />
#VARIABLES:<br />
# %eax holds the system call number<br />
# (this is always the case)<br />
#<br />
# %ebx holds the return status<br />
#<br />
.section .data<br />
.section .text<br />
<br />
.globl _start<br />
_start:<br />
movl $1, %eax # this is the linux kernel command<br />
# number (system call) for exiting<br />
# a program<br />
movl $0, %ebx # this is the status number we will<br />
# return to the operating system.<br />
# Change this around and it will<br />
# return different things to<br />
# echo $?<br />
int $0x80 # this wakes up the kernel to run<br />
# the exit command<br />
<br />
After running this program, you can get the exit code.<br />
<br />
$ exit $?<br />
0<br />
<br />
That is about all it does; but, get the book for more details. The<br />
book is free.<br />
<br />
http://savannah.nongnu.org/download/pgubook/<br />
<br />
<br />
<br />
TIP 91:<br />
<br />
Creating a sandbox for reiserfstune,debugreiserfs and ACL. Also see TIP 4.<br />
<br />
Assume you have a reisers files system created from a disk file, which<br />
means you have done something like the following:<br />
<br />
# dd if=/dev/zero of=disk-rfs count=102400<br />
# losetup /dev/loop4 ./disk-rfs<br />
# mkfs -t reiserfs /dev/loop4<br />
# mkdir /fs2<br />
# mount -o loop,acl ./disk-rfs /fs2<br />
<br />
Now, you can run reiserfstune. But, first you will need to umount fs2<br />
<br />
# umount /fs2<br />
# reiserfstune ./disk-rfs<br />
<br />
Or you can run the debug command<br />
<br />
# debugreiserfs -J ./disk-rfs<br />
<br />
Now, suppose you run through a lot of the debug options on<br />
http://www.namesys.com/ and you destroy this file.<br />
<br />
You can recreate the file and delete the loop device.<br />
<br />
# dd if=/dev/zero of=disk-rfs count=102400<br />
# losetup -d /dev/loop4<br />
# mount -o loop,acl ./disk-rfs /fs2<br />
<br />
Now, try working with some of the ACL options - you can only do this<br />
with the latest kernel and tools -- Fedora Core 2 will work.<br />
<br />
Assume you have 3 users, donkey, chirico and bozo2. You can give<br />
everyone rights to this file system as follows:<br />
<br />
# setfacl -R -m d:u:donkey:rwx,d:u:chirico:rwx,d:u:bozo2:rwx /fs2<br />
<br />
<br />
<br />
TIP 92:<br />
<br />
SpamAssassin - Setup.<br />
<br />
Step 1.<br />
<br />
Installing the SpamAssassin CPAN utility. You will need to do this<br />
as root.<br />
<br />
$ su -<br />
<br />
Once you have root privileges invoke cpan.<br />
<br />
# perl -MCPAN -e shell<br />
<br />
cpan><br />
<br />
Now install with prerequisites policy set to ask.<br />
<br />
cpan> o conf prerequisites_policy ask<br />
<br />
cpan> install Mail::SpamAssassin<br />
<br />
You will get lots of output as the necessary modules are downloaded and<br />
compiled and installed.<br />
<br />
Step 2.<br />
<br />
Configuration.<br />
<br />
Edit the following "/etc/mail/spamassassin/local.cf"<br />
<br />
Here is a look at my file<br />
<br />
$ cat /etc/mail/spamassassin/local.cf<br />
<br />
<br />
# This is the right place to customize your installation of SpamAssassin.<br />
#<br />
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be<br />
# tweaked.<br />
#<br />
###########################################################################<br />
#<br />
# rewrite_subject 0<br />
# report_safe 1<br />
# trusted_networks 212.17.35.<br />
#<br />
<br />
# Below added from book<br />
# You may want to set this to 5, then, work your way down.<br />
# Currently I have this 3<br />
required_hits 3<br />
<br />
# This determines how spam is reported. Currently safe email is reported<br />
# in the message.<br />
report_safe 1<br />
<br />
# The will rewrite the tag of the spam message.<br />
rewrite_subject 1<br />
<br />
# By default, SpamAssassin will run RBL checks. If your ISP already<br />
# does this, set this to 1.<br />
skip_rbl_checks 0<br />
<br />
Step 3.<br />
<br />
Update .procmail.<br />
<br />
You should update the .procmail file as follows. Here is my /home/chirico/.procmail file.<br />
<br />
<br />
$ cat /home/chirico/.procmailrc<br />
<br />
PATH=/bin:/usr/bin:/usr/local/bin<br />
MAILDIR=/var/spool/mail<br />
DEFAULT=/var/spool/mail/chirico<br />
LOGFILE=/home/chirico/MailBAG<br />
MYHOME=/home/chirico<br />
# Must have folder MailTRASH<br />
TRASH=/home/chirico/MailTRASH<br />
<br />
# Will get everything from this mail<br />
:0<br />
* ^From:.*sporkey@comcast.net<br />
$DEFAULT<br />
<br />
# Spamassassin<br />
:0fw<br />
* <300000<br />
|/usr/local/bin/spamassassin<br />
<br />
Reference:<br />
http://pm-doc.sourceforge.net/<br />
<br />
<br />
<br />
TIP 93:<br />
<br />
Make Graphs: using dot and neato.<br />
<br />
$ dot -Tpng dotfile -o myout.png<br />
<br />
To see the output reference the following:<br />
http://souptonuts.sourceforge.net/code/myout.png<br />
<br />
Where "dotfile" is the following:<br />
<br />
$ cat dotfile<br />
<br />
digraph g<br />
{<br />
node [shape = record];<br />
<br />
node0 [ label ="<f0> stuff | <f1> J | <f2> "];<br />
node1 [ label ="<f0> | <f1> E | <f2> "];<br />
node4 [ label ="<f0> | <f1> C | <f2> "];<br />
node6 [ label ="<f0> | <f1> I | <f2> "];<br />
node2 [ label ="<f0> | <f1> U | <f2> "];<br />
node5 [ label ="<f0> | <f1> N | <f2> "];<br />
node9 [ label ="<f0> | <f1> Y | <f2> "];<br />
node8 [ label ="<f0> | <f1> W | <f2> "];<br />
node10 [ label ="<f0> | <f1> Z | <f2> "];<br />
node7 [ label ="<f0> | <f1> A | <f2> "];<br />
node3 [ label ="<f0> | <f1> G | <f2> "];<br />
<br />
<br />
"node0":f0 -> "node1":f1;<br />
"node0":f2 -> "node2":f1;<br />
<br />
"node1":f0 -> "node4":f1;<br />
"node1":f2 -> "node6":f1;<br />
"node4":f0 -> "node7":f1;<br />
"node4":f2 -> "node3":f1;<br />
<br />
"node2":f0 -> "node5":f1;<br />
"node2":f2 -> "node9":f1;<br />
<br />
"node9":f0 -> "node8":f1;<br />
"node9":f2 -> "node10":f1;<br />
}<br />
<br />
Checkout the following article:<br />
http://www.linuxjournal.com/article.php?sid=7275<br />
<br />
To download this software<br />
http://www.graphviz.org/<br />
<br />
<br />
<br />
TIP 94:<br />
<br />
Makefile: working with conditions<br />
<br />
<br />
First note that all the indentations of the file must be<br />
a single tab. There cannot be any spaces, or make will<br />
not run.<br />
<br />
$ cat Makefile<br />
<br />
# Compiler flags<br />
sqliteLIB := $(shell ls /usr/local/lib/libsqlite.so)<br />
sqlite3LIB := $(shell ls /usr/local/lib/libsqlite3.so)<br />
# all assumes sqlite and sqlite3 are installed<br />
#<br />
<br />
test:<br />
ifeq ("$(sqlite3LIB)","/usr/local/lib/libsqlite3.so")<br />
@echo -e "True -- we found the file"<br />
else<br />
@echo "False -- we did not find the file"<br />
endif<br />
<br />
<br />
So, if I run make I will get the following output.<br />
<br />
$ make<br />
True -- we found the file<br />
<br />
This is because I have a file /usr/local/lib/libsqlite3.so on my system.<br />
Note how the assignment is made, with the shell command<br />
<br />
sqlite3LIB := $(shell ls /usr/local/lib/libsqlite3.so)<br />
<br />
<br />
<br />
TIP 95:<br />
<br />
Bash: Conditional Expressions<br />
<br />
if [ -e /etc/ntp.conf ]<br />
then<br />
echo "You have the ntp config file"<br />
else<br />
echo "You do not have the ntp config file"<br />
fi<br />
<br />
Now using an AND condition inside the [ ]. By the way, above, you<br />
can put the "then" on the same line as the if "if [ -e /etc/ntp.conf ]; then"<br />
as long as you use the ";".<br />
<br />
if [ \( -e /etc/ntp.conf \) -a \( -e /etc/ntp/ntpservers \) ]<br />
then<br />
echo "You have ntp config and ntpservers"<br />
elif [ -e /etc/ntp.conf ]; then<br />
echo " You just have ntp.conf "<br />
elif [ -e /etc/ntp/ntpservers ]; then<br />
echo " You just have ntpservers "<br />
else<br />
echo " you have neither ntp.conf or ntpservers"<br />
fi<br />
<br />
A few things to note above. Else if statement is written as "elif", and when<br />
dealing with "(" you will need to insert "\(". By the way "-o" can replace "-a"<br />
and the "-o" is for OR condition. AND can be done as follows too.<br />
<br />
if [ -e /etc/ntp.conf ] && [ -e /etc/ntp/ntpservers ]<br />
then<br />
echo "You have ntp config and ntpservers"<br />
elif [ -e /etc/ntp.conf ]; then<br />
echo " You just have ntp.conf "<br />
elif [ -e /etc/ntp/ntpservers ]; then<br />
echo " You just have ntpservers "<br />
else<br />
echo " you have neither ntp.conf or ntpservers"<br />
fi<br />
<br />
Conditional Expressions (files).<br />
<br />
<br />
-b file True if file exists and is a block file<br />
-c file True if file exists and is a character device file<br />
-d file True if file exists and is a directory<br />
-e file True if file exists<br />
-f file True if file exists and is a regular file<br />
-g file True if file exists and is set goup id<br />
-G file True if owned by the effective group ID<br />
<br />
-k file True if "sticky" bit is set and file exists<br />
-L file True if file exists and is a symbolic link<br />
-n string True if string is non-null<br />
<br />
-O file Ture if file exists and is owned by the effective user ID<br />
<br />
-p file True if file is a named pipe (FIFO)<br />
-r file True if file is readable<br />
-s file True if file has size > 0<br />
-S file True if file exists and is a socket<br />
<br />
-t file True if file is open and refers to a terminal.<br />
-u file True if setuid bit is set<br />
-w file True if file exists and is writeable<br />
-x file True if file executable<br />
-x dir True if directory can be searched<br />
<br />
file1 -nt file2 True if file1 modification date newer than file2<br />
file1 -ot file2 True if file1 modification date older than file2<br />
file1 -ef file2 True if file1 and file2 have same inode<br />
<br />
Conditional Expressions (Integers).<br />
<br />
-lt Less than<br />
-le Less than or equal<br />
-eq Equal<br />
-ge Greater than or equal<br />
-gt Greater than<br />
-ne Not equal<br />
<br />
Example usage.<br />
<br />
#!/bin/bash<br />
{<br />
while read num value; do<br />
if [ $num -gt 2 ]; then<br />
echo $value<br />
fi<br />
done<br />
} < somefile<br />
<br />
<br />
Conditional Expressions (Strings).<br />
<br />
str1 = str2 str1 matches str2<br />
str1 != str2 str1 does not matches str2<br />
str1 < str2 str1 is less than str2<br />
str1 > str2 str1 is greater than str2<br />
-n str1 str1 is not null (length greater than 0)<br />
-z str1 str1 is null (las length 0)<br />
<br />
<br />
<br />
TIP 96:<br />
<br />
CVS: Working with cvs<br />
<br />
INITIAL REPOSITORY:<br />
<br />
To create a repository, and this is normally done by the system admin. This<br />
is NOT creating a project to checkout, but the location where everything<br />
will be stored! The initial repository!<br />
<br />
cvs -d repository_root_directory init<br />
<br />
Or here is a specific example:<br />
<br />
cvs -d /work/cvsREPOSITORY/ init<br />
<br />
Creating a directory tree from scratch. For a new project, the easiest thing to<br />
do is probably to create an empty directory structure, like this:<br />
<br />
$ mkdir sqlite_examples<br />
$ mkdir sqlite_examples/man<br />
$ mkdir sqlite_examples/testing<br />
<br />
<br />
After that, you use the import command to create the<br />
corresponding (empty) directory structure inside the repository:<br />
<br />
<br />
$ cd <directory><br />
$ cvs -d repository_root_directory import -m "Created directory structure" yoyodyne/dir yoyo start<br />
<br />
Or, here is a specific example.<br />
<br />
$ cd sqlite_examples<br />
$ cvs -d /work/cvsREPOSITORY/ import -m 'test SQlite' sqlite_examples sqlite_examples start<br />
<br />
Now, you can delete the directory sqlite_examples, or go to another directory and type<br />
the following:<br />
<br />
$ cvs -d /work/cvsREPOSITORY/ co sqlite_examples<br />
<br />
COOL TOOLS:<br />
<br />
1. cvsps<br />
2. cvsreport<br />
<br />
cvsps which you can find at http://www.cobite.com/cvsps/cvsps-2.0rc1.tar.gz<br />
<br />
$ cvsps -f README_sqlite_tutorial.html<br />
<br />
<br />
<br />
TIP 97:<br />
<br />
Common vi and vim commands<br />
<br />
Command mode ESC<br />
<br />
dd delete<br />
u undelete<br />
y yank (copy to buffer)<br />
p/P p before cursor/P after cursor<br />
<br />
Ctl-g show current line number<br />
shft-G end of file<br />
n shft-G move to line n<br />
<br />
/stuff/ search<br />
n repeat in same direction<br />
N repeat in opposite direction<br />
/return repeat seach forward<br />
?return repeat seach backward<br />
<br />
"dyy Yank current line to buffer d<br />
"a7yy Yank next 7 lines to buffer a<br />
or<br />
:1,7ya a Yank [ya] lines 1,7 to buffer a<br />
:1,7ya b Yank [ya] lines 1,7 to buffer b<br />
<br />
:5 pu b Put [pu] buffer b after line 5<br />
<br />
"dP Put the content of buffer d before cursor<br />
"ap Put the contents of buffer a after cursor<br />
<br />
:1,4 w! file2 Write lines 1,4 to file2<br />
:1,3<br />
<br />
:set nu Display line numbers<br />
:set nonum Turns off display<br />
<br />
:e <filename> Edit a file in a new buffer<br />
<br />
vim<br />
:split<br />
:split <filename><br />
:sp <filename><br />
:split new<br />
<br />
ctl-w To move between windows<br />
ctl-w+<br />
ctl-w- To change size<br />
ctl+wv Split windows vertically<br />
ctl-wq Close window<br />
<br />
:only To view only 1 window<br />
<br />
vim dictionary - put the following command in ~/.vimrc<br />
<br />
set dictionary+=/usr/share/dict/words<br />
set thesaurus+=/usr/share/dict/words<br />
<br />
Now, after you type a word <ctl-x><ctl-k><ctl-n> and to <br />
go back in the listing <ctl-p><br />
<br />
butter<ctl-x><ctl-k><ctl-n><br />
<br />
<br />
<br />
TIP 98:<br />
<br />
Using apt-get<br />
<br />
$ apt-get update<br />
$ apt-get -s install <pkage> <---- if everything is ok, then, remove the s<br />
<br />
Note you may want to use dpkg to purge if you have to do a reinstall.<br />
<br />
$ dpkg --purge exim4-base<br />
$ dpkg --purge exim4-config<br />
$ apt-get install exim4<br />
<br />
$ dpkg-reconfigure exim4-config<br />
<br />
<br />
<br />
TIP 99:<br />
<br />
Mounting a cdrom on openbsd and installing packages<br />
<br />
$ mkdir -p /cdrom<br />
$ mount /dev/cd0a /cdrom<br />
$ cd /cdrom<br />
<br />
To add packages<br />
<br />
$ pkg_add -v <directory><br />
<br />
Mounting a cdrom on linux to a user's home sub-directory:<br />
<br />
$ mkdir -p /home/chirico/cdrom<br />
$ mount /dev/cdrom /home/chirico/cdrom<br />
<br />
<br />
<br />
TIP 100:<br />
<br />
Creating a boot floppy for knoppix cd:<br />
<br />
$ dd if=/mnt/cdrom/KNOPPIX/boot.img of=/dev/fd0 bs=1440k<br />
<br />
References:<br />
http://www.knoppix.net/docs/index.php/BootFloppyHowTo<br />
<br />
For a lot of the knoppix how-to's<br />
http://www.knoppix.net/docs/index.php/<br />
<br />
<br />
<br />
TIP 101:<br />
<br />
Diction and Style Tools for Linux http://ftp.gnu.org/gnu/diction/<br />
<br />
$ diction mytext|less<br />
<br />
Or, this can be done interactively<br />
<br />
$ diction<br />
This is more text to read and you can do with it<br />
what you want.<br />
(stdin):1: This is more text to read and you [can -> (do not confuse with "may")] do with it what you want.<br />
<br />
DESCRIPTION<br />
Diction finds all sentences in a document, that contain phrases from a<br />
database of frequently misused, bad or wordy diction. It further<br />
checks for double words. If no files are given, the document is read<br />
from standard input. Each found phrase is enclosed in [ ] (brackets).<br />
Suggestions and advice, if any, are printed headed by a right arrow ->.<br />
A sentence is a sequence of words, that starts with a capitalised word<br />
and ends with a full stop, double colon, question mark or exclaimation<br />
mark. A single letter followed by a dot is considered an abbreviation,<br />
so it does not terminate a sentence. Various multi-letter abbrevia-<br />
tions are recognized, they do not terminate a sentence as well.<br />
<br />
<br />
<br />
TIP 102:<br />
<br />
Using a mail alias.<br />
<br />
Suppose all root mail on your system to go to one root account root@main.com<br />
<br />
In the following file:<br />
<br />
/etc/aliases<br />
<br />
Add this line<br />
<br />
root: root@main.com<br />
<br />
Next, run newaliases [/usr/bin/newaliases] as follows:<br />
<br />
$ newaliases<br />
<br />
<br />
Special note: It's possible to send mail to more than one address. Suppose you want<br />
mail going to root@main.com above, plus you want it going to user donkey<br />
on the local system.<br />
<br />
root: root@main.com donkey<br />
<br />
<br />
<br />
TIP 103:<br />
<br />
Chrony - this service is similiar to ntp. It keeps accurate time<br />
on your computer against a very accurate clock in across<br />
a network with various time delays.<br />
<br />
Reference: http://go.to/chrony<br />
<br />
In the file "/etc/chrony/chrony.conf" add/replace the following<br />
<br />
server 146.186.218.60<br />
server 128.118.25.3<br />
server 128.2.129.21<br />
<br />
Next start the chrony service<br />
<br />
$ /etc/init.d/chrony restart<br />
<br />
Next verify that this is working. It may take 20 or 30 minutes to update<br />
the clock.<br />
<br />
<br />
Shell command:<br />
# chronyc<br />
chronyc> sourcestats<br />
210 Number of sources = 3<br />
Name/IP Address NP NR Span Frequency Freq Skew Std Dev<br />
========================================================================<br />
b50.cede.psu.edu 2 0 64 0.000 2000.000 4000ms<br />
otc2.psu.edu 2 0 66 0.000 2000.000 4000ms<br />
FS3.ECE.CMU.EDU 2 0 64 0.000 2000.000 4000ms<br />
chronyc><br />
<br />
It is probably best to let chrony do its work. However, if you want to<br />
set both the hardware and software clock, the following will work:<br />
<br />
Sets the hardware clock<br />
# hwclock --set --date="12/10/04 10:18:05"<br />
Sync the hardware clock to software<br />
# hwclock --hctosys<br />
<br />
Normally the system keep accurate time with the software clock.<br />
<br />
<br />
<br />
TIP 104:<br />
<br />
NFS mount<br />
<br />
SERVER (192.168.1.182)<br />
<br />
Make sure nfs is running on the server<br />
<br />
$ /etc/init.d/nfs restart<br />
<br />
At the server the contents of /etc/exports for<br />
allowing 2 computers (192.168.1.171 and 192.168.1.71)<br />
to access the home directory of this server. Note that<br />
read write (rw) access is allowed.<br />
<br />
$ cat /etc/exports<br />
/home 192.168.1.171(rw)<br />
/home 192.168.1.71(rw)<br />
<br />
Or, if you have a lot of clients on 192.168.1.* then consider<br />
the following:<br />
<br />
/home 192.168.1.0/255.255.252.0(rw)<br />
<br />
Next, still at the server, run the exportfs command<br />
<br />
$ exportfs -rv<br />
<br />
IPTABLES (lokkit). If you're using fedora with default lokkit firewall<br />
then you can put the following under "Other ports".<br />
<br />
Other ports nfs:tcp nfs:udp<br />
<br />
<br />
If the above does not work or you are not using lokkit<br />
IPTABLES (values in /etc/sysconfig/iptables on SERVER )<br />
<br />
# NFS Need to accept fragmented packets and may not have header<br />
# so you will not know where they are coming from<br />
-A INPUT -f -j ACCEPT<br />
-A INPUT -p tcp -m tcp -s 192.168.1.171 -m multiport --dports 111,683,686,685,1026,2049,2219 -j ACCEPT<br />
-A INPUT -p tcp -s 192.168.1.171 -d 0/0 --dport 32765:32768 -j ACCEPT<br />
-A INPUT -p udp -m udp -s 192.168.1.171 -m multiport --dports 111,683,686,685,1026,2049,2219 -j ACCEPT<br />
-A INPUT -p udp -s 192.168.1.171 -d 0/0 --dport 32765:32768 -j ACCEPT<br />
<br />
-A INPUT -f -j ACCEPT<br />
-A INPUT -p tcp -m tcp -s 192.168.1.71 -m multiport --dports 111,683,686,685,1026,2049,2219 -j ACCEPT<br />
-A INPUT -p tcp -s 192.168.1.71 -d 0/0 --dport 32765:32768 -j ACCEPT<br />
-A INPUT -p udp -m udp -s 192.168.1.71 -m multiport --dports 111,683,686,685,1026,2049,2219 -j ACCEPT<br />
-A INPUT -p udp -s 192.168.1.71 -d 0/0 --dport 32765:32768 -j ACCEPT<br />
<br />
(Reference: http://nfs.sourceforge.net/nfs-howto/server.html)<br />
and<br />
(Reference: http://nfs.sourceforge.net/nfs-howto/security.html)<br />
<br />
<br />
CLIENT1 (192.168.1.171)<br />
<br />
$ mkdir -p /home2<br />
<br />
$ cat /etc/fstab<br />
192.168.1.182:/home /home2 nfs rw 0 0<br />
<br />
$ mount -a -t nfs<br />
<br />
Or to do a one time mounting by hand<br />
<br />
$ mount -t nfs 192.168.1.182:/home /home2<br />
<br />
Now /home2 on the client will be /home on the server<br />
<br />
Reference:<br />
http://nfs.sourceforge.net/nfs-howto/index.html<br />
<br />
MONITOR NFS:<br />
<br />
To monitor the client:<br />
<br />
$ nfsstat -c<br />
<br />
Also note you can "cat /proc/net/rpc/nfs" as well.<br />
<br />
To monitor the server (note the -s instead of the -c).<br />
<br />
$ nfsstat -s<br />
<br />
Also note you can "cat /proc/net/rpc/nfsd" as well.<br />
<br />
<br />
The following "cat" command is done on the NFS server, and shows which<br />
clients are mounting. This does not go with examples above. By the way,<br />
"root_squash" is the default, and means that root access on the clients is<br />
denied. So, how does the client root get access to these filesystems? You have<br />
to "su - <someuser>".<br />
<br />
$ cat /proc/fs/nfs/exports<br />
# Version 1.1<br />
# Path Client(Flags) # IPs<br />
/home 192.168.1.102(rw,root_squash,sync,wdelay)<br />
/home squeezel.squeezel.com(rw,root_squash,sync,wdelay)<br />
/home 192.168.1.106(rw,root_squash,sync,wdelay)<br />
/home livingroom.squeezel.com(rw,root_squash,sync,wdelay)<br />
/home 10.8.0.1(rw,root_squash,sync,wdelay)<br />
/home closet.squeezel.com(rw,root_squash,sync,wdelay)<br />
<br />
(Reference: http://www.vanemery.com/Linux/NFSv4/NFSv4-no-rpcsec.html#automount )<br />
<br />
<br />
<br />
<br />
TIP 105:<br />
<br />
Ports used for Microsoft products<br />
http://www.microsoft.com/canada/smallbiz/sgc/articles/ref_net_ports_ms_prod.mspx?pf=true<br />
Firewalling?<br />
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/library/ServerHelp/428c1bbf-2ceb-4f76-a1ef-0219982eca10.mspx<br />
<br />
To find out common port mappings, take a look at "/etc/services"<br />
<br />
<br />
<br />
TIP 106:<br />
<br />
Man pages: If man pages are formatting incorrectly with PuTTY, try editing<br />
the "/etc/man.config" file with the following changes:<br />
<br />
NROFF /usr/bin/groff -Tlatin1 -mandoc<br />
NEQN /usr/bin/geqn -Tlatin1<br />
<br />
(Reference TIP 7 for using man)<br />
<br />
<br />
<br />
TIP 107:<br />
<br />
Valgrind: check for memory leaks in your programs. (http://valgrind.org/)<br />
<br />
This is how you can run it on the program "a.out" for valgrind version 2.2.0<br />
<br />
$ valgrind --logfile=valgrind.output --tool=memcheck ./a.out<br />
<br />
This is how you write the logfile "--log-file" for valgrind-3.0.1<br />
<br />
$ valgrind --log-file=valgrind --leak-check=yes --tool=memcheck ./a.out<br />
<br />
With C++ programs with gcc 3.4 and later that use STL, export GLIBCXX_FORCE_NEW <br />
only when testing to disable memory caching. Remember to enable for production<br />
as this will have a performance penalty. Reference http://valgrind.org/docs/FAQ/ <br />
<br />
<br />
<br />
TIP 108:<br />
<br />
Runlevel Configuring.<br />
<br />
These two programs, run as root give you a ncurses GUI to what will<br />
run on your system on boot.<br />
<br />
# ntsysv<br />
<br />
# chkconfig<br />
<br />
Note, you can also set these manually. For example, normally you will<br />
have files in "/etc/init.d/" that will take parameters like "start","stop"<br />
"restart".<br />
<br />
Take a look at "/etc/init.d/mysql" this file will start and stop the<br />
mysql daemon. So, how does know which run levels, and the order it gets<br />
loaded in the run level to other programs? By the K<number> and S<number><br />
values.<br />
<br />
$ ls /etc/rc3.d/*mysql<br />
<br />
/etc/rc3.d/K85mysql<br />
/etc/rc3.d/S85mysql<br />
<br />
So here on my system the start value is 85. Looking in /etc/rc3.d, which is<br />
run level 3, any program with a lower number S84something will get loaded<br />
before mysql.<br />
<br />
I manually set the run level as follows for mysql.<br />
<br />
# cd /etc/rc3.d<br />
# ln -s ../init.d/mysql S85mysql<br />
# ln -s ../init.d/mysql K85mysql<br />
<br />
# cd /etc/rc5.d<br />
# ln -s ../init.d/mysql S85mysql<br />
# ln -s ../init.d/mysql K85mysql<br />
<br />
Note that I could have chose other numbers as well. "ntsysv" gives<br />
you a graphical interface.<br />
<br />
This is a way of doing this with "chkconfig" at the command prompt.<br />
<br />
# chkconfig --list mysqld<br />
mysqld 0:off 1:off 2:off 3:on 4:off 5:on 6:off<br />
<br />
Above you can see it's on. Here's how we would have turned this on with chkconfig.<br />
<br />
# chkconfig --level 35 mysqld on<br />
<br />
<br />
<br />
<br />
TIP 109:<br />
<br />
File Alteration Monitor - Gamin a FAM replacement<br />
http://www.gnome.org/~veillard/gamin/<br />
http://www.gnome.org/~veillard/gamin/sources/<br />
****** EXAMPLE NOT COMPLETE *****<br />
<br />
Working with fam - file alteration monitor. Mail uses this to signify<br />
a change in a file's status.<br />
<br />
Below is the sample C program ftest.c which can be compiled as<br />
follows:<br />
<br />
$ gcc -o ftest ftest.c -lfam<br />
<br />
You will need to work with this as root<br />
<br />
# ./ftest <somefile absolute path><br />
<br />
<br />
Reference:<br />
http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?db=man&fname=/usr/share/catman/p_man/cat3x/fam.z<br />
http://www.devchannel.org/devtoolschannel/04/05/13/2146252.shtml<br />
<br />
<br />
<br />
TIP 110:<br />
<br />
glibc - this is the main library used by C, and the following<br />
link below gives you examples on everything from sockets,math,<br />
date and time functions, user environment, and much more.<br />
<br />
http://www.gnu.org/software/libc/manual/html_mono/libc.html<br />
<br />
How do you know which version of glibc you are running?<br />
<br />
#include <stdio.h><br />
#include <gnu/libc-version.h><br />
int main (void)<br />
{<br />
puts (gnu_get_libc_version ());<br />
return 0;<br />
}<br />
<br />
<br />
<br />
TIP 111:<br />
<br />
nslookup and dig - query Internet name servers interactively.<br />
<br />
$ nslookup<br />
>chirico.org<br />
Server: 68.80.0.6<br />
Address: 68.80.0.6#53<br />
<br />
Name: chirico.org<br />
Address: 66.35.250.210<br />
><br />
<br />
The nslookup command will query the dns server is "/etc/resolve.conf"<br />
However, you can force a certain dns with "- server". For example the<br />
command below goes to the server named dilbert<br />
<br />
$ nslookup - dilbert<br />
><br />
<br />
dig:<br />
<br />
dig gives you more information. You should probably use dig instead<br />
of nslookup.<br />
<br />
Below I am forcing the lookup from DNS 68.80.0.6 of the name chirico.org, and<br />
note that the query time is return too.<br />
<br />
$ dig @68.80.0.6 +qr chirico.org<br />
<br />
; <<>> DiG 9.2.1 <<>> @68.80.0.6 +qr chirico.org<br />
;; global options: printcmd<br />
;; Sending:<br />
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55908<br />
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0<br />
<br />
;; QUESTION SECTION:<br />
;chirico.org. IN A<br />
<br />
;; Got answer:<br />
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55908<br />
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2<br />
<br />
;; QUESTION SECTION:<br />
;chirico.org. IN A<br />
<br />
;; ANSWER SECTION:<br />
chirico.org. 5538 IN A 66.35.250.210<br />
<br />
;; AUTHORITY SECTION:<br />
chirico.org. 30599 IN NS ns78.worldnic.com.<br />
chirico.org. 30599 IN NS ns77.worldnic.com.<br />
<br />
;; ADDITIONAL SECTION:<br />
ns78.worldnic.com. 16022 IN A 216.168.225.218<br />
ns77.worldnic.com. 7 IN A 216.168.228.41<br />
<br />
;; Query time: 155 msec<br />
;; SERVER: 68.80.0.6#53(68.80.0.6)<br />
;; WHEN: Thu Dec 23 07:48:23 2004<br />
;; MSG SIZE rcvd: 127<br />
<br />
So what if you wanted to know what name the IP address 66.35.250.210<br />
resolves to, when using dns 68.80.0.12.<br />
<br />
$ dig @68.80.0.12 -x 66.35.250.210<br />
...<br />
;; ANSWER SECTION:<br />
210.250.35.66.in-addr.arpa. 3600 IN CNAME 210.0/24.250.35.66.in-addr.arpa.<br />
210.0/24.250.35.66.in-addr.arpa. 3600 IN PTR vhost.sourceforge.net.<br />
<br />
Above you can see it resolved to "vhost.sourceforge.net"<br />
<br />
Reference ( http://www.tldp.org/HOWTO/DNS-HOWTO-5.html )<br />
Also see TIP 223.<br />
<br />
<br />
<br />
TIP 112:<br />
<br />
Using GNU Autotools - so you can produce the familiar "./configure" "make" and "make install"<br />
commands. There is also a "make dist".<br />
<br />
The program sqlite3api.cc and the rest of this code can be found at<br />
http://prdownloads.sourceforge.net/cpearls/autotools.tar.gz?download<br />
<br />
<br />
A "Makefile.am" is required:<br />
<br />
bin_PROGRAMS = sprog<br />
sprog_SOURCES = sqlite3api.cc<br />
sprog_LDADD = @INCLUDES@ @SQLIBOBJS@<br />
<br />
<br />
In addition, a "configure.in" file is required. Note, AC_CHECK_LIB will<br />
check the "libsqlite3.so" file for the "sqlite3_open" file. Note that<br />
"sqlite3", is a shortcut for "libsqlite3" by convention. If this file<br />
is not found, AC_CHECK_FILE looks for "/usr/local/lib/libsqlite3.a". If<br />
this is found, then, "-lsqlite3" is added to the LIBS environment variable.<br />
Also, "-I/usr/local/include" and "-L/usr/local/lib" will be added on the<br />
command line. This is common when some one does not have the library in<br />
the path. (See TIP 49)<br />
<br />
dnl Process this file with autoconf to produce a configure script.<br />
AC_INIT(sqlite3api.cc)<br />
AM_INIT_AUTOMAKE(sqliteprog, 1.0)<br />
AC_PROG_CXX<br />
CXXFLAGS='-Wall -W -O2 -s -pipe'<br />
AC_CHECK_LIB(sqlite3,sqlite3_open,[],found=no)<br />
if test "$found" = "no"; then<br />
AC_CHECK_FILE(/usr/local/lib/libsqlite3.a, found=yes)<br />
if test "$found" = "yes"; then<br />
LIBS="$LIBS -lsqlite3"<br />
INCLUDES="$INCLUDES -I/usr/local/include"<br />
EXTRALIB='-L/usr/local/lib'<br />
else<br />
echo "Are you SURE sqlite3 is installed?"<br />
fi<br />
fi<br />
SQLIBOBJS='-Wl,-R/usr/local/lib'<br />
AC_SUBST(INCLUDES)<br />
AC_SUBST(SQLIBOBJS)<br />
AC_SUBST(EXTRALIB)<br />
AC_OUTPUT(Makefile)<br />
<br />
<br />
To build the configure file, just run the following:<br />
<br />
$ aclocal<br />
$ autoconf<br />
$ touch NEWS README AUTHORS ChangeLog<br />
$ automake --add-missing<br />
<br />
Now if you want to make a tar.gz file "sqliteprog-1.0.tar.gz", then<br />
all you have to run is the following:<br />
<br />
$ make dist<br />
<br />
Note: did you ever want to save all the output from a ./configure? Well, it<br />
is automatically saved in the "config.log" file. In fact, this file may<br />
contain a lot more than what you saw on the screen.<br />
<br />
Also, you may need to rerun ./configure. But before you do, delete<br />
the "config.cache" file to get a clean build.<br />
<br />
<br />
<br />
TIP 113:<br />
<br />
EMACS - common emacs commands.<br />
<br />
M is the ESC<br />
C or c is the Ctl<br />
<br />
Shell - when working in a shell. "M-x rename-uniquely" is good for split screen editing.<br />
<br />
M-x rename-uniquely Use this for multiple shells (renames buffer so it's not the same shell)<br />
C-c C-z Send job in background (when working in a shell)<br />
C-c C-o commit-kill-output (gets rid of a lot of shell output)<br />
C-c C-r reposition at beginning of output<br />
C-c C-e reposition at end of output<br />
M-x send-invisible Hide passwords - use this before typing a password<br />
<br />
Note: if the shell prompt does not show up correctly, then, you may want to creat a ".emacs_bash"<br />
file with the following contents:<br />
<br />
PS1="emacs:\W \$ "<br />
<br />
Directories (C-x d) give you a directory listing. You know all those annoying "~" and "#"<br />
file that you get? You can easily delete these when in "dired" mode by hitting<br />
"~", then "d" to flag it for delete. Then, hit "x" to and confirm deletion.<br />
<br />
These are other command that work on highlighted files in "dired" mode.<br />
<br />
R rename<br />
v view<br />
Z compress the file<br />
+ create directory<br />
<br />
Other common commands:<br />
<br />
c-x l list the line you are on, and how many lines in the document.<br />
You will get something like: Page has 4881 lines (4440 + 442),<br />
which means you are on the 4440 line.<br />
<br />
c-x rm bookmark make<br />
c-x rb bookmark bounce<br />
<br />
c-x rb notes<br />
c-x rb emacs<br />
<br />
c-x / <r> (save position in register <r>)<br />
c-x j <r> (jump to position in register <r>)<br />
c-x r SPC 1 (mark current point in register 1)<br />
c-x r j 1 (jump to marked point in register 1)<br />
c-x r t <string> (insert string into register)<br />
<br />
c-x r s 1 (save marked region in register 1)<br />
c-x r i 1 (insert marked region)<br />
<br />
c-x c-o (delete all blank lines, except one)<br />
<br />
c-x z (repeat the last command ... stop with an a)<br />
c-x zz (repeat the last command twice)<br />
<br />
rectangle<br />
---------<br />
C-SPC<br />
goto the next region<br />
C-x<br />
C-x<br />
then, C-x r r "name of register"<br />
<br />
to insert the register<br />
C-x r i "name of register"<br />
<br />
macros:<br />
-------<br />
c-x ( start macro<br />
c-x ) end macro<br />
c-x e execute macro<br />
<br />
mail:<br />
-----<br />
c-x m mail<br />
c-c c-s send<br />
<br />
C-x C-e<br />
(insert "\n\nExtra Line of text")<br />
<br />
;; chirico functions in .emacs<br />
;; This creates an html template<br />
(defun my-html ()<br />
(interactive)<br />
(insert "<html><br />
<head><br />
<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\"><br />
<META HTTP-EQUIV=\"Expires\" CONTENT=\"-1\"><br />
</head><br />
<body bgcolor=\"#ffffff\"><br />
<br />
<br />
</body><br />
</html>")<br />
)<br />
<br />
Backspace issues when using "emacs -nw"? They putting the following in your "~/.emacs" file<br />
<br />
(global-set-key "\C-d" 'backward-delete-char)<br />
(global-set-key "\C-h" 'backward-delete-char)<br />
(global-set-key (kbd "DEL") 'delete-char)<br />
<br />
<br />
<br />
TIP 114:<br />
<br />
ncftpget - an intelligent ftp client (http://www.ncftp.com/). Also<br />
check your fedora or debian install. This package allows<br />
you to easily download packages from ftp sites.<br />
<br />
This is an example of connect to an ftp site, with a subdirectory, and<br />
downloading all in one command.<br />
<br />
$ ncftpget ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.2.3/gcc-3.2.3.tar.gz<br />
<br />
Of if you want to get the fedora core 3 installs<br />
<br />
$ ncftpget ftp://ftp.linux.ncsu.edu/pub/fedora/linux/core/3/i386/iso/FC3*<br />
<br />
<br />
<br />
TIP 115:<br />
<br />
expr - evaluate expressions. You can use this on the command line<br />
<br />
$ expr 6 + 4<br />
10<br />
<br />
Note the spaces. Without spaces, you get the following:<br />
<br />
$ expr 6+4<br />
6+4<br />
<br />
If you're using "*", you'll need a "\" before it<br />
<br />
$ expr 10 \* 10<br />
100<br />
<br />
This also works for variables<br />
<br />
$ var1=34<br />
$ expr $var1 + 3<br />
37<br />
<br />
or<br />
<br />
$ var1=2<br />
$ var1=`expr $var1 \* 2`<br />
$ echo $var1<br />
4<br />
<br />
see (TIP 25) you can get the cosine(.23)<br />
<br />
$ var1=`echo "c(.23)"|bc -l`<br />
$ echo $var1<br />
.97366639500537483696<br />
<br />
<br />
You can also do substrings:<br />
<br />
$ expr substr "BigBear" 4 4<br />
Bear<br />
<br />
And length of strings<br />
<br />
$ mstr="12345"<br />
$ expr length $mstr<br />
5<br />
<br />
Regular expressions<br />
<br />
$ expr "a3" : [a-z][1-9]<br />
2<br />
<br />
Or you can get a bit fancy<br />
<br />
$ myexpr="[a-z][1-9]"<br />
$ echo $myexpr<br />
[a-z][1-9]<br />
<br />
$ expr "a3" : $myexpr<br />
2<br />
<br />
This may not be the best way to find out if it is Friday, but<br />
it seems to work. It's more of an exercise in xargs.<br />
<br />
$ date<br />
Fri Dec 31 16:44:47 EST 2004<br />
$ date|xargs -i expr {} : "[Fri]"<br />
1<br />
<br />
<br />
<br />
TIP 116:<br />
<br />
eval<br />
<br />
$ mypipe="|"<br />
$ eval ls $mypipe wc<br />
6 6 129<br />
<br />
Did you catch that? The above statement is the same as<br />
<br />
$ ls | wc<br />
<br />
Where "|" is put into the variable $mypipe<br />
<br />
(also see TIP 118)<br />
<br />
<br />
<br />
TIP 117:<br />
<br />
lxr, glimpse, patchset - tools for reading the kernel source<br />
<br />
This example puts some of the files in /home/src since my home<br />
partition is the largest. Plus, you do not want to over write<br />
the source in /usr/src/ If you want to put your files elsewhere<br />
just substitute /home/src for your desired directory.<br />
<br />
patchset -- download and setup<br />
<br />
$ export SRCDIR=/home/src<br />
$ cd $SRCDIR<br />
$ wget http://www.csn.ul.ie/~mel/projects/patchset/patchset-0.5.tar.gz<br />
$ export PATH=$PATH:$SRCDIR/patchset-0.5/bin<br />
<br />
Now edit "/home/src/patchset-0.5/etc/patchset.conf" and set WWW_USER to<br />
whatever your website runs as<br />
<br />
export WWW_USER=nobody<br />
<br />
Getting kernel source. The last step builds and asks a lot of questions. Enter<br />
yes to things that interest you, since this is what you will see in the source<br />
code. It is not going to build for booting. The "downlaod -p" is for downloading<br />
a patch.<br />
<br />
$ download 2.6.10<br />
$ createset 2.6.10<br />
$ make-kernel -b 2.6.10<br />
<br />
glimpse -- download and setup<br />
<br />
$ mkdir -p /home/src/glimpse<br />
$ cd /home/src/glimpse<br />
$ wget http://webglimpse.net/trial/glimpse-latest.tar.gz<br />
$ tar -xzf glimpse-latest.tar.gz<br />
$ cd glimpse-4.18.0<br />
$ ./configure; make<br />
$ make install<br />
<br />
lxr -- download and setup<br />
<br />
$ make -p /home/src/lxr<br />
$ cd /home/src/lxr<br />
$ wget http://heanet.dl.sourceforge.net/sourceforge/lxr/lxr-0.3.1.tar.gz<br />
$ cd lxr-0.3<br />
<br />
Edit "Makefile" and set PERLBIN to "/usr/bin/perl" or the where perl is<br />
on your system. Also set INSTALLPREFIX to "/var/www/lxr". Then, as root<br />
do the following:<br />
<br />
$ make install<br />
<br />
Apache changes<br />
<br />
Next edit the apache httpd.conf. On my system it is<br />
"/usr/local/apache2/conf/httpd.conf", but if you did a fedora install<br />
I think this file is located at "/etc/httpd/conf/httpd.conf".<br />
<br />
Alias /lxr/ "/var/www/lxr/"<br />
<Directory "/var/www/lxr/"><br />
Options ExecCGI Indexes Includes FollowSymLinks MultiViews<br />
AllowOverride all<br />
Order allow,deny<br />
Allow from all<br />
<br />
<Files ~ (search|source|ident|diff|find)><br />
SetHandler cgi-script<br />
</Files><br />
</Directory><br />
<br />
lxr - continued "/var/www/lxr/http/lxr.conf" changes. The following contains<br />
my lxr.conf with changes made to almost every variable. Make sure you use<br />
your website in place of 192.168.1.71<br />
<br />
# Configuration file.<br />
<br />
# Define typed variable "v", read valueset from file.<br />
variable: v, Version, [/var/www/lxr/source/versions], [/var/www/lxr/source/defversion]<br />
<br />
# Define typed variable "a". First value is default.<br />
variable: a, Architecture, (i386, alpha, m68k, mips, ppc, sparc, sparc64)<br />
<br />
# Define the base url for the LXR files.<br />
baseurl: http://192.168.1.71/lxr/http/<br />
<br />
# These are the templates for the HTML heading, directory listing and<br />
# footer, respectively.<br />
htmlhead: /var/www/lxr/http/template-head<br />
htmltail: /var/www/lxr/http/template-tail<br />
htmldir: /var/www/lxr/http/template-dir<br />
<br />
# The source is here.<br />
sourceroot: /var/www/lxr/source/$v/<br />
srcrootname: Linux<br />
<br />
# "#include <foo.h>" is mapped to this directory (in the LXR source<br />
# tree)<br />
incprefix: /include<br />
<br />
# The database files go here.<br />
dbdir: /var/www/lxr/source/$v/<br />
<br />
# Glimpse can be found here.<br />
glimpsebin: /usr/local/bin/glimpse<br />
<br />
# The power of regexps. This is pretty Linux-specific, but quite<br />
# useful. Tinker with it and see what it does. (How's that for<br />
# documentation?)<br />
map: /include/asm[^\/]*/ /include/asm-$a/<br />
map: /arch/[^\/]+/ /arch/$a/<br />
<br />
Now you should be ready to run "make-lxr". Make sure the path is setup to patchset,<br />
which is repeated here. The last step take awhile.<br />
<br />
$ export SRCDIR=/home/src<br />
$ cd $SRCDIR<br />
$ export PATH=$PATH:$SRCDIR/patchset-0.5/bin<br />
<br />
$ make-lxr 2.6.10<br />
<br />
Now you need to index the source. Below the ./glimpse_* file will be put in<br />
root. Checkout the -H option if you do not want them here on a temporary<br />
bases of if you run out of room.<br />
<br />
$ glimpseindex -o -t -w 5000 /var/www/lxr/source/2.6.10 >& .glimpse_out<br />
<br />
Since the above put the files under /root/.glimpse_* they should be moved<br />
<br />
$ mv /root/.glimps_* /var/www/lxr/source/2.6.10/.<br />
$ chown -R nobody.nobody ./.glimpse_*<br />
<br />
<br />
<br />
TIP 118:<br />
<br />
exec - you can change standard output and input without starting a new<br />
process.<br />
<br />
The exec redirect the output from ls and date to a file. Nothing<br />
is show on the terminal until "exec > /dev/tty" is performed<br />
<br />
$ exec > mfile<br />
$ ls<br />
$ date<br />
$ exec > /dev/tty<br />
<br />
This is an example of assigning file descriptor 3 to file "output3" for<br />
output, then, redirecting "ls" to this descriptor. Finally, file descriptor<br />
3 is used for input, and the contents are read into the cat command.<br />
<br />
<br />
$ exec 3>output3<br />
$ ls >& 3<br />
$ exec 3<output3<br />
$ cat <&3<br />
ChangeLog<br />
CVS<br />
How_to_Linux_and_Open_Source.txt<br />
How_to_Linux_and_Open_Source.txt.~1.193.~<br />
mfile<br />
mfile2<br />
mfile3<br />
mftp<br />
output3<br />
<br />
Could you redirect the output to 3 files and stderr?<br />
<br />
$ exec 3>output3<br />
$ exec 4>output4<br />
$ exec 5>output5<br />
<br />
$ ls >& 3 >& 4 >& 5 >& 2 // Nope, can't do this.<br />
output3 output4 output5<br />
<br />
Instead, you should do the following:<br />
<br />
$ ls | tee output3 | tee output4 |tee output5<br />
<br />
Closing the "output" file descriptor<br />
<br />
$ >&3-<br />
<br />
Closing the "input" file descriptor<br />
<br />
$ 3<&-<br />
<br />
See what is still open on 0-10<br />
<br />
$ lsof -a -p $$ -d 0-10<br />
<br />
Recursion - the following counts to 5, then, quits.<br />
<br />
#!/bin/bash<br />
sleep 1<br />
declare -x n<br />
let n=${n:=0}+1<br />
[ $n -le 5 ] && echo "$n" && exec $0<br />
<br />
There are some real-life applications for this technique, as follows:<br />
<br />
#!/bin/bash<br />
declare -x N<br />
declare -x n<br />
N=${N:=$(od -vAn -N1 -tu4 < /dev/urandom)}<br />
let n=${n:=0}+1<br />
[ $(($n%2)) -eq 0 ] && echo "She Loves Me!" || echo "She Loves Me NOT!"<br />
[ $n -lt $N ] && exec $0<br />
<br />
<br />
<br />
TIP 119:<br />
<br />
runlevel - need to know the current runlevel?<br />
<br />
$ who -r<br />
run-level 3 Dec 31 19:02 last=S<br />
<br />
Need to know the architecture?<br />
<br />
$ arch<br />
i686<br />
<br />
<br />
<br />
TIP 120:<br />
<br />
at - executes commands at a specified time.<br />
<br />
A few examples here. The 1970 program will run<br />
next Auguest 2 even though the year 1970 has long past.<br />
<br />
$ at 6:30am Jan 12 < program<br />
$ at noon tomorrow < program<br />
$ at 1970 pm August 2 < program<br />
<br />
This is an interactive way to use the command:<br />
<br />
$ at now + 6 minutes<br />
warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh<br />
at> ls<br />
at> date > /tmp/5min<br />
at> ^D<br />
job 3 at 2005-01-01 08:50<br />
<br />
What jobs are in the queue?<br />
<br />
$ atq<br />
<br />
or<br />
<br />
$ at -l<br />
<br />
<br />
<br />
TIP 121:<br />
<br />
Creating a Manpage<br />
<br />
As root you can copy the following to /usr/local/man/man1/soup.1 which will<br />
give you a manpage for soup.<br />
<br />
.\" Manpage for souptonuts.<br />
.\" Contact mchirico@users.sourceforge.com to correct errors or omissions.<br />
.TH man 1 "04 January 2005" "1.0" "souptonuts man page"<br />
.SH NAME<br />
soup \- man page for souptonuts<br />
.SH SYNOPSIS<br />
soup<br />
.SH DESCRIPTION<br />
souptonuts is a collection of linux and open<br />
source tips.<br />
off for golf.<br />
.SH OPTIONS<br />
The souptonuts does not take any options.<br />
.SH SEE ALSO<br />
doughnut(1), golf(8)<br />
.SH BUGS<br />
No known bugs at this time.<br />
.SH AUTHOR<br />
Mike Chirico (mchirico@comcast.net mchirico@users.sourceforge.net)<br />
<br />
So, to view this man page<br />
<br />
$ man soup<br />
<br />
It's also possible to compress<br />
<br />
$ gzip /usr/local/man/man1/soup.1<br />
<br />
For plenty of examples look at the other man pages. Also the following<br />
is helpful. The last one is a tutorial "man 7 mdoc"<br />
<br />
$ man manpath<br />
$ man groff<br />
$ man 7 mdoc<br />
<br />
<br />
<br />
TIP 122:<br />
<br />
dmesg - print out boot messages, or what is in the kernel ring buffer.<br />
<br />
If you missed the messages on boot-up, you can use dmesg to print them.<br />
<br />
$ dmesg > boot.msg<br />
<br />
Or to print, then, clear the ring<br />
<br />
# dmesg -c > boot.msg<br />
<br />
(also see TIP 20)<br />
<br />
<br />
<br />
TIP 123:<br />
<br />
gnus - emacs email nntp news reader (comcast as example with NO TLS or SSL)<br />
<br />
First check that you can connect to the news group:<br />
<br />
$ telnet newsgroups.comcast.net 119<br />
Trying 216.196.97.136...<br />
Connected to newsgroups.comcast.net.<br />
Escape character is '^]'.<br />
200 News.GigaNews.Com<br />
<br />
If you want to check for TLS or SSL see (TIP 54).<br />
<br />
Here is a very simple configuration example without encryption. It<br />
appears that comcast does not support ssl or TLS.<br />
<br />
In the "~/.emacs" file you would add the following to get comcast<br />
news groups<br />
<br />
(setq gnus-select-method '(nntp "newsgroups.comcast.net"))<br />
<br />
Then, create an "~/.authinfo" file with the following settings using<br />
you own username and password.<br />
<br />
machine newsgroups.comcast.net login borkey@comcast.net password borkeypass0rd<br />
<br />
Next create a "~/.newsrc" with your groups<br />
<br />
news.announce.newusers:<br />
comp.lang.c++.moderated! 1-500<br />
comp.unix.programmer! 1-500<br />
comp.unix.shell! 1-500<br />
gnu.emacs.gnus! 1-500<br />
<br />
Finally, create a "~/.gnus" with the following email settings for you<br />
<br />
(setq user-mail-address "mchirico@comcast.net")<br />
<br />
(defun my-message-mode-setup ()<br />
(setq fill-column 72)<br />
(turn-on-auto-fill))<br />
(add-hook 'message-mode-hook 'my-message-mode-setup)<br />
<br />
To get into gnus<br />
<br />
E-x gnus<br />
<br />
The following are common gnus commands<br />
<br />
RET view the article under the cursor<br />
<br />
A A (shift-a, shift a): List all newsgroups known<br />
to the server.<br />
<br />
l (lower-case L) : List only subscribed groups<br />
with unread articles.<br />
<br />
L : List all newsgroups in .newsrc file.<br />
<br />
g : See if new articles have arrived.<br />
<br />
Some commands for reading<br />
<br />
n next unread article<br />
<br />
p previous article<br />
<br />
SPC scroll down moves to next unread<br />
when at the bottom of the article<br />
<br />
del scroll up<br />
<br />
F follow-up to group on the article you are<br />
reading now.<br />
<br />
f follow-up to group without citing the article<br />
<br />
R reply by mail and cite the article<br />
<br />
r reply by mail without citing the article<br />
<br />
m new mail<br />
<br />
a new posting<br />
<br />
c Catchup<br />
<br />
C-u / t Show only young headers<br />
/ t without C-u limits the summary<br />
to old headers<br />
<br />
T T toggle threading<br />
<br />
C-u g Display raw article<br />
hit g to return to normal view<br />
<br />
t Show all headers it's a toggle<br />
<br />
W w Wordwrap the current article<br />
<br />
W r Decode ROT13 a toggle<br />
<br />
^ fetch parent of article<br />
<br />
L create a scorefile-entry based<br />
on the current article (low score)<br />
? gives you information what each char means<br />
<br />
I like L but high score<br />
<br />
Commands to send email<br />
<br />
C-c C-c send message<br />
<br />
C-c C-d save message as draft<br />
<br />
C-c C-k kill message<br />
<br />
C-c C-m f attach file<br />
<br />
M-q reformat paragraph<br />
<br />
<br />
TIP 124:<br />
<br />
Sending Email from telnet<br />
<br />
Note, if you are on the computer you can sometime use the local loopback.<br />
In fact, sometimes you can only use the local loop back 127.0.0.1 in<br />
place of "bozo.company.com"<br />
<br />
1 [mchirico@soup Notes]$ telnet bozo.company.com 25<br />
2 Trying 192.168.0.204...<br />
3 Connected to bozo.company.com.<br />
4 Escape character is '^]'.<br />
5 220 bozo.company.com ESMTP Postfix (Postfix-20010228-pl03) (Mandrake Linux)<br />
6 HELO fakedomain.com<br />
7 HELO fakedomain.com // server echo<br />
8 250 bozo.company.com<br />
9 MAIL FROM: test@fakedomain.com<br />
10 MAIL FROM: test@fakedomain.com // server echo<br />
11 250 Ok<br />
12 RCPT TO: mchirico@someother.com<br />
13 RCPT TO: mchirico@someother.com // server echo<br />
14 250 Ok<br />
15 DATA<br />
16 DATA // echo<br />
17 354 Enter mail, end with "." on a line by itself<br />
18 This is a test message<br />
19 This is a test message<br />
20 to send<br />
21 to send<br />
22 .<br />
23 250 2.0.0 j0B0uH3L018469 Message accepted for delivery<br />
<br />
Above on line 6 you can type in any domain name. Line 7 is an echo. All<br />
echos are listed in the comment field.<br />
<br />
<br />
<br />
TIP 125:<br />
<br />
IP forwarding, IP Masquerade<br />
<br />
# echo 1 > /proc/sys/net/ipv4/ip_forward<br />
# ipchains -F forward<br />
# ipchains -P forward DENY<br />
# ipchains -A forward -s 192.168.0.0/24 -j MASQ<br />
# ipchains -A forward -i eth1 -j MASQ<br />
<br />
<br />
This assumes that your internal network is 192.168.0.0 on eth1, and the<br />
internet is connected to eth0.<br />
<br />
(Also See TIP 182)<br />
<br />
<br />
<br />
TIP 126:<br />
<br />
Setting KDE as the default desktop manager<br />
<br />
Edit "/etc/sysconfig/desktop" to include the two lines:<br />
<br />
DESKTOP="KDE"<br />
DISPLAYMANAGER="KDE"<br />
<br />
<br />
<br />
TIP 127:<br />
<br />
Have a file and you do not know whay type it is (tar, gz, ASCII, binary) ?<br />
Use the file command. Below it is used on the file "mftp"<br />
<br />
$ file mftp<br />
mftp: Bourne-Again shell script text executable<br />
<br />
<br />
<br />
TIP 128:<br />
<br />
Software RAID: Two good references<br />
<br />
http://www.tldp.org/HOWTO/Software-RAID-HOWTO-1.html<br />
http://lists.us.dell.com/pipermail/linux-poweredge/2003-July/014331.html<br />
<br />
Note, you must setup grub for each RAID 1 device. Suppose you have<br />
2 SCSI drives (sda and sdb). By default grub is setup on sda; but, you<br />
need to enable it for sdb (/dev/hdb for ide) as follows:<br />
<br />
grub>device (hd0) /dev/sdb<br />
grub>root (hd0,0)<br />
grub>setup (hd0)<br />
<br />
Checking if "/boot/grub/stage1" exists... no<br />
Checking if "/grub/stage1" exists... yes<br />
Checking if "/grub/stage2" exists... yes<br />
Checking if "/grub/e2fs_stage1_5" exists.. yes<br />
Running "embed /grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded.<br />
succeeded<br />
Running "install /grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/grub/stage2 /grub/grub<br />
.conf"... succeeded.<br />
Done.<br />
<br />
grub><br />
grub>quit<br />
<br />
<br />
Checking to see if everything is working:<br />
<br />
$ cat /proc/mdstat<br />
<br />
Checking the drives<br />
<br />
$ sfdisk -d /dev/sdb<br />
$ sfdisk -d /dev/sda<br />
<br />
$ fdisk -l /dev/sda "This will give general information"<br />
$ fdisk -l "General information for all drives"<br />
<br />
Adding raid (assume you want to add the first drive "sda1", or if it is the second<br />
drive then substitute "sda2" below )<br />
<br />
$ raidhotadd /dev/md0 /dev/sda1<br />
$ raidhotadd /dev/md1 /dev/sda2<br />
$ raidhotadd /dev/md2 /dev/sda3<br />
<br />
This is an example of an cat /proc/mdstat that is working. Note that<br />
there is a listing for both sda1[0] and sdb1[1]<br />
<br />
$ cat /proc/mdstat<br />
<br />
Personalities : [raid1]<br />
read_ahead 1024 sectors<br />
Event: 12<br />
md0 : active raid1 sda1[0] sdb1[1]<br />
104320 blocks [2/2] [UU]<br />
<br />
md1 : active raid1 sda2[0] sdb2[1]<br />
1044160 blocks [2/2] [UU]<br />
<br />
md2 : active raid1 sda3[0] sdb3[1]<br />
34411136 blocks [2/2] [UU]<br />
<br />
unused devices: <none><br />
<br />
Compare that to this where md2 is missing sdb3<br />
<br />
$ cat /proc/mdstat<br />
<br />
Personalities : [raid1]<br />
read_ahead 1024 sectors<br />
Event: 9<br />
md0 : active raid1 sda1[0] sdb1[1]<br />
104320 blocks [2/2] [UU]<br />
<br />
md1 : active raid1 sda2[0] sdb2[1]<br />
1044160 blocks [2/2] [UU]<br />
<br />
md2 : active raid1 sdb3[1] <---- HERE<br />
34411136 blocks [2/1] [_U]<br />
<br />
unused devices: <none><br />
<br />
If you are rebuilding an array, you can watch it by doing the following:<br />
<br />
$ watch -n1 cat /proc/mdstat<br />
<br />
Need to know the raid setup?<br />
<br />
$ cat /etc/raidtab<br />
<br />
<br />
<br />
<br />
TIP 129:<br />
<br />
Resetting Redhat Linux Passwords using GRUB<br />
<br />
1. Press 'e'<br />
2. Press 'e' again<br />
3. Append 'single' to the kernel version listing<br />
<br />
See<br />
http://linuxgazette.net/107/tomar.html<br />
<br />
<br />
<br />
TIP 130:<br />
<br />
mtr - matt's traceroute. This is an advanced traceroute that keeps<br />
[http://www.bitwizard.nl/mtr/]<br />
$ mtr www.yahoo.com<br />
<br />
Matt's traceroute [v0.52]<br />
third-fl-71.localdomain Thu Jan 20 11:05:57 2005<br />
Keys: D - Display mode R - Restart statistics Q - Quit<br />
Packets Pings<br />
Hostname %Loss Rcv Snt Last Best Avg Worst<br />
1. 192.168.1.1 0% 3 3 0 0 0 1<br />
2. ???<br />
3. fe-2-6-rr01.willogrove5.pa.pa01 0% 3 3 8 7 7 8<br />
4. srp-8-1-ar01.willowgrove1.pa.pa 0% 2 2 8 8 8 8<br />
5. pos7-3-cr01.torresdale.pa.core. 0% 2 2 8 8 8 8<br />
6. 12.119.53.53 0% 2 2 12 12 12 13<br />
7. tbr1-p012401.phlpa.ip.att.net 0% 2 2 12 12 13 13<br />
8. tbr1-cl8.n54ny.ip.att.net 0% 2 2 13 13 13 13<br />
9. ggr2-p310.n54ny.ip.att.net 0% 2 2 12 12 13 14<br />
10. so-1-0-0.gar4.NewYork1.Level3.n 0% 2 2 14 14 37 61<br />
11. ae-1-54.bbr2.NewYork1.Level3.ne 0% 2 2 13 12 13 13<br />
12. ge-0-3-0.bbr2.Washington1.Level 0% 2 2 19 19 19 19<br />
13. ge-1-1-51.car1.Washington1.Leve 0% 2 2 18 18 19 20<br />
14. 4.79.228.6 0% 2 2 21 19 20 21<br />
15. UNKNOWN-216-109-120-201.yahoo.c 0% 2 2 21 20 20 21<br />
16. w2.rc.vip.dcn.yahoo.com 0% 2 2 23 21 22 23<br />
<br />
<br />
<br />
TIP 131:<br />
<br />
chfn - change finger information<br />
<br />
$ chfn<br />
<br />
Next you are asked for a password and user information.<br />
<br />
<br />
<br />
TIP 132:<br />
<br />
chsh - change login shell<br />
<br />
First, you may want to get a listing of all the possible<br />
shells.<br />
<br />
$ chsh -l<br />
<br />
/bin/sh<br />
/bin/bash<br />
/sbin/nologin<br />
/bin/ash<br />
/bin/bsh<br />
/bin/ksh<br />
/usr/bin/ksh<br />
/usr/bin/pdksh<br />
/bin/tcsh<br />
/bin/csh<br />
/bin/zsh<br />
<br />
<br />
<br />
TIP 133:<br />
<br />
bash - working with binary, hex and base 3.<br />
<br />
For the variable must be declare as an integer. Then<br />
specify the <base>#<value>. The example below is 22 in<br />
base 3.<br />
<br />
$ declare -i n<br />
$ n=3#22<br />
$ echo $n<br />
8<br />
<br />
Base 16 (hex)<br />
<br />
$ declare -i n2<br />
$ n2=16#a<br />
$ echo $n2<br />
10<br />
<br />
Base 8 (octal)<br />
<br />
$ declare -i n3<br />
$ n3=8#11<br />
$ echo $n3<br />
9 Note 8+1=9<br />
<br />
<br />
<br />
TIP 134:<br />
<br />
monitoring IP traffic. Try iptraf http://iptraf.seul.org/<br />
<br />
<br />
<br />
TIP 135:<br />
<br />
enscript - convert text files to PostScript<br />
<br />
<br />
<br />
TIP 136:<br />
<br />
dd and tar - blocking factor. How to determine the blocking factor, block size<br />
so that tar and dd can work together.<br />
<br />
Step 1: Create a large file on local disk, in a directory "1" that will eventually<br />
be written to tape. This will be created with dd as follows:<br />
<br />
$ mkdir 1<br />
$ dd if=/dev/zero of=disk-image count=40960<br />
40960+0 records in<br />
40960+0 records out<br />
<br />
$ cd ..<br />
<br />
Step 2: tar the directory and contents to tape. First rewind the tape. These examples<br />
use /dev/nst0 as the location of the tape. Make sure to substitute your values<br />
if needed.<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ tar --label="Test 1" --create --blocking-factor=128 --file=/dev/nst0 1<br />
<br />
Step 3: Read data from the tape using a block size of 128k. If you get an I/O error, which<br />
could happend if you used a different blocking factor above, then, you may need<br />
to increase the bs to 256, or 512 etc. as needed.<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ dd if=/dev/nst0 bs=128k of=testblocksz count=1<br />
0+1 records in<br />
0+1 records out<br />
<br />
$ ls -l testblocksz<br />
-rw-r--r-- 1 root root 65536 Feb 9 10:41 testblocksz<br />
<br />
$ ls -lh testblocksz<br />
-rw-r--r-- 1 root root 64k Feb 9 10:41 testblocksz<br />
<br />
Note above that the size 65536 is equal to 64k. That "h" switch in "ls" is for<br />
human readable.<br />
<br />
<br />
Step 4: tar uses a multiplier of 512*blocking-factor to get block size. Again<br />
<br />
512 * blocking-factor = block size used in dd command.<br />
<br />
Putting in the values, we see that<br />
<br />
512 * 128 = 65536<br />
<br />
<br />
Step 5: So what does this tell you? You can now use these numbers to "dd" files<br />
to tape. But, first tar will be used to create the file locally.<br />
<br />
$ tar --label="Test 1" --create --blocking-factor=128 --file=test.tar 1<br />
<br />
<br />
Step 6: Send this to tape with the dd command. Remember 64k is equal to 65536.<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ dd if=test.tar bs=64k of=/dev/nst0<br />
<br />
<br />
Step 7: Now test that it can be read with tar command using blocking-factor=128.<br />
Note the "t" command in tar is for tell. It will not write data.<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ tar -tvf /dev/nst0 --blocking-factor=128<br />
V--------- 0/0 0 2005-02-09 10:38:20 Test 1--Volume Header--<br />
drwxr-xr-x root/root 0 2005-02-09 10:34:10 1/<br />
-rw-r--r-- root/root 20971520 2005-02-09 10:34:11 1/disk-image<br />
<br />
<br />
Step 8: Reading tape data with dd. Most of the time a high "ibs" input block size<br />
<br />
$ mt -f /dev/nst0 rewind<br />
$ dd if=/dev/nst0 of=outfromdd.tar ibs=64k<br />
321+0 records in<br />
41088+0 records out<br />
<br />
<br />
Step 9: Verify that outfromdd.tar can be read by tar with blocking-factor=128<br />
<br />
$ tar -tvf outfromdd.tar --blocking-factor=128<br />
V--------- 0/0 0 2005-02-09 10:38:20 Test 1--Volume Header--<br />
drwxr-xr-x root/root 0 2005-02-09 10:34:10 1/<br />
-rw-r--r-- root/root 20971520 2005-02-09 10:34:11 1/disk-image<br />
<br />
<br />
PULLING FILES: The dd command can be used to pull files.<br />
<br />
ssh target_address dd if=remotefile | dd of=localfile<br />
<br />
Or, a specific example of getting a file from a computer called hamlet.<br />
<br />
$ ssh root@hamlet dd if=/home/cvs/test | dd of=/home/storage/test<br />
<br />
<br />
GOING BACKWARD AND FORWARD ON TAPE:<br />
<br />
Go to end of data<br />
$ mt -f /dev/nst0 eod<br />
<br />
Previous record<br />
$ mt -f /dev/nst0 bsfm 1<br />
<br />
Forward record<br />
$ mt -f /dev/nst0 fsf 1<br />
<br />
Rewind<br />
$ mt -f /dev/nst0 rewind<br />
<br />
Tell<br />
$ mt -f /dev/nst0 tell<br />
<br />
(Reference TIP 151 - for how to get around firewalls)<br />
<br />
Below is a script that I use to backup computers via ssh. The<br />
tape drive is on "nis" and the extra space is on "hamlet".<br />
<br />
#!/bin/bash<br />
# Program to backup server remotely<br />
# Assume remote server is nis, you are on squeezel<br />
#<br />
# Recover from tape<br />
#<br />
# dd if=/dev/nst0 of=test.tar.gz bs=64k<br />
#<br />
filename="support1.$(date "+%m%d%y%H%M").tar.gz"<br />
DIRTOBACKUP=/var/www<br />
#tar cvzf - $DIRTOBACKUP | ssh root@nis '(mt -f /dev/nst0 rewind; dd of=/dev/nst0 bs=64k )'<br />
tar cvzf - $DIRTOBACKUP | ssh support1@hamlet "dd of=/home/support1/backups/${filename} "<br />
<br />
Another example program, below, pushes the last ".tar.gz" file to tape:<br />
<br />
#!/bin/bash<br />
# Program to push files to tape<br />
#<br />
#<br />
# Notes on recovering from tape<br />
#<br />
# dd if=/dev/nst0 of=test.tar.gz ibs=64k<br />
# or<br />
# $ ssh root@tapeserver "mt -f /dev/nst0 rewind"<br />
# $ ssh root@tapeserver "dd if=/dev/nst0 ibs=64k"|dd of=cvs1.tar.gz<br />
#<br />
#<br />
#<br />
# First rewind tape<br />
ssh root@tapeserver 'mt -f /dev/nst0 rewind'<br />
#<br />
# Grab only the last file<br />
file=$(find /home/cvs -iname 'cvs*.tar.gz'|sort|tail -n 1)<br />
dd if=${file}|ssh root@tapeserver 'dd of=/dev/nst0 bs=64k'<br />
<br />
<br />
<br />
TIP 137:<br />
<br />
Apache - redirecting pages. All changes are in httpd.conf<br />
<br />
RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg<br />
<br />
Redirect /service http://foo2.bar.com/service<br />
<br />
<br />
<br />
TIP 138:<br />
<br />
samba mounts via ssh - mounting a samba share through an ssh tunnel, going<br />
through an intermediate computer, that accepts ssh. We'll call this<br />
intermediate computer middle [65.219.4.23], and we want to get to<br />
destination [192.168.0.81]. The user will be mchirico.<br />
<br />
STEP 1:<br />
<br />
$ mkdir -p /samba/share<br />
<br />
STEP 2:<br />
<br />
This has to be done as root, since we are using a lower port.<br />
<br />
$ ssh -N -L 139:192.168.0.81:139 mchirico@65.219.4.23<br />
<br />
STEP 3:<br />
<br />
umount /samba/sales<br />
/bin/mount -t smbfs -o username=donkey,workgroup=donkeydomain,<br />
password=passw0rk1,port=139,dmask=770,fmask=660,<br />
netbiosname=homecpu //localhost/share /samba/share<br />
<br />
<br />
<br />
<br />
TIP 139:<br />
<br />
Music on Fedora Core -- How to play music on http://magnatune.com with "xmms".<br />
<br />
The following command will show the sound driver:<br />
<br />
$ lspci|grep -i audio<br />
<br />
<br />
STEP 1:<br />
<br />
Unmute amixer with the following command:<br />
<br />
$ amixer set Master 100% unmute<br />
$ amixer set PCM 100% unmute<br />
<br />
Note you can also get a graphical interface with "alsamixer"<br />
<br />
$ alsamixer<br />
<br />
h,F1 -- for help<br />
Esc -- exit<br />
Tab -- move to selections<br />
<br />
<br />
STEP 2:<br />
<br />
Test a sound file "*.au" with aplay. To quickly find files on your system use<br />
the "locate *.au" command.<br />
<br />
$ aplay /usr/lib/python2.3/test/audiotest.au<br />
<br />
STEP 3:<br />
<br />
Install "xmms-mp3-1.2.10-9.2.1.fc3.rf.i386.rpm" which does not come with Fedora because<br />
of GPL license restrictions. The latest version of this package can be found<br />
at the following url:<br />
<br />
http://rpmseek.com/rpm-pl/xmms-mp3.html<br />
<br />
<br />
$ rpm -ivh xmms-mp3-1.2.10-9.2.1.fc3.rf.i386.rpm<br />
<br />
STEP 4:<br />
<br />
Go to magnatun "http://magnatune.com/", select genre and make sure xmms<br />
is the default player.<br />
<br />
<br />
<br />
TIP 140:<br />
<br />
Routing -- getting access to a network 1 hop away. You are currently on the 192 network<br />
and you want access to the 172.21.0.0 network that has a computer straddling<br />
the two, with /proc/sys/net/ipv4/ip_forward set to 1.<br />
<br />
<br />
$ route add -net 172.21.0.0 netmask 255.255.255.0 gw 192.168.0.204<br />
<br />
To undo:<br />
<br />
$ route del -net 172.21.0.0 netmask 255.255.255.0 gw 192.168.0.204<br />
<br />
Now you can ping 172.21.0.21.<br />
<br />
Does not work?<br />
<br />
Go on to 192.168.0.204 and execute the following commands:<br />
<br />
$ echo 1 > /proc/sys/net/ipv4/ip_forward<br />
$ cat /proc/sys/net/ipv4/ip_forward<br />
1<br />
<br />
To Look at the the gateway, execute the following command.<br />
<br />
$ netstat -r<br />
<br />
References: <br />
<br />
http://lartc.org/lartc.html<br />
<br />
<br />
<br />
TIP 141:<br />
<br />
RAM disk -- creating a filesystem in RAM.<br />
<br />
$ mkfs -t ext3 -q /dev/ram1 4096<br />
$ mkdir -p /fsram<br />
$ mount /dev/ram1 /fsram -o defaults,rw<br />
<br />
<br />
<br />
TIP 142:<br />
<br />
Create a Live Linux CDROM using BusyBox and OpenSSH.<br />
<br />
These steps are rather long. A complete tutorial is given at<br />
the following link:<br />
http://prdownloads.sourceforge.net/souptonuts/instructions_boot_system.txt<br />
<br />
<br />
<br />
TIP 143:<br />
<br />
SystemImager (http://www.systemimager.org/) SystemImager is software that automates Linux installs,<br />
software distribution, and production deployment.<br />
<br />
<br />
<br />
<br />
TIP 144:<br />
<br />
Mounted a filesystem in rescue mode, yet, you cannot read and write? Remount.<br />
<br />
$ mount -o remount /<br />
<br />
<br />
<br />
TIP 145:<br />
<br />
Nmap commands to check for Microsoft VPN connection.<br />
<br />
$ nmap -sO -p 47 vpn1.someserver.com<br />
$ nmap -sS -p T:1723 vpn1.someserver.com<br />
<br />
By the way, with nmap you can specify multiple ports. Below<br />
is an example of multiple ports; but, use the commands above<br />
for Microsoft VPN services.<br />
<br />
$ nmap -sS -p T:1723-3000<br />
<br />
<br />
<br />
TIP 146:<br />
<br />
Perl and ssh - monitoring systems. The output from ssh can be parsed. Below is<br />
a simple procedure to just to read the ssh ouput into perl.<br />
<br />
#!/usr/bin/perl<br />
#<br />
$pid = open $readme, "ssh root\@hamlet df -lh|" or die "Could not ssh\n";<br />
while(<$readme>) {<br />
print $_<br />
}<br />
close $readme<br />
<br />
But note, you probably want to do something more complex. Below is a more robust<br />
example that bypassed all the fortune, heading junk that you may encounter when<br />
logging in.<br />
<br />
#!/usr/bin/perl<br />
#<br />
$pid = open $readme, "ssh root\@hamlet df -lh 2>/dev/null|" or die "Could not ssh\n";<br />
while(<$readme>) {<br />
print $_<br />
}<br />
close $readme<br />
<br />
NO! you CANNOT do bidirectional communication with the open statement. Note the "|" before<br />
and after below, which cannot be done.<br />
<br />
# Cannot do this!<br />
$pid = open $readme, "|ssh root\@hamlet df -lh 2>/dev/null|" or die "Could not ssh\n";<br />
<br />
Below is a simple Perl example working with arrays:<br />
<br />
#!/usr/bin/perl<br />
@ArrayOfArray = (<br />
[ "ant", "bee" ],<br />
[ "mouse", "mole", "rat" ],<br />
[ "duck", "goose", "flamingo" ],<br />
[ "rose","carnation","sunflower"],<br />
);<br />
<br />
for $i ( 0 .. $#ArrayOfArray ) {<br />
for $j ( 0 .. $#{$ArrayOfArray[$i]} ) {<br />
print "Element $i $j is $ArrayOfArray[$i][$j]\n";<br />
}<br />
}<br />
<br />
# Or this is another way to list elements<br />
foreach( @ArrayOfArray ) {<br />
foreach $i (0..$#$_) {<br />
print "$_->[$i] "<br />
}<br />
print "\n";<br />
}<br />
<br />
<br />
Below is an example of working with Hash of Arrays:<br />
<br />
#!/usr/bin/perl<br />
# ./program < /etc/passwd<br />
while(<>){<br />
next unless s/^(.*?):\s*//;<br />
$HoA{$1} = [ split(/:/) ];<br />
}<br />
for $i (keys %HoA ) {<br />
print "$i: @{ $HoA{$i} } \n";<br />
}<br />
<br />
Example of regular expression. This is my most used regular expression - I like<br />
this sample. See the "www.unix.org.ua" link at the end of this tip.<br />
<br />
"hot cross buns" =~ /cross/;<br />
print "Matched: <$`> $& <$'>\n"; # Matched: <hot > cross < buns><br />
print "Left: <$`>\n"; # Left: <hot ><br />
print "Match: <$&>\n"; # Match: <cross><br />
print "Right: <$'>\n"; # Right: < buns><br />
<br />
<br />
If you're looking for Perl information, type "man perl", which will show you how<br />
to get even more information. Or better yet, take a look at the following<br />
link:<br />
<br />
http://www.unix.org.ua/orelly/perl/prog3/ch09_01.htm<br />
also<br />
http://www.stonehenge.com/merlyn/UnixReview/<br />
<br />
For a quick example on using Perl with SQLite, see the following links:<br />
<br />
http://prdownloads.sourceforge.net/souptonuts/README_sqlite_tutorial.html?download<br />
or<br />
http://freshmeat.net/articles/view/1428/<br />
or<br />
http://www.perl.com/pub/a/1999/09/refererents.html<br />
<br />
Standard input for files. This example will read from stdin, or open a file if given as<br />
an argument, and convert all "<" to "&lt;" and ">" to "&gt;", which can be handy when<br />
converting text files to html files. Note the "while(<>)" will take multiple file names<br />
on the command line.<br />
<br />
#!/usr/bin/perl<br />
while(<>) {<br />
s/&amp;/&amp;amp;/g;<br />
s/&lt;/&amp;lt;/g;<br />
s/&gt;/&amp;gt;/g;<br />
s/</&lt;/g;<br />
s/>/&gt;/g;<br />
print;<br />
}<br />
<br />
Perl Debugger is very useful for testing commands and works like an interpreter, just<br />
like python. So to get into the Perl Debugger execute the command below, "q" to quit.<br />
<br />
$ perl -de 0<br />
<br />
Reference TIP 170<br />
<br />
<br />
<br />
TIP 147:<br />
<br />
Shutdown<br />
<br />
# shutdown 8:00 -- Shutdown at 8:00<br />
<br />
# shutdown +13 -- Shutdown after 13min<br />
<br />
# shutdown -r now -- Shutdown now and restart<br />
<br />
# shutdown -k +2 -- "The system is going DOWN to maintenance mode in 2 minutes!"<br />
The above is only a warning.<br />
<br />
# shutdown -h now -- Shutdown now and halt<br />
<br />
# shutdown -c -- Cancel shutdown<br />
<br />
<br />
<br />
TIP 148:<br />
<br />
ac - print statistics about users connect time<br />
<br />
$ ac -p -- print hour usage by user (individual)<br />
$ ac -dy -- print daily usage<br />
<br />
Options can also be combined<br />
<br />
$ ac -dyp<br />
<br />
<br />
<br />
TIP 149:<br />
<br />
Smart Monitoring Tools:<br />
Disk failing? Or want to know the temperature of your hard-drive?<br />
<br />
http://smartmontools.sourceforge.net/<br />
<br />
For a good, quick tutorial, see the Linux Journal article<br />
http://www.linuxjournal.com/article/6983<br />
<br />
Below are some common commands:<br />
<br />
$ smartctl -i /dev/hda<br />
<br />
$ smartctl -Hc /dev/hda<br />
<br />
$ smartctl -A /dev/hda<br />
<br />
<br />
<br />
TIP 150:<br />
<br />
Monitor dhcp trafic - dhcpdump and tcpdump.<br />
<br />
Download dhcpdump<br />
<br />
$ wget http://voxel.dl.sourceforge.net/sourceforge/mavetju/dhcpdump-1.5.tar.gz<br />
$ ./configure<br />
$ make && make install<br />
<br />
Once it's installed, you can monitor all dhcp traffic as follows, if done with root.<br />
<br />
$ tcpdump -lenx -i eth0 -s 1500 port bootps or port bootpc| dhcpdump<br />
<br />
The above assumes you are using eth0 (ethernet port 0).<br />
<br />
<br />
<br />
TIP 151:<br />
<br />
Breaking Firewalls with ssh<br />
<br />
<br />
A sample .ssh/config file (note this must have chmod 600 rights)<br />
<br />
## Server1 ##<br />
Host 130.21.19.227<br />
LocalForward 20000 192.168.0.66:80<br />
LocalForward 22000 192.168.0.66:22<br />
<br />
With the above "~/.ssh/config" file, after sshing into 130.21.19.227 it<br />
is then possible to ssh into nearby computers directly.<br />
<br />
$ ssh -l mchirico 130.21.19.227<br />
$ scp -P 22000 authorized_keys* mchirico@localhost:.<br />
$ ssh -l mchirico localhost -p 22000<br />
<br />
For the complete article reference the following link:<br />
http://souptonuts.sourceforge.net/sshtips.htm<br />
<br />
<br />
<br />
TIP 152:<br />
<br />
Renaming files - suppose you want to rename all the ".htm" files to ".html"<br />
<br />
$ rename .htm .html *.htm<br />
<br />
Or, suppose you files file1, file2, file3 ...<br />
<br />
$ touch file1 file2 file3 file4 file5 file6<br />
$ rename file file. file*<br />
<br />
The above command will give you "file.1", "file.2" ... "file.6"<br />
<br />
<br />
<br />
TIP 153:<br />
<br />
Renaming files with Perl - this is taken from "Programming Perl 3rd Edition"<br />
<br />
#!/usr/bin/perl<br />
# rename - change filenames<br />
$op = shift;<br />
for (@ARGV) {<br />
$was = $_;<br />
eval $op;<br />
die if $@;<br />
# next line calls built-in function, not the script<br />
rename($was,$_) unless $was eq $_;<br />
}<br />
<br />
The above Perl program can be used as follows:<br />
<br />
$ rename 's/\.orig$//' *.orig<br />
$ rename 'y/A-Z/a-z/ unless /^Make/' *<br />
<br />
Also reference:<br />
http://www.unix.org.ua/orelly/perl/prog3/<br />
<br />
<br />
<br />
TIP 154:<br />
<br />
R project (http://www.r-project.org)<br />
<br />
To start R, just type "R" at the command prompt and "q()" to quit. Below<br />
2 is raised to powers 0 through 6 and thrown into an array.<br />
<br />
$ R<br />
> N <- 2^(0:6)<br />
> N<br />
[1] 1 2 4 8 16 32 64<br />
><br />
<br />
There is a summary summary() command.<br />
<br />
> summary(N)<br />
Min. 1st Qu. Median Mean 3rd Qu. Max.<br />
1.00 3.00 8.00 18.14 24.00 64.00<br />
<br />
Note that the array begins as 1 and not 0<br />
<br />
> N[1:3]<br />
[1] 1 2 4<br />
<br />
<br />
<br />
TIP 155:<br />
<br />
ls - listing files by size, with the biggest file listed last<br />
<br />
<br />
$ ls --sort=size -lhr<br />
<br />
The above command sorts files by size, listing the contents in<br />
"h" human readable format in reverse order.<br />
<br />
Note the options: --sort={none,time,size,extension}<br />
<br />
<br />
<br />
TIP 156:<br />
<br />
Perl - program to clean up old versions of files<br />
<br />
#!/usr/bin/perl<br />
# Copyright (c) GPL 2005 Mike Chirico<br />
# This program deletes old files from several directories<br />
# and within each directory there must be x number of copies<br />
# each y number of bytes<br />
#<br />
<br />
sub delete_old_ones {<br />
$directory_and_file=$_[0];<br />
$save_count=$_[1];<br />
$bytes_in_file=$_[2];<br />
# Don't change setting here of '-lt'<br />
$pid = open $readme, "ls -lt $directory_and_file|" or die "Could not execute\n";<br />
while(<$readme>) {<br />
my @fields = split;<br />
# Make sure we have $save_count good ones with data<br />
if ($fields[4] > $bytes_in_file && $save_count > 0) {<br />
$save_count--;<br />
print "Kept files: $fields[4] $fields[8]\n";<br />
}<br />
# delete the old ones<br />
if ($save_count <= 0 )<br />
{<br />
print "Deleted files: $fields[4] $fields[8]\n";<br />
unlink $fields[8];<br />
}<br />
}<br />
close $readme;<br />
}<br />
<br />
<br />
@AofA = (<br />
[ "/home/cvs/backups/*.gz", "6",196621 ],<br />
[ "/home/mail/backups/*.gz","5",34 ],<br />
[ "/home/snort/backups/*.gz","2",34 ],<br />
[ "/home/server1/backups/*.gz","2",34 ],<br />
[ "/home/actserver/backups/*.gz","2",34 ],<br />
[ "/home/server2/backups/*.gz","2",34 ],<br />
);<br />
<br />
<br />
foreach( @AofA ) {<br />
&delete_old_ones($_->[0],$_->[1],$_->[2]);<br />
}<br />
<br />
Reference TIP 170 and the following link:<br />
http://www.unix.org.ua/orelly/perl/prog3/<br />
<br />
<br />
<br />
TIP 157:<br />
<br />
Graphics and Visualization Software that runs on Linux<br />
http://www.tldp.org/HOWTO/Scientific-Computing-with-GNU-Linux/graphvis.html<br />
<br />
<br />
<br />
TIP 158:<br />
<br />
Keeping files in sync going both ways. Unlike rsync, this is not a one way mirror<br />
option.<br />
<br />
You will need ocaml installed first.<br />
<br />
$ wget http://caml.inria.fr/pub/distrib/ocaml-3.08/ocaml-3.08.3.tar.gz<br />
$ tar -xzf ocaml-3.08.3.tar.gz<br />
$ cd ocaml-3.08.3<br />
<br />
$ ./configure<br />
$ make world<br />
$ make opt<br />
$ make install<br />
<br />
Next, get unison and put it in a different directory.<br />
[http://www.cis.upenn.edu/~bcpierce/unison/]<br />
<br />
$ wget http://www.cis.upenn.edu/~bcpierce/unison/download/stable/latest/unison-2.10.2.tar.gz<br />
$ tar -xzf unison-2.10.2.tar.gz<br />
$ cd unison-2.10.2<br />
$ make UISTYLE=text<br />
$ su<br />
# cp unison /usr/local/bin/.<br />
<br />
Note, you have to copy the file manually.<br />
<br />
See the following article [http://www.linuxjournal.com/article/7712]<br />
<br />
<br />
<br />
TIP 159:<br />
<br />
Dump ext2/ext3 filesystem information with "dumpe2fs". Perform the mount command<br />
and query away.<br />
<br />
$ dumpe2fs /dev/sda1<br />
<br />
<br />
<br />
TIP 160:<br />
<br />
sysreport - a script that generates an HTML report on the system configuration. It<br />
gathers information about the hardware and is somewhat redhat specific. The utility<br />
should be run as root.<br />
<br />
$ /usr/sbin/sysreport<br />
<br />
<br />
<br />
TIP 161:<br />
<br />
Key Bindings Using bind. You can bind, say, ctl-t to a command.<br />
<br />
Add the following to you "~/.inputrc" file, just as it is typed below with quotes.<br />
<br />
"\C-t": ls -l<br />
<br />
Next, run the command<br />
<br />
$ bind -f .inputrc<br />
<br />
Or, you can do everything on the command line; however, it won't be there the next time<br />
you log in. Below is the way to do everything on the command line.<br />
<br />
$ bind -x '"\C-t":ls -l'<br />
<br />
To unbind use the "-r" option. Single quotes are not needed.<br />
<br />
$ bind -r "\C-t"<br />
<br />
Getting a list of all bindings can be done as follows, and not this can be redirected<br />
to the ".inputrc" file for further editing.<br />
<br />
$ bind -p > .inputrc<br />
<br />
<br />
<br />
TIP 162:<br />
<br />
awk - common awk commands.<br />
<br />
Find device names "sd" or with major number 4 and device name "tty". Print the<br />
record number NR, plus the major number and minor number.<br />
<br />
$ awk '$2 == "sd"||$1 == 4 && $2 == "tty" { print NR,$1,$2}' /proc/devices<br />
<br />
Find device name equal to "sound".<br />
<br />
$ awk '/sound/{print NR,$1,$2}' /proc/devices<br />
<br />
Print the 5th record, first field, in file test<br />
<br />
$ awk 'NR==5{print $1}' test<br />
<br />
Print a record, skip 4 records, print a record etc from file1<br />
<br />
$ awk '(NR-1) % 4 == 0 {print $1}' file1<br />
<br />
Print all records except the last one from file1<br />
<br />
$ tac file1|awk 'NR > 1 {print $0}'|tac<br />
<br />
Print A,B,C ..Z on each line, cycling back to A if greater than 26 lines<br />
<br />
$ awk '{ print substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",(NR-1)%26+1,1),$0}' file1<br />
<br />
Number of bytes in a directory.<br />
<br />
$ ls -l|awk 'BEGIN{ c=0}{ c+=$5} END{ print c}'<br />
<br />
<br />
<br />
TIP 163:<br />
<br />
Configuring Remote Logging. If you have several servers on 192.168.1.0, you can setup remote logging<br />
as follows.<br />
<br />
MAIN LOG SERVER (192.168.1.81):<br />
<br />
Firewall - allow UDP port 514 on the main server that will receive the logs.<br />
<br />
$ iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 514 -j ACCEPT<br />
<br />
Edit "/etc/sysconfig/syslog" and add the "-r" option to SYSLOGD_OPTIONS as shown below.<br />
<br />
SYSLOGD_OPTIONS="-r -m -0"<br />
<br />
Note, the "-r" is to allow remote logging and "-m 0" specifies that that the syslog process should<br />
not write regular timestamps. I prefer to only write timestamps for the clients.<br />
<br />
Next, restart the logging process<br />
<br />
$ service syslog restart<br />
<br />
CLIENT LOG SERVER:<br />
<br />
Edit "/etc/syslog.conf" and add the ip address of the log server, or put in the hostname.<br />
<br />
*.* @192.168.1.81<br />
<br />
Next, restart the logging process<br />
<br />
$ service syslog restart<br />
<br />
<br />
<br />
TIP 164:<br />
<br />
kudzu - hardware on your system. To probe the hardware on your system without doing<br />
anything, issue the following command.<br />
<br />
$ kudzu -p<br />
<br />
But wait, a lot of this information is already recorded in the following file<br />
<br />
/etc/sysconfig/hwconf<br />
<br />
You can also use lspci to list all PCI devices.<br />
<br />
$ lspci<br />
<br />
Also, take a look at the script /etc/sbin/sysreport, since this script has a lot of<br />
info gathering commands. You can pick and choose what you want, or run the complete<br />
report.<br />
<br />
If you just want information on the NIC<br />
<br />
$ ip link show eth0<br />
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000<br />
link/ether 00:11:11:8a:be:3f brd ff:ff:ff:ff:ff:ff<br />
<br />
<br />
<br />
<br />
<br />
TIP 165:<br />
<br />
cfengine - a very power agent for monitoring and administrating both a single computer<br />
and or multiple computers. [ http://www.cfengine.org/ ]<br />
<br />
The following is a quick example on downloading and installing cfengine.<br />
<br />
$ ncftpget ftp://ftp.iu.hio.no/pub/cfengine/cfengine-2.1.15.tar.gz<br />
$ md5sum cfengine-2.1.15.tar.gz<br />
f03de82709f84c3d6d916b6e557321f9 cfengine-2.1.15.tar.gz<br />
<br />
$ tar -xzf cfengine-2.1.15.tar.gz<br />
<br />
<br />
You need to have a current version of BerkeleyDB (http://downloads.sleepycat.com/db-4.3.28.tar.gz).<br />
Note that BerkeleyDB has a funny install. You cd to the "build_unix" directory, then,<br />
<br />
Installing BerkeleyDB if needed:<br />
$ wget http://downloads.sleepycat.com/db-4.3.28.tar.gz<br />
$ tar -xzf db-4.3.28.tar.gz<br />
$ cd db-4.3.28/build_unix/<br />
$ ../dist/configure<br />
make<br />
make install<br />
<br />
You also need a current version of OpenSSL. For instructions on how to install OpenSSL see<br />
(http://souptonuts.sourceforge.net/postfix_tutorial.html).<br />
<br />
See (TIP 49) on putting "/usr/local/BerkeleyDB.4.3/lib" in the "/etc/ld.so.conf" file. Or<br />
once BerkeleyDB is installed, you can put the location on the command line as follows:<br />
<br />
Configuring cfengine with direct reference to BerkeleyDB.4.3. First cd to the cfengine source.<br />
<br />
$ ./configure --with-berkeleydb=/usr/local/BerkeleyDB.4.3/lib<br />
$ make<br />
$ make install<br />
<br />
Next create the following directories:<br />
<br />
$ mkdir -p /var/cfengine/bin<br />
$ mkdir -p /var/cfengine/inputs<br />
<br />
Copy needed files (cfagent, cfdoc, cfenvd, cfenvgraph, cfexecd, cfkey, cfrun, cfservd, cfshow):<br />
<br />
$ cp /usr/local/sbin/cf* /var/cfengine/bin<br />
<br />
<br />
You'll also need to generate keys. As root, execute the following:<br />
<br />
$ cfkey<br />
<br />
The command above will write the public and private keys in<br />
"/var/cfengine/ppkeys".<br />
<br />
<br />
You probably want (cfexecd, cfservd, and cfenvd) running on all servers. If you<br />
add the following to "/etc/rc.local" these daemons will start on reboot.<br />
<br />
# Lines in /etc/rc.local<br />
/usr/local/sbin/cfexecd<br />
/usr/local/sbin/cfservd<br />
/usr/local/sbin/cfenvd<br />
<br />
Also, make sure you run each command now as follows:<br />
<br />
$ /usr/local/sbin/cfexecd<br />
$ /usr/local/sbin/cfservd<br />
$ /usr/local/sbin/cfenvd<br />
<br />
Firewall settings must be adjusted to allows 5308 for tcp/udp. My local network<br />
is 192.168.1.0, so I'm opening it up for all my computers.<br />
<br />
$ iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 5308 -j ACCEPT<br />
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5308 -j ACCEPT<br />
<br />
A set of keys needs to be on the server and hosts. For example, my key on "tape.squeezel.com"<br />
should be copied over to the server "squeezel.squeezel.com" as follows:<br />
<br />
This is done from tape.squeezel.com<br />
<br />
$ scp /var/cfengine/ppkeys/localhost.pub root@squeezel.squeezel.com:/var/cfengine/ppkeys/root-tape.squeezel.com.pub<br />
$ scp root@squeezel.squeezel.com:/var/cfengine/ppkeys/localhost.pub /var/cfengine/ppkeys/root-squeezel.squeezel.com.pub<br />
<br />
Also, "/var/cfengine/inputs/cfrun.hosts" on the server "squeezel.squeezel.com" must contain<br />
all the computers that will get updated. This is "cfrun.hosts" on "squeezel.squeezel.com"<br />
<br />
closet.squeezel.com<br />
tape.squeezel.com<br />
<br />
Once I'm done, from "tape.squeezel.com" I can run the following test:<br />
<br />
$ cfrun squeezel.squeezel.com -v<br />
<br />
<br />
<br />
<br />
TIP 166:<br />
<br />
cfengine - a quick example. This example will be run as root. You create the file "cfagent.conf" in<br />
"/var/cfengine/inputs/". The example below will checksum all the files in /home/chirico/deleteme/tripwire,<br />
it will also comment out the line "finger" in any file located in /tmp/testdir/stuff, also appending<br />
the command in this file " Edit change with cfengine".<br />
<br />
# /var/cfengine/inputs/cfagent.conf<br />
#<br />
# You run this with the following:<br />
# cfagent -vK<br />
<br />
control:<br />
actionsequence = ( files tidy editfiles )<br />
ChecksumDatabase = ( /var/cfengine/cache.db )<br />
# Below, true to update md5<br />
ChecksumUpdates = ( true )<br />
<br />
<br />
files:<br />
/home/chirico/deleteme/tripwire checksum=md5 recurse=inf<br />
/home/chirico/deleteme/tripwire/moredata checksum=md5 recurse=inf<br />
#/home/chirico/deleteme/tripwire/compress recurse=inf include=*.txt acti on=compress<br />
# If the database isn't secure, nothing is secure...<br />
/var/cfengine/cache.db mode=600 owner=root action=fixall<br />
<br />
tidy:<br />
/home/chirico/deleteme/tripwire pattern=*~ recurse=inf age=0<br />
# You must put an age. 0 runs now.<br />
<br />
<br />
editfiles:<br />
<br />
{ /tmp/testdir/stuff<br />
<br />
HashCommentLinesContaining "finger"<br />
AppendIfNoSuchLine "# Edit Change with cfengine "<br />
}<br />
<br />
<br />
A few further notes on the above. The command "actionsequence = ( files tidy editfiles) tells the order<br />
of what to execute. The heading "tidy:" deletes files, and of course, "editfiles" does the editing of files.<br />
<br />
To run the example, execute the following command. The "-K" causes the lock file to be ignored.<br />
<br />
$ cfagent -vK<br />
<br />
<br />
<br />
<br />
TIP 167:<br />
<br />
Implementing Disk Quotas - a quick example that can easily be done on a live system for testing. There<br />
is no need to reboot, since you'll be creating a virtual filesystem.<br />
<br />
Do the following as root. First create a mount point.<br />
<br />
# mkdir -p /quota<br />
<br />
Next, create 20M file. Since I have many of these files, I created a special directory "/usr/disk-img"<br />
<br />
# mkdir -p /usr/disk-img<br />
# dd if=/dev/zero of=/usr/disk-img/disk-quota.ext3 count=40960<br />
<br />
The dd command above create a 20 MB file because, by default, dd uses a block size of 512 bytes. That makes<br />
the size: 40960*512=20971520.<br />
<br />
Next, format this as an ext3 filesystem<br />
<br />
# /sbin/mkfs -t ext3 -q /usr/disk-img/disk-quota.ext3 -F<br />
<br />
Add the following line to "/etc/fstab"<br />
<br />
/usr/disk-img/disk-quota.ext3 /quota ext3 rw,loop,usrquota,grpquota 0 0<br />
<br />
Now, mount this filesystem<br />
<br />
# mount /quota<br />
<br />
Take a look at it:<br />
<br />
# ls -l /quota<br />
lost+found<br />
<br />
Now, run "quotacheck"<br />
<br />
# quotacheck -vug /quota<br />
<br />
You'll get errors the first time this is run, because you have no quota files.<br />
But, run it a second time and you'll see something similiar to the following:<br />
<br />
# quotacheck -vug /quota<br />
quotacheck: Scanning /dev/loop2 [/quota] done<br />
quotacheck: Checked 3 directories and 4 files<br />
<br />
Now take a look at the files:<br />
<br />
# ls -l /quota<br />
total 26<br />
-rw------- 1 root root 6144 Jun 14 12:23 aquota.group<br />
-rw------- 1 root root 6144 Jun 14 12:23 aquota.user<br />
drwx------ 2 root root 12288 Jun 14 12:18 lost+found<br />
<br />
Next use "edquota" to grant the user "chirico" a certain quota<br />
<br />
# edquota -f /quota chirico<br />
<br />
This will bring up a menu, and here I have edited so that user "chirico"<br />
has a soft limit of 120*512=61K, and a soft limit of 2 inodes and a hard limit of 5.<br />
<br />
Disk quotas for user chirico (uid 500):<br />
Filesystem blocks soft hard inodes soft hard<br />
/dev/loop2 2 120 150 1 2 3<br />
<br />
Next, turn quotas on with the following command:<br />
<br />
$ quotaon /quota<br />
<br />
If you need to turn off quotas, the command is "quotaoff -a" for all filesystems. You'll run into<br />
errors if you try to run quotacheck, say "quotacheck -avug" because this tries to unmount and mount<br />
the filesystem. You need to turn off quotas first "quotaoff /quota". Note you only need to run<br />
quotacheck once, or when doing maintenance after a system crash.<br />
<br />
<br />
To get a report on the quote, runn "repquota" as follows:<br />
<br />
$ repquota /quota<br />
*** Report for user quotas on device /dev/loop0<br />
Block grace time: 7days; Inode grace time: 7days<br />
Block limits File limits<br />
User used soft hard grace used soft hard grace<br />
----------------------------------------------------------------------<br />
root -- 1189 0 0 2 0 0<br />
chirico -+ 93 0 0 4 2 5 6days<br />
<br />
<br />
Note above that user "chirico" has used 4 on the file limits. This user has a hard<br />
limit of 5. So when this user tries to create 2 more files (bring this over the limit of 5)<br />
then he will get the following error as demonstrated below.<br />
<br />
<br />
[chirico@squeezel chirico]$ touch one<br />
[chirico@squeezel chirico]$ touch two<br />
loop0: write failed, user file limit reached.<br />
touch: cannot touch `two': Disk quota exceeded<br />
<br />
<br />
Now, if repquota (run by root) is executed it shows the following:<br />
<br />
$ repquota /quota<br />
*** Report for user quotas on device /dev/loop0<br />
Block grace time: 7days; Inode grace time: 7days<br />
Block limits File limits<br />
User used soft hard grace used soft hard grace<br />
----------------------------------------------------------------------<br />
root -- 1189 0 0 2 0 0<br />
chirico -+ 94 0 0 5 2 5 6days<br />
<br />
<br />
Note the "+" sign above. User "chirico" is above the File soft limits, and in this case<br />
above the hard limits.<br />
<br />
To warn user by sending email to them, run "warnquota", but you need check that<br />
"/etc/warnquota.conf" is setup correctly. For the example above, this file should<br />
look as follows:<br />
<br />
$ cat /etc/quotatab<br />
#<br />
# This is sample quotatab (/etc/quotatab)<br />
# Here you can specify description of each device for user<br />
#<br />
# Comments begin with hash in the beginning of the line<br />
<br />
# Example of description<br />
/dev/loop0: This is loopback device<br />
<br />
Just run the following as root:<br />
<br />
$ warnquota<br />
<br />
By the way, if you want to change the grace period, it can only be done on a filesystem<br />
basis. Not per user.<br />
<br />
$ edquota -t<br />
<br />
Users can run "quota" to see their usage as follows:<br />
<br />
[chirico@squeezel ~]$ quota<br />
Disk quotas for user chirico (uid 500):<br />
Filesystem blocks quota limit grace files quota limit grace<br />
/dev/loop0 94 0 0 5 10 50<br />
<br />
As you can see from above, I changed my inode limit to 50.<br />
<br />
What about running this on the whole filesystem? Yes, below is an example where I'm running<br />
this on FC3, on the root of the filesystem "/". This assumes that you have installed the<br />
quota package. Try doing "rpm -q quota" to see if this package is installed.<br />
<br />
Step 1:<br />
<br />
Check to make sure the quota software is installed. You can either do a "whereis quota",<br />
or check for the rpm package.<br />
<br />
$ whereis quota<br />
whereis quota<br />
quota: /usr/bin/quota /usr/share/man/man1/quota.1.gz<br />
<br />
Checking for the rpm package.<br />
<br />
$ rpm -q quota<br />
quota-3.12-5<br />
<br />
Step 2:<br />
<br />
Edit /etc/fstab and add usrquota and grpquota options for "/dev/VolGroup00/LogVol00",<br />
which is shown on the first line below:<br />
<br />
/dev/VolGroup00/LogVol00 / ext3 defaults,usrquota,grpquota 1 1<br />
LABEL=/boot /boot ext3 defaults 1 2<br />
none /dev/pts devpts gid=5,mode=620 0 0<br />
none /dev/shm tmpfs defaults 0 0<br />
none /proc proc defaults 0 0<br />
none /sys sysfs defaults 0 0<br />
/dev/VolGroup00/LogVol01 swap swap defaults 0 0<br />
<br />
Step 3:<br />
<br />
Remount the filesystem as follows:<br />
<br />
$ mount -o remount /<br />
<br />
Step 4:<br />
<br />
Run quotacheck with the "-m" option. Like the above statement, this will have to be run with<br />
root priviliges. This creates the quota database files, and it can take a long time if it is<br />
a large full filesystem.<br />
<br />
<br />
$ quotacheck -cugm /<br />
<br />
Step 5:<br />
<br />
This step is optional, but it's good to know if you need to recalculate quotas because of a<br />
system crash. It's demonstrated here, because at this point quota's have not been turned on.<br />
Again, note the "m" option below.<br />
<br />
$ quotacheck -avumg<br />
<br />
Step 6:<br />
<br />
Set limits for specific users or groups using the "edquota" command. Shown below is the command<br />
to setup quotas for user "chirico". Shown below this user has used 161560 blocks, he has a soft<br />
limit of 1161560 and a hard limit of 900000. He has used 3085 inodes and has a soft limit of 10000<br />
and a hard limit of 12000.<br />
<br />
$ edquota -f / chirico<br />
<br />
Disk quotas for user chirico (uid 500):<br />
Filesystem blocks soft hard inodes soft hard<br />
/dev/mapper/VolGroup00-LogVol00 161560 1161560 900000 3085 10000 12000<br />
<br />
You can put quotas on groups as well. The following is done as root. See (TIP 186 and TIP 6) for creating<br />
groups and adding users to groups.<br />
<br />
$ edquota -g share<br />
<br />
If you create a sharable directory for anyone in the group "share" (TIP 6), quota restrictions against<br />
group "share" will only apply to files added in the "/home/share" directory. When user "chirico" creates<br />
files in "/home/share" they also go against this user quota as well. However, when files are created in<br />
his home directory they do not go against the "share" group.<br />
<br />
Note - if you get errors when trying to run "edquota -g share", turn quotas off "quotaoff /" and<br />
run "quotacheck -avugm". Then, turn the quotas back on "quotaon /".<br />
<br />
You can see the status of the group quota with the following command:<br />
<br />
$ quota -g share<br />
<br />
Step 7:<br />
<br />
Turn on quotas with the "qutoaon" command. This command needs to be done with root privileges.<br />
<br />
$ quotaon /<br />
<br />
Step 8:<br />
<br />
Check "/etc/quotatab" file for the correct entries. Note that when you do the "mount" command<br />
the filesystem returned needs to match what is in the "quotatab" file. I have noticed that this<br />
is not the case by default.<br />
<br />
$ mount<br />
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,usrquota,grpquota)<br />
<br />
So the "/etc/quotatab" must contain the following line.<br />
<br />
/dev/mapper/VolGroup00-LogVol00: This is the Volume group<br />
<br />
Step 9:<br />
<br />
Run "warnquota" as a check that the "/etc/quotatab" files is setup correctly.<br />
<br />
$ warnquota<br />
<br />
Step 10:<br />
<br />
Setup a daily cron job for running "warnquota". The following should be placed<br />
in "/etc/cron.daily"<br />
<br />
#!/bin/sh<br />
# Place this file in /etc/cron.daily<br />
# with rights 0755<br />
/usr/sbin/warnquota<br />
EXITVALUE=$?<br />
if [ $EXITVALUE != 0 ]; then<br />
/usr/bin/logger -t warnquota "ALERT exited abnormally with [$EXITVALUE]"<br />
fi<br />
exit 0<br />
<br />
References:<br />
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/sysadmin-guide/ch-disk-quotas.html<br />
(TIP 6, TIP 186, and TIP 205)<br />
<br />
<br />
<br />
TIP 168:<br />
<br />
rdist - remote file distribution client program. You can use this program in combination with<br />
ssh. This program does more than just copy files. Once a file has been copied, you can dictate<br />
other actions to be performed. Or you can hold off copying all together if the destination is<br />
running low on inodes, or disk space.<br />
<br />
For the purpose of this example, all commands will been run on "squeezel.squeezel.com", and the<br />
computers that will be updated are "tape.squeezel.com" and "closet.squeezel.com". Obviously, you<br />
would substitute your computer names.<br />
<br />
It helps to setup ssh keys on each computer first. Reference [http://souptonuts.sourceforge.net/sshtips.htm]<br />
and (TIP 12).<br />
<br />
Step 1: Create the Configuration file myDistfile<br />
<br />
Below is my sample "myDistfile". This file will access hosts "tape.squeezel.com" using username chirico<br />
and "closet.squeezel.com" with the username running this command, and copy the<br />
files "/home/chirico/file1" and "/home/chirico/file2" to the these two servers creating the<br />
directory ~/tmpdir if it doesn't exist. Once these files are updated, a mail check ("sendmail -bv")<br />
will be performed, and mail will be sent to "chirico@squeezel". This happens twice, once for each file.<br />
<br />
Note, the line "/home/chirico/file2 -> tape.squeezel.com" which moves the file "file2" to<br />
tape.squeezel.com renaming the file to "tapedest" in the directory "/home/chirico". Once this file<br />
is copied, the rights are modified to "chmod +r". Likewise, "/home/chirico/file2 -> closet.squeezel.com"<br />
copies the file file2, which is renamed as closetdest.<br />
<br />
# Contents of myDistfile<br />
HOSTS = ( chirico@tape.squeezel.com closet.squeezel.com )<br />
<br />
FILES = ( /home/chirico/file1 /home/chirico/file2 )<br />
<br />
${FILES} -> ${HOSTS}<br />
# Directory tmpdir will be created if it doesn't exist<br />
install tmpdir ;<br />
special /home/chirico/file1 "/usr/sbin/sendmail -bv mchirico@gmail.com";<br />
notify chirico@squeezel;<br />
<br />
/home/chirico/file2 -> tape.squeezel.com<br />
install /home/chirico/tapedest;<br />
special /home/chirico/tapedest "chmod +r /home/chirico/tapedest";<br />
<br />
/home/chirico/file2 -> closet.squeezel.com<br />
install /home/chirico/closetdest;<br />
<br />
<br />
Step 2: Command from squeezel.squeezel.com to run myDistfile above<br />
<br />
Below is the command that will execute the contents in "myDistfile". This command is run from the<br />
computer "squeezel.squeezel.com". All output will go in the file "cmd1rdist.log".<br />
<br />
$ rdist -P /usr/local/bin/ssh -f ./myDistfile -l file=./cmd1rdist.log=all<br />
<br />
Obviously you want a secure copy (using scp), so the -P option uses ssh as your secure<br />
transport mechanism.<br />
<br />
<br />
<br />
TIP 169:<br />
<br />
Restricting root logins (/etc/securetty). ctl-alt-F4 will give you a prompt for tty3. Note<br />
that it is one number less. Take a look at the contents of "/etc/securetty". To prevent<br />
root from logging in on this device, take out tty3 from this listing. Note, you can always<br />
login as another user, then, su to root. Below is an example of the default<br />
"/etc/securetty" that allows root to login to everything.<br />
<br />
[root@squeezel ~]# cat /etc/securetty<br />
console<br />
vc/1<br />
vc/2<br />
vc/3<br />
vc/4<br />
vc/5<br />
vc/6<br />
vc/7<br />
vc/8<br />
vc/9<br />
vc/10<br />
vc/11<br />
tty1<br />
tty2<br />
tty3<br />
tty4<br />
tty5<br />
tty6<br />
tty7<br />
tty8<br />
tty9<br />
tty10<br />
tty11<br />
<br />
<br />
<br />
TIP 170:<br />
<br />
Perl map function. Try the following to get a quick take on this function,<br />
which increments each value in the array a;<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map {$_++} @a;<br />
map { print "$_\n" } @a;<br />
<br />
or<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map { print "$_\n"} map {++$_} @a;<br />
<br />
And you can easily make modifications, like reversing the order<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map { print "$_\n"} reverse map {++$_} @a;<br />
<br />
Plus there is a grep() function that works on each element as well<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map { print "$_\n"} reverse grep{ $_ > 3} map {++$_} @a;<br />
<br />
To get only odd numbers in reverse order:<br />
<br />
#!/usr/bin/perl<br />
@a = (1,2,3);<br />
map { print "$_\n"} reverse grep{ !($_ % 2)} map {++$_} @a;<br />
<br />
<br />
Reference: http://www-128.ibm.com/developerworks/linux/library/l-road4.html<br />
<br />
<br />
<br />
TIP 171:<br />
<br />
Perl - subroutine call and shifting through variables. A simple and useful<br />
technique.<br />
<br />
#!/usr/bin/perl<br />
sub test {<br />
local $mval;<br />
while( $mval = shift ) {<br />
print " $mval\n";<br />
}<br />
}<br />
<br />
test("one","two","three");<br />
<br />
<br />
<br />
TIP 172:<br />
<br />
Tcp wrappers - First "/etc/hosts.allow" is check, and if there is an entry in this file, no more<br />
checking it done. If are no matches in "/etc/hosts.allow", the "/etc/hosts.deny" file is checked<br />
and if a match is found, that service is blocked for that host.<br />
<br />
Example "/etc/hosts.deny" file:<br />
<br />
sshd: 192.168.1.171<br />
<br />
The above file blocks access to computer 192.168.1.171. It's also possible to run commands when<br />
someone from this computer tries to ssh in. This example sends mail.<br />
<br />
sshd: 192.168.1.171: spawn (echo -e "%d %h %H %u"| /bin/mail -s 'hosts.deny entry' root)<br />
<br />
Of course, you can also run commands in the "/etc/hosts.allow" if you wanted mail sent for a successful<br />
login.<br />
<br />
<br />
<br />
TIP 173:<br />
<br />
pgrep, pkill - look up or signal process based on name and other attributes.<br />
<br />
To quick find all instances of ssh running, for user root, execute the following<br />
command:<br />
<br />
$ pgrep -u root -l ssh<br />
<br />
To kill a process, or send a signal use the "pkill" option. For example, to<br />
make syslog reread its configuration file:<br />
<br />
$ pkill -HUP syslogd<br />
<br />
Another command command is "pidof" that can tell you how many processes are running.<br />
This can be useful for detecting DOS attacks.<br />
<br />
$ pidof sshd<br />
4783 4781 30008 30006 29888 29886 2246<br />
<br />
Above there are 7 sshd's running. Reference "Tcpdump, Raw Socket and Libpap Tutorial"<br />
at [http://souptonuts.sourceforge.net/tcpdump_tutorial.html].<br />
<br />
<br />
<br />
TIP 174:<br />
<br />
Password Cracking - tools to check your users passwords:<br />
<br />
John The Ripper<br />
http://www.openwall.com/john/<br />
<br />
Crack<br />
http://www.crypticide.com/users/alecm/<br />
<br />
Slurpie<br />
http://www.ussrback.com/distributed.htm<br />
<br />
<br />
<br />
TIP 175:<br />
<br />
Password Aging - setting the number of days a password is valid.<br />
<br />
$ chage -M 90 <username><br />
<br />
<br />
<br />
TIP 176:<br />
<br />
Kernel Performance Tuning - /Documentation/sysctl/vm.txt documents kernel settings to<br />
improve performance. Below are some examples.<br />
<br />
overcommit_memory: 0 -- default estimates the amount of memory for malloc<br />
1 -- kernel pretends there is always enough memory until it runs out<br />
3 -- never overcommit<br />
<br />
$ cat /proc/sys/vm/overcommit_memory<br />
0<br />
<br />
page-cluster:<br />
The Linux VM subsystem avoids excessive disk seeks by reading<br />
multiple pages on a page fault. The number of pages it reads<br />
is dependent on the amount of memory in your machine.<br />
<br />
The number of pages the kernel reads in at once is equal to<br />
2 ^ page-cluster. Values above 2 ^ 5 don't make much sense<br />
for swap because we only cluster swap data in 32-page groups.<br />
<br />
$ cat /proc/sys/vm/page-cluster<br />
3<br />
<br />
min_free_kbytes:<br />
This is used to force the Linux VM to keep a minimum number<br />
of kilobytes free. The VM uses this number to compute a pages_min<br />
value for each lowmem zone in the system. Each lowmem zone gets<br />
a number of reserved free pages based proportionally on its size.<br />
<br />
$ cat /proc/sys/vm/min_free_kbytes<br />
3831<br />
<br />
max_map_count:<br />
This file contains the maximum number of memory map areas a process<br />
may have. Memory map areas are used as a side-effect of calling<br />
malloc, directly by mmap and mprotect, and also when loading shared<br />
libraries.<br />
<br />
While most applications need less than a thousand maps, certain<br />
programs, particularly malloc debuggers, may consume lots of them,<br />
e.g., up to one or two maps per allocation.<br />
<br />
The default value is 65536.<br />
<br />
$ cat /proc/sys/vm/max_map_count<br />
65536<br />
<br />
Also see http://people.redhat.com/alikins/system_tuning.html<br />
<br />
<br />
<br />
TIP 177:<br />
<br />
IO Scheduler - /Documentation/block/as-iosched.txt documents kernel settings for disk<br />
performance.<br />
<br />
If you're not sure what partitions you have "$ cat /proc/partitions". This example<br />
assumes hda, and you can see some of the kernel settings:<br />
<br />
$ ls /sys/block/hda/queue/iosched<br />
back_seek_max back_seek_penalty clear_elapsed fifo_batch_expire fifo_expire_async<br />
fifo_expire_sync find_best_crq key_type quantum queued<br />
<br />
References: http://lwn.net/Articles/102505/<br />
http://bhhdoa.org.au/pipermail/ck/2004-September/000961.html<br />
<br />
<br />
<br />
TIP 178:<br />
<br />
iozone -- getting data on disk performance (http://www.iozone.org/). This is a very<br />
comprehensive package.<br />
<br />
$ wget http://www.iozone.org/src/current/iozone3_242.tar<br />
$ tar -xf iozone3_242.tar<br />
$ cd iozone3_242/src/current<br />
$ make linux<br />
<br />
At this point you should read the documentation. There is no "make install". You<br />
copy it to each filesystem you want to run this program on. Below are some quick<br />
start commands.<br />
<br />
Good comprehensive test.<br />
<br />
$ iozone -a<br />
<br />
I prefer this for small filesystems. It limits the record size to 10000 and does<br />
the output in operations per second (higher numbers mean faster drive).<br />
<br />
$ ./iozone -a -s 10000 -O<br />
<br />
<br />
<br />
TIP 179:<br />
<br />
history - bash command to get a history of all commands typed. But, here is a way<br />
that you can get date and time listed as well.<br />
<br />
$ HISTTIMEFORMAT="%y/%m/%d %T "<br />
<br />
Defining the environment variable above give you the date/time info when you<br />
execute history:<br />
<br />
$ history<br />
...<br />
175 05/06/30 12:51:46 grep '141.162.' mout > mout2<br />
176 05/06/30 12:51:48 e mout2<br />
177 05/06/30 12:56:59 ls<br />
178 05/06/30 12:57:02 ls<br />
179 05/06/30 12:57:39 ls<br />
180 05/06/30 12:57:49 ls -l<br />
181 05/06/30 13:01:10 history<br />
182 05/06/30 13:01:20 HISTTIMEFORMAT="%y/%m/%d %T "<br />
183 05/06/30 13:01:23 history<br />
...<br />
<br />
<br />
<br />
TIP 180:<br />
<br />
.config - Fedora Core getting the .config to rebuild the kernel. You can find<br />
this file, the ".config" file at the following location:<br />
<br />
$ ls "/lib/modules/$(uname -r)/build/.config"<br />
<br />
Or, to see the contents<br />
<br />
$ cat "/lib/modules/$(uname -r)/build/.config"<br />
<br />
This can be important, if you're planning to build your own kernel.<br />
<br />
<br />
<br />
TIP 181:<br />
<br />
Listing control key settings.<br />
<br />
$ stty -a<br />
speed 38400 baud; rows 0; columns 0; line = 0;<br />
intr = ^C; quit = ^\; erase = <undef>; kill = <undef>; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q;<br />
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;<br />
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts<br />
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel<br />
opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0<br />
isig icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke<br />
<br />
<br />
<br />
TIP 182:<br />
<br />
iptables DNAT and SNAT. You have a webserver on 192.168.1.71. When people query this webserver, you want them<br />
to goto 192.168.1.81, with no indication that they are going to another web server. In fact, they always make<br />
their web hits to 192.168.1.71.<br />
<br />
The following is the iptables commands:<br />
<br />
$ echo 1 > /proc/sys/net/ipv4/ip_forward<br />
$ iptables -t nat -A PREROUTING -d 192.168.1.71 -p tcp --dport 80 -j DNAT --to 192.168.1.81<br />
$ iptables -t nat -A POSTROUTING -d 192.168.1.81 -s 192.168.1.0/24 -p tcp --dport 80 -j SNAT --to 192.168.1.71<br />
<br />
Change 192.168.1.0/24 to whatever source you expect the web browser to come in on. Below is the tcpdump showing<br />
all traffic is relayed via 192.168.1.71<br />
<br />
[root@closet iptables]# tcpdump -nN port 80<br />
<br />
17:34:58.790398 IP 192.168.1.102.1158 > 192.168.1.71.80: S 3620106373:3620106373(0) win 16384 <mss 1460,nop,nop,sackOK><br />
17:34:58.790465 IP 192.168.1.71.1158 > 192.168.1.81.80: S 3620106373:3620106373(0) win 16384 <mss 1460,nop,nop,sackOK><br />
17:34:58.790703 IP 192.168.1.81.80 > 192.168.1.71.1158: S 1973665156:1973665156(0) ack 3620106374 win 5840 <mss 1460,nop,nop,sackOK><br />
17:34:58.790720 IP 192.168.1.71.80 > 192.168.1.102.1158: S 1973665156:1973665156(0) ack 3620106374 win 5840 <mss 1460,nop,nop,sackOK><br />
17:34:58.790951 IP 192.168.1.102.1158 > 192.168.1.71.80: . ack 1 win 17520<br />
17:34:58.790965 IP 192.168.1.71.1158 > 192.168.1.81.80: . ack 1 win 17520<br />
17:34:58.791451 IP 192.168.1.102.1158 > 192.168.1.71.80: P 1:327(326) ack 1 win 17520<br />
17:34:58.791472 IP 192.168.1.71.1158 > 192.168.1.81.80: P 1:327(326) ack 1 win 17520<br />
17:34:58.791973 IP 192.168.1.81.80 > 192.168.1.71.1158: . ack 327 win 6432<br />
<br />
Above the web client is on "192.168.1.102". You can see that the 1st server "192.168.1.71" then goes out to<br />
the 2nd server "192.168.1.81" on the second line. The third line shows the 2nd server "192.168.1.81" responding to<br />
the 1st server, and the forth line passes this data back to the web client "192.168.1.102".<br />
<br />
Note: You can save your current iptables setting with the following command:<br />
<br />
$ iptables-save > iptables_store<br />
<br />
The big advantage is that you can store the counters as well.<br />
<br />
$ iptables-save -c > iptables_store_w_cnts<br />
<br />
To restore the file, use the following:<br />
<br />
$ iptables-restore -c < iptables_store_w_cnts<br />
<br />
<br />
<br />
TIP 183:<br />
<br />
mailstats - display mail statistics. This file reads data from "/var/log/mail/statistics"<br />
<br />
[root@closet ~]# mailstats<br />
Statistics from Sat Jun 25 15:59:52 2005<br />
M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis msgsqur Mailer<br />
4 1 2K 0 0K 0 0 0 esmtp<br />
9 0 0K 1 2K 0 0 0 local<br />
=====================================================================<br />
T 1 2K 1 2K 0 0 0<br />
C 1 0 0<br />
<br />
<br />
<br />
TIP 184:<br />
<br />
Profiling C Applications - Assume you have the following program p1.c:<br />
<br />
/* Program p1.c */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
t1(int i)<br />
{<br />
printf("t1:%d\n", i);<br />
}<br />
<br />
t2(int j)<br />
{<br />
printf("t2:%d\n", j);<br />
}<br />
<br />
int main(void)<br />
{<br />
int i, j;<br />
<br />
for (i = 0; i < 5; ++i) {<br />
t1(i);<br />
for (j = 0; j < 2; ++j) {<br />
t2(j);<br />
}<br />
}<br />
}<br />
<br />
Compile the program as follows:<br />
<br />
$ gcc -pg -g -o p1 p1.c<br />
$ ./p1<br />
t1:0<br />
t2:0<br />
t2:1<br />
t1:1<br />
t2:0<br />
t2:1<br />
t1:2<br />
t2:0<br />
t2:1<br />
t1:3<br />
t2:0<br />
t2:1<br />
t1:4<br />
t2:0<br />
t2:1<br />
<br />
Next, to get the profile graph.<br />
<br />
$ gprof -p -b p1<br />
Flat profile:<br />
<br />
Each sample counts as 0.01 seconds.<br />
no time accumulated<br />
<br />
% cumulative self self total<br />
time seconds seconds calls Ts/call Ts/call name<br />
0.00 0.00 0.00 10 0.00 0.00 t2<br />
0.00 0.00 0.00 5 0.00 0.00 t1<br />
<br />
<br />
Above note the 10 calls to t2 and 5 calls to t1.<br />
<br />
<br />
<br />
TIP 185:<br />
<br />
CDPATH - this is a bash variable like PATH that defines a search path<br />
for the cd command.<br />
<br />
Suppose you have the following directory structure:<br />
<br />
/home/chirico/stuff<br />
|-- dirA<br />
`-- dirB<br />
<br />
Assume you define CDPATH as follows:<br />
<br />
CDPATH=/home/chirico/stuff<br />
<br />
Now, no matter what directory you are in if you use the cd command below<br />
you will automatically move to "/home/chirico/stuff/dirA".<br />
<br />
$ cd dirA<br />
<br />
Note you could be in "/etc" and will move directly to "/home/chirico/stuff/dirA".<br />
This command has the same format as PATH - multiple entries are separated by a colon.<br />
If the current directory contain a sub-directory dirA, then, it gets priority.<br />
<br />
The following is part of my .bash_profile<br />
<br />
CDPATH=/work/cpearls/src/posted_on_sf/:/work/souptonuts/documentation/:/home/chirico/deleteme/<br />
export PATH CVS_RSH EDITOR JAVA_HOME CDPATH<br />
<br />
<br />
<br />
TIP 186:<br />
<br />
Groups - add groups and users to groups. The following shows how to create the group "share"<br />
and add the user "chirico" to this group. The following should be done as root, and<br />
assumes the account "chirico" already exits.<br />
<br />
$ groupadd share<br />
$ usermod -G share chirico<br />
<br />
Note the change made to "/etc/group" below:<br />
<br />
$ cat /etc/group|grep 'share'<br />
share:x:616:chirico<br />
<br />
If the user chirico is currently logged in, he should run the following<br />
command to immediately have group "share" rights. Or, the next time he logs<br />
in he will have access to this group.<br />
<br />
$ newgrp share<br />
<br />
Reference the following (TIP 6, TIP 167).<br />
<br />
<br />
<br />
TIP 187:<br />
<br />
oprofile - steps for running oprofile on Fedora.<br />
<br />
Step 1:<br />
<br />
Find out what version of the kernel you are running.<br />
<br />
$ uname -a<br />
Linux closet.squeezel.com 2.6.12-1.1398_FC4 #1 Fri Jul 15 00:52:32 EDT 2005 i686 i686 i386 GNU/Linux<br />
<br />
<br />
Step 2:<br />
<br />
Download the source in a chosen directory. Above, I'm running 2.6.12-1, but I'm going to go for 2.6.12.3, since<br />
it's a little later. You want the signed file as well.<br />
<br />
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.12.3.tar.gz<br />
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.12.3.tar.gz.sign<br />
<br />
Now, check the signature.<br />
<br />
$ gpg --verify linux-2.6.12.3.tar.gz.sign linux-2.6.12.3.tar.gz<br />
<br />
<br />
Step 3:<br />
<br />
Unpack the file.<br />
<br />
$ tar -xzf linux-2.6.12.3.tar.gz<br />
$ cd cd linux-2.6.12.3<br />
<br />
<br />
Step 4:<br />
<br />
Copy the ".config" used to compile your previous kernel. You should find it<br />
in the following direcotry "/lib/modules/$(uname -r)/build/.config".<br />
<br />
Copy it to the linux-2.6.12.3 directory.<br />
<br />
$ cp "/lib/modules/$(uname -r)/build/.config" .<br />
<br />
<br />
Step 5:<br />
<br />
Run make as follows. It will ask for a few questions on "make oldconfig". The<br />
make installs below will have to be done with root privileges.<br />
<br />
$ make oldconfig<br />
$ make bzImage<br />
$ make modules<br />
$ make modules_install<br />
$ make install<br />
<br />
<br />
Step 6:<br />
<br />
Edit the "/boot/grub/grub.conf" and set default = 0 as shown below in this<br />
file.<br />
<br />
default=0<br />
timeout=5<br />
splashimage=(hd0,2)/grub/splash.xpm.gz<br />
hiddenmenu<br />
title Fedora Core (2.6.12.3)<br />
root (hd0,2)<br />
kernel /vmlinuz-2.6.12.3 ro root=/dev/VolGroup00/LogVol00 rhgb quiet<br />
initrd /initrd-2.6.12.3.img<br />
title Fedora Core (2.6.12-1.1398_FC4)<br />
root (hd0,2)<br />
kernel /vmlinuz-2.6.12-1.1398_FC4 ro root=/dev/VolGroup00/LogVol00 rhgb quiet<br />
initrd /initrd-2.6.12-1.1398_FC4.img<br />
title Fedora Core (2.6.11-1.1369_FC4)<br />
root (hd0,2)<br />
kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/VolGroup00/LogVol00 rhgb quiet<br />
initrd /initrd-2.6.11-1.1369_FC4.img<br />
title Other<br />
rootnoverify (hd0,1)<br />
chainloader +1<br />
<br />
<br />
Step 7:<br />
<br />
Shutdown with the restart option.<br />
<br />
$ shutdown -r now<br />
<br />
<br />
Step 8:<br />
<br />
Run opcontrol. The commands below are done as root. My kernel was compiled in the following<br />
directory "/home/kernel/linux-2.6.12.3/", so I'll run opcontrol as follows:<br />
<br />
$ opcontrol --vmlinux=/home/kernel/linux-2.6.12.3/vmlinux<br />
<br />
Now start.<br />
<br />
$ opcontrol --start<br />
Using 2.6+ OProfile kernel interface.<br />
Reading module info.<br />
Using log file /var/lib/oprofile/oprofiled.log<br />
Daemon started.<br />
Profiler running.<br />
<br />
Shutdown opcontrol.<br />
<br />
$ opcontrol --shutdown<br />
<br />
Run report.<br />
<br />
$ opreport<br />
<br />
CPU: CPU with timer interrupt, speed 0 MHz (estimated)<br />
Profiling through timer interrupt<br />
TIMER:0|<br />
samples| %|<br />
------------------<br />
156088 99.8746 vmlinux<br />
60 0.0384 libc-2.3.5.so<br />
30 0.0192 oprofiled<br />
23 0.0147 libcrypto.so.0.9.7f<br />
13 0.0083 bash<br />
12 0.0077 screen<br />
10 0.0064 sshd<br />
9 0.0058 ssh<br />
6 0.0038 ip_tables<br />
6 0.0038 libncurses.so.5.4<br />
5 0.0032 b44<br />
5 0.0032 ext3<br />
5 0.0032 ld-2.3.5.so<br />
4 0.0026 ip_conntrack<br />
4 0.0026 jbd<br />
2 0.0013 grep<br />
1 6.4e-04 libdns.so.20.0.2<br />
1 6.4e-04 libisc.so.9.1.5<br />
<br />
<br />
Reference the following for more documentation:<br />
http://oprofile.sourceforge.net/doc/<br />
<br />
<br />
<br />
<br />
TIP 188:<br />
<br />
cyrus-imapd with Postfix using sasldb for authentication. For this example<br />
the server is tape.squeezel.com and the user is chirico.<br />
<br />
Step 1:<br />
<br />
$ yum install cyrus-imapd<br />
$ yum install cyrus-imapd-utils<br />
<br />
You need "cyrus-imapd-utils" for cyradm.<br />
<br />
<br />
Step 2:<br />
<br />
Edit /etc/imapd.conf<br />
<br />
configdirectory: /var/lib/imap<br />
partition-default: /var/spool/imap<br />
admins: cyrus<br />
sievedir: /var/lib/imap/sieve<br />
sendmail: /usr/sbin/sendmail<br />
hashimapspool: true<br />
# Chirico Commented the below line<br />
# sasl_pwcheck_method: saslauthd<br />
# Because using sasldb<br />
sasl_pwcheck_method: auxprop<br />
sasl_auxprop_plugin: sasldb<br />
# Chirico end change<br />
sasl_mech_list: PLAIN<br />
tls_cert_file: /usr/share/ssl/certs/cyrus-imapd.pem<br />
tls_key_file: /usr/share/ssl/certs/cyrus-imapd.pem<br />
tls_ca_file: /usr/share/ssl/certs/ca-bundle.crt<br />
<br />
<br />
Step 3:<br />
<br />
Create a user and password:<br />
<br />
$ saslpasswd2 -c -u `postconf -h myhostname` cyrus<br />
$ saslpasswd2 -c -u `postconf -h myhostname` chirico<br />
$ saslpasswd2 -c -u `postconf -h myhostname` allmail<br />
<br />
<br />
This will automatically create the file /etc/sasldb2. But look<br />
at the default rights, assuming you ran saslpasswd2 as root:<br />
<br />
$ ls -l /etc/sasldb2<br />
-rw-r----- 1 root root 12288 Jul 31 09:50 /etc/sasldb2<br />
<br />
We need to correct this in step 4.<br />
<br />
<br />
Step 4:<br />
<br />
$ chown root.mail /etc/sasldb2<br />
$ ls -l /etc/sasldb2<br />
-rw-r----- 1 root mail 12288 Jul 31 09:50 /etc/sasldb2<br />
<br />
<br />
Step 5:<br />
<br />
Update "/etc/postfix/main.cf". Note in /etc/imapd.conf the configdirectory<br />
points to /var/lib/imap, and if I look at this directory I see the<br />
socket directory. However, after staring /etc/init.d/cyrus-imapd there<br />
will be a socket file "/var/lib/imap/socket/lmtp". (See step 6).<br />
<br />
mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp<br />
mailbox_transport = cyrus<br />
<br />
Restart postfix.<br />
<br />
/etc/init.d/postfix restart<br />
<br />
<br />
Step 6:<br />
<br />
Start cyrus-imapd and look for the socket file.<br />
<br />
<br />
$ /etc/init.d/cyrus-imapd restart<br />
Shutting down cyrus-imapd: [ OK ]<br />
Starting cyrus-imapd: preparing databases... done. [ OK ]<br />
<br />
Now you should see the lmtp file:<br />
<br />
$ ls -l /var/lib/imap/socket/lmtp<br />
srwxrwxrwx 1 root root 0 Jul 31 10:04 /var/lib/imap/socket/lmtp<br />
<br />
<br />
Step 7:<br />
<br />
Add users. Note, you may have to go back to step 3 to add them to /etc/sasldb2<br />
as well.<br />
<br />
$ su - cyrus<br />
$ cyradm tape.squeezel.com<br />
tape.squeezel.com> cm user.chirico<br />
tape.squeezel.com> quit<br />
<br />
Now got back as root, and check that everything was created correctly.<br />
<br />
$ ls /var/spool/imap/c/user/<br />
total 8<br />
drwx------ 2 cyrus mail 4096 Jul 31 10:21 chirico<br />
<br />
<br />
Step 8:<br />
<br />
Run a mail test. We'll do this as root to the chirico account.<br />
<br />
$ mail -s 'First test' chirico<br />
first test<br />
.<br />
<br />
Now, still as root check the maillog. Normally everything should work.<br />
<br />
$ tail /var/log/maillog<br />
<br />
However, I got the following error below.<br />
<br />
Jul 31 10:29:03 tape postfix/cleanup[30124]: AE7CB1B34A4: message-id=<20050731142903.AE7CB1B34A4@tape.squeezel.com><br />
Jul 31 10:29:03 tape postfix/qmgr[30120]: AE7CB1B34A4: from=<root@tape.squeezel.com>, size=315, nrcpt=1 (queue active)<br />
Jul 31 10:29:03 tape pipe[30128]: fatal: pipe_comand: execvp /cyrus/bin/deliver: No such file or directory<br />
<br />
If you get a similiar error, you may need to adjust the settting in /etc/postfix/master.cf<br />
<br />
# This is the problem in /etc/postfix/master.cf<br />
cyrus unix - n n - - pipe<br />
user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}<br />
<br />
My deliver file is the following<br />
<br />
$ ls -l /usr/lib/cyrus-imapd/deliver<br />
-rwxr-xr-x 1 root root 846228 Apr 4 18:59 /usr/lib/cyrus-imapd/deliver<br />
<br />
So I need to change my /etc/postfix/master.cf as follows:<br />
<br />
# Fix because by deliver file is under /usr/lib/cyrus-imapd/deliver<br />
cyrus unix - n n - - pipe<br />
user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}<br />
<br />
<br />
If changes were needed, like I had to do, restart postfix<br />
<br />
$ /etc/init.d/postfix restart<br />
<br />
Now, if everything works, you should start to see numbers in the spool directory like "1." and<br />
"2.".<br />
<br />
$ ls -l /var/spool/imap/c/user/chirico/<br />
total 40<br />
-rw------- 1 cyrus mail 545 Jul 31 10:44 1.<br />
-rw------- 1 cyrus mail 547 Jul 31 10:45 2.<br />
-rw------- 1 cyrus mail 1276 Jul 31 10:45 cyrus.cache<br />
-rw------- 1 cyrus mail 153 Jul 31 10:21 cyrus.header<br />
-rw------- 1 cyrus mail 196 Jul 31 10:45 cyrus.index<br />
<br />
Step 9:<br />
<br />
Local firewall.<br />
<br />
# imap<br />
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 143 -j ACCEPT<br />
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 143 -j ACCEPT<br />
<br />
Step 10:<br />
<br />
Configure cyrus-imapd to start for run-level 3 and 5.<br />
<br />
# chkconfig --level 35 cyrus-imapd on<br />
<br />
<br />
HINTS - <br />
<br />
Something to watch out for:<br />
<br />
Something to watch out for: If a user creates a .forward file in their shell account with the<br />
following entry, then, mail will not get mail relayed to cyrus.<br />
<br />
"|exec /usr/bin/procmail"<br />
<br />
<br />
The /etc/maillog will show something like this:<br />
<br />
to=<chirico@squeezel.squeezel.com>, orig_to=<chirico>, relay=local, delay=0,<br />
status=sent (delivered to command: exec /usr/bin/procmail)<br />
<br />
Remove the ".forward" file from their home directory and you'll get the following:<br />
<br />
to=<chirico@squeezel.squeezel.com>, relay=cyrus, delay=0,<br />
status=sent (squeezel.squeezel.com)<br />
<br />
<br />
mutt with IMAP? (See TIP 190)<br />
<br />
<br />
<br />
TIP 189:<br />
<br />
expand - convert tabs to spaces in a file.<br />
<br />
$ expand How_to_Linux_and_Open_Source.txt > notabs<br />
<br />
<br />
<br />
TIP 190:<br />
<br />
mutt with imap - assume you have setup imap (see tip 188). Now how do you configure<br />
your ".muttrc" file to automatically connect, securely to the IMAP server?<br />
<br />
<br />
<br />
Below is an example of my ".muttrc" file. For this example, assume my password is "S0m3paSSw0r9".<br />
<br />
$ cat .muttrc<br />
set spoolfile = "imaps://chirico:S0m3paSSw0r9@squeezel.squeezel.com/<br />
set imap_force_ssl=yes<br />
set certificate_file=~/.mutt/certificates/72d31154.0<br />
<br />
Now, you want to copy the certificate as a "file.pem" and run "c_rehash" to convert this<br />
file to a number. See the article. See the following article on how to do this under the <br />
fetchmail section.<br />
<br />
http://souptonuts.sourceforge.net/postfix_tutorial.html<br />
<br />
This is a quick summary of creating this key.<br />
<br />
$ openssl s_client -connect squeezel.squeezel.com:995 -showcerts > file.pem<br />
$ c_rehash ~/.mutt/certificates<br />
<br />
<br />
<br />
TIP 191:<br />
<br />
Apache - CGI scripts. There are two ways to enable CGI scripts. The second method is the<br />
prefered method.<br />
<br />
<br />
First way, the easy way. Look for the "http.conf" file. On Fedora Core, this file can be<br />
found under "/etc/httpd/conf/httpd.conf". Edit this file as follows to make <br />
"http://squeezel.squeezel.com/chirico-cgi/" execute scripts.<br />
<br />
ScriptAlias /chirico-cgi/ "/home/chirico/cgi-bin/"<br />
<br />
<br />
Second way, the better way. Instead of doing the above, make the following change in <br />
"/etc/httpd/conf/httpd.conf".<br />
<br />
<Directory /home/chirico/cgi-bin><br />
Options +ExecCGI<br />
SetHandler chirico-cgi<br />
</Directory><br />
<br />
<br />
Running a test script. Now copy the following test script into the directory "/home/chirico/cgi-bin"<br />
and change the rights to execute for the user running this.<br />
<br />
#!/bin/sh<br />
# Save as test.cgi<br />
# chown apache.apache test.cgi<br />
# chmod 700 test.cgi<br />
echo "Content-Type: text/html"<br />
echo<br />
echo "Hello world from user <b>`whoami`</b>! "<br />
<br />
<br />
<br />
TIP 192:<br />
<br />
Bash - using getopts for your bash scripts.<br />
<br />
#!/bin/bash<br />
while getopts "ab:cd:" Option<br />
# b and d take arguments<br />
#<br />
do<br />
case $Option in<br />
a) echo -e "a = $OPTIND";;<br />
b) echo -e "b = $OPTIND $OPTARG";;<br />
c) echo -e "c = $OPTIND";;<br />
d) echo -e "d = $OPTIND $OPTARG";;<br />
esac<br />
done<br />
shift $(($OPTIND - 1))<br />
<br />
<br />
<br />
TIP 193:<br />
<br />
Sieve - creating sieve recipes with "sieveshell"<br />
<br />
The following sieve script put all jefferson.edu mail into the <br />
folder jefferson. This assumes that I have already created the IMP <br />
directory, or mail box (INBOX.jefferson), which can be done in mutt <br />
with the "C" command. Below is an example of finding "jefferson.edu"<br />
anywhere in the header. <br />
<br />
# This is a file named jefferson.siv<br />
require ["fileinto"];<br />
if header :contains "Received" "from jefferson.edu" {<br />
fileinto "INBOX.jefferson";<br />
stop;<br />
}<br />
<br />
Now, from the command propt execute "sieveshell" with the hostname of the<br />
imap server. My server is squeezel.squeezel.com, so I would execute the <br />
following:<br />
<br />
$ sieveshell squeezel.squeezel.com<br />
connecting to squeezel.squeezel.com<br />
Please enter your password:****<br />
> put jefferson.siv<br />
> activate jefferson.siv<br />
> list<br />
jefferson.siv <- active script<br />
> quit<br />
<br />
Note the put brings in the script. And you need to activiate it.<br />
<br />
You can activate a sieve script for any user on your system if you are<br />
root. This is an example of activating a script for user chirico. Assume<br />
below the root prompt is "#".<br />
<br />
# sieveshell -a chirico -u chirico squeezel.squeezel.com<br />
<br />
You can also automate everything from a bash script. But note after<br />
the -e the commands, and not a file with the commands, follows within<br />
quotes. This is the script I use for my home system.<br />
<br />
#!/bin/bash<br />
sieveshell -a chirico -u chirico -e 'deactivate<br />
delete chirico.siv<br />
put chirico.siv<br />
activate chirico.siv<br />
list<br />
' squeezel.squeezel.com<br />
<br />
<br />
<br />
References:<br />
http://wiki.fastmail.fm/index.php/SieveRecipes<br />
http://www.cyrusoft.com/sieve/#documents<br />
<br />
<br />
<br />
TIP 194:<br />
<br />
emacs - editing files remotely with tramp. Tramp comes with the latest version of emacs.<br />
That means if you're using Fedora core 4, with emacs, you have tramp. This is <br />
ideal for editing files on remote computers that do not use emacs.<br />
<br />
Edit the ".emacs" file and add the following line:<br />
<br />
(require 'tramp)<br />
(setq tramp-default-method "scp")<br />
<br />
Now, to edit a file on computer tape.squeezel.com (C-x, C-f) and<br />
enter the following in Find file:<br />
<br />
Find file:/chirico@tape.squeezel.com:test.txt<br />
<br />
<br />
References:<br />
<br />
http://savannah.gnu.org/projects/tramp/<br />
<br />
<br />
<br />
TIP 195:<br />
<br />
trusted X11 forwarding - running gnome and KDE both on one screen, at the same<br />
time securely. The following assumes gnome is running on the current<br />
computer and "closet.squeezel.com" has KDE<br />
<br />
$ ssh -Y closet.squeezel.com<br />
$ startkde<br />
<br />
Or assume you want to run gnome on "closet.squeezel.com"<br />
<br />
$ ssh -Y closet.squeezel.com<br />
$ gnome-session<br />
<br />
By default Fedora Core allows ForwardX11 over ssh. Note you want to use<br />
the -Y option above and NOT -X. <br />
<br />
Suppose you want a remote "gnome-session" on ctl-alt-F12. Below is an <br />
example of getting the remote computer closet.squeezel.com, and you<br />
can still have the above configuration.<br />
<br />
First you must allow magic cookies for each server connection.<br />
<br />
$ MCOOKIE=$(mcookie)<br />
$ xauth add $(hostname)/unix:1 MIT-MAGIC-COOKIE-1 $MCOOKIE<br />
$ xauth add localhost/unix:1 MIT-MAGIC-COOKIE-1 $MCOOKIE<br />
<br />
Again, note that you have to add this for EACH connection. So if you wanted 2 as well<br />
<br />
$ MCOOKIE=$(mcookie)<br />
$ xauth add $(hostname)/unix:2 MIT-MAGIC-COOKIE-1 $MCOOKIE<br />
$ xauth add localhost/unix:2 MIT-MAGIC-COOKIE-1 $MCOOKIE<br />
<br />
On squeezel.squeezel.com create a new xterm. If :1 is take below<br />
try :2. The vt12 is for switching to ctl-alt-F12.<br />
<br />
$ xinit -- :1 vt12<br />
<br />
Note, if you do not add the above cookies, you will get the follow error:<br />
<br />
Xlib: connection to ":1.0" refused by server<br />
Xlib: No protocol specified<br />
<br />
The screen may be hard to read. At this point ssh -Y to the remote computer.<br />
<br />
$ ssh -Y closet.squeezel.com<br />
$ gnome-session<br />
<br />
Yes, you will get errors about sound and some custom drivers is the remove <br />
computer has different hardware. After is loads, you can switch back and<br />
forth between session with (ctl-alt-F12) and (ctl-alt-F7)<br />
<br />
<br />
<br />
TIP 196:<br />
<br />
Suspend ssh session - you have just sshed into a computer "ssh -l user example.com", and you<br />
want to get back to the terminal prompt of the computer you started with. Escapte, by <br />
default with ssh is "~", so enter "~" followed by "ctl-z" to suspend.<br />
<br />
<br />
<br />
TIP 197:<br />
<br />
Quick way to send a text file <br />
<br />
$ sendmail -f mike.chirico@gmail.com mchirico@comcast.net < /etc/fstab<br />
<br />
<br />
<br />
TIP 198:<br />
<br />
size - determining the size of the text segment, data segment, and "bss" or uninitialized data segment.<br />
<br />
$ size /bin/sh /bin/bash<br />
text data bss dec hex filename<br />
586946 22444 18784 628174 995ce /bin/sh<br />
586946 22444 18784 628174 995ce /bin/bash<br />
<br />
Note above that "/bin/sh" and "/bin/bash" have equal text,data and bss numbers. It's<br />
highly likely that these are the same programs.<br />
<br />
$ ls -l /bin/sh<br />
lrwxrwxrwx 1 root root 4 Jan 14 2005 /bin/sh -> bash<br />
<br />
Yep, it's the same program. Here's a further definition of each segment.<br />
<br />
Text segment: The machine instructions that the CPU executes. This is usually<br />
read only and sharable.<br />
<br />
Data segment: Contains initialized variables in a program. You also know these<br />
as declarations and definitions.<br />
<br />
int max = 200;<br />
<br />
Uninitialized data segment: Think of this as a declaration only, or data that<br />
is only initialized by the kernel to arithmetic 0 or null pointers<br />
before program execution.<br />
<br />
char s[10];<br />
<br />
<br />
<br />
TIP 199:<br />
<br />
Using the at command.<br />
<br />
Below is a simple example if running the ls command at 11:42am that<br />
will send mail -m to the user that executed it.<br />
<br />
<br />
We'll execute job1 defined as follows and set to be executable. <br />
<br />
$ cat ./job1<br />
#!/bin/bash<br />
date >> /tmp/job1<br />
<br />
The at command is listed below. For queue "-q" names you can only<br />
specify one letter. Here we're using x. The letter determines the<br />
priority with "a" the highest.<br />
<br />
$ at -q x -f ./job1 -m 11:54am<br />
job 3 at 2005-10-04 11:54<br />
<br />
Now, if you execute the atq command, you'll get the following.<br />
<br />
$ atq<br />
3 2005-10-04 11:54 x chirico<br />
<br />
It's also possible to execute jobs at the command line entering<br />
a ctl-d at the end of the input.<br />
<br />
$ at -q x -m 12:08pm<br />
at> ls -l<br />
at> who<br />
at> date<br />
at> ^D<br />
<br />
<br />
Or for a job to execute 1 minute from now.<br />
<br />
$ at -q x -m `date -d '1 minute' +"%H:%M"`<br />
at> ls -l<br />
at> date<br />
<br />
<br />
Important points: The atd daemon must be running. To check if<br />
it's running do the following:<br />
<br />
$ /etc/init.d/atd status<br />
<br />
Also, if there is an /etc/at.allow file, then only users in that<br />
file will be allowed to execute at.<br />
<br />
If /etc/at.deny exists but is empty and there is no /etc/at.allow,<br />
then, everyone can execute the at command.<br />
<br />
<br />
<br />
TIP 200:<br />
<br />
lsusb - command will display all USB buses and all devices connected.<br />
<br />
$ lsusb<br />
Bus 005 Device 003: ID 413c:2010 Dell Computer Corp.<br />
Bus 005 Device 002: ID 413c:1003 Dell Computer Corp.<br />
Bus 005 Device 001: ID 0000:0000<br />
Bus 004 Device 001: ID 0000:0000<br />
Bus 003 Device 003: ID 0fc5:1227 Delcom Engineering<br />
Bus 003 Device 002: ID 046d:c016 Logitech, Inc. Optical Mouse<br />
Bus 003 Device 001: ID 0000:0000<br />
Bus 002 Device 001: ID 0000:0000<br />
Bus 001 Device 001: ID 0000:0000<br />
<br />
<br />
<br />
TIP 201:<br />
<br />
Memory fragmentation - if you suspect workload memory fragmentation issues<br />
and you want to monitor the current state of you system, then, consider<br />
looking at the output from /proc/buddyinfo on recent kernels.<br />
<br />
$ cat /proc/buddyinfo<br />
Node 0, zone DMA 541 218 42 2 0 0 0 1 1 1 0 <br />
Node 0, zone Normal 2508 2614 52 1 5 5 0 1 1 1 0 <br />
Node 0, zone HighMem 0 1 3 0 1 0 0 0 0 0 0 <br />
<br />
The following definition is taken from ./Documentation/filesystems/proc.txt in the <br />
Linux kernel source.<br />
<br />
Each column represents the number of pages of a certain order which are<br />
available. In this case, there are 0 chunks of 2^0*PAGE_SIZE available in<br />
ZONE_DMA, 4 chunks of 2^1*PAGE_SIZE in ZONE_DMA, 101 chunks of 2^4*PAGE_SIZE<br />
available in ZONE_NORMAL, etc...<br />
<br />
<br />
<br />
TIP 202:<br />
<br />
arp - Linux ARP kernel moduel. This command implements the Address Resolution Protocol.<br />
<br />
This is an example of the command.<br />
<br />
$ arp<br />
Address HWtype HWaddress Flags Mask Iface<br />
tape.squeezel.com ether 00:50:DA:60:5B:AD C eth0<br />
squeezel.squeezel.com ether 00:11:11:8A:BE:3F C eth0<br />
gw.squeezel.com ether 00:0F:66:47:15:73 C eth0<br />
<br />
<br />
TIP 203:<br />
<br />
dbench - performance monitoring. <br />
<br />
So, how does your system react when the load average is above 600. Have you even seen a <br />
computer with a load average of 600? Well, this could be your chance. <br />
<br />
Reference: http://freshmeat.net/projects/dbench/<br />
<br />
The following gives a load average of 10 on my system.<br />
<br />
$ dbench 34<br />
<br />
If you want a higher load, just increase the number.<br />
<br />
<br />
<br />
TIP 204:<br />
<br />
/etc guide - a listing of common files in the /etc directory.<br />
<br />
/etc/exports: this file is used to configure NFS.<br />
<br />
/etc/ftpusers: the users on your system who are restricted from FTP login.<br />
<br />
/etc/motd: message of the day, which users see after login.<br />
<br />
/etc/named.conf: DNS config file.<br />
<br />
/etc/profile: common user information.<br />
<br />
/etc/inittab: this file contains runlevel start information.<br />
<br />
/etc/services: the services and their respective ports.<br />
<br />
/etc/shells: this contains the names of all shells installed on the system.<br />
<br />
/etc/passwd: this file contains user information.<br />
<br />
/etc/group: security group rights.<br />
<br />
<br />
<br />
TIP 205: <br />
<br />
logger - is a bash command utility for writing to /var/log/messages or the<br />
other files defined in /etc/syslog.conf.<br />
<br />
$ logger -t TEST more of a test here<br />
<br />
This is what shows up in /var/log/messages<br />
<br />
Oct 28 07:15:50 squeezel TEST: more of a test here<br />
<br />
<br />
<br />
TIP 206: <br />
<br />
accton, lastcomm - accouting on and last command. This is <br />
a way to monitor users on your system. As root, you <br />
would implement this as follows:<br />
<br />
$ accton -h<br />
Usage: accton [-hV] [file]<br />
[--help] [--version]<br />
<br />
The system's default process accounting file is /var/account/pacct.<br />
<br />
Note the default file location is /var/account/pacct so we'll turn<br />
it on system wide with the following command.<br />
<br />
$ accton /var/account/pacct<br />
<br />
Now take a look at this file. It will grow. To see command that<br />
are executed, use the lastcomm command.<br />
<br />
$ lastcomm<br />
<br />
The above command gives output for all users. To get the data<br />
for user "chirico" execute the following command:<br />
<br />
$ lastcomm --user chirico<br />
<br />
You can also get a summary of commands with sa.<br />
<br />
[chirico@big ~]$ sa<br />
30 5.23re 0.00cp 10185k<br />
11 4.83re 0.00cp 8961k ***other<br />
8 0.13re 0.00cp 19744k nagios*<br />
4 0.00re 0.00cp 2542k automount*<br />
3 0.00re 0.00cp 680k sa<br />
2 0.13re 0.00cp 17424k check_ping<br />
2 0.13re 0.00cp 978k ping<br />
<br />
To turn off accounting, execute accton without a filename.<br />
<br />
$ accton<br />
<br />
<br />
<br />
TIP 207:<br />
<br />
CPU Temperature on a laptop. The following is the temperature<br />
of my Dell laptop. <br />
<br />
$ cat /proc/acpi/thermal_zone/THM/temperature<br />
temperature: 58 C<br />
<br />
<br />
<br />
<br />
TIP 208:<br />
<br />
script -f with mkfifo to allow another user to view what you type<br />
in real-time.<br />
<br />
<br />
Step 1. Create a fifo (first in first out) file that the other<br />
user can view. For this example create the file /tmp/scriptout<br />
<br />
[chirico@laptop ~]$ mkfifo /tmp/scriptout<br />
<br />
Step 2. Have the second user, voyeur user, cat this file. Output will block<br />
for them until you complete step 3. The other user, voyer,<br />
is executing the command below.<br />
<br />
[voyeur@laptop ~]$ cat /tmp/scriptout<br />
<br />
Step 3. The original user runs the following command.<br />
<br />
[chirico@laptop ~]$ script -f /tmp/scriptout<br />
Script started, file is /tmp/scriptout<br />
<br />
Now anything typed, including a vi session, will be displayed to the<br />
voyeur user in step 2. <br />
<br />
See TIP 46.<br />
<br />
<br />
<br />
TIP 209:<br />
<br />
fsck forced on next reboot. To do this, as root issue the following commands.<br />
<br />
$ cd /<br />
$ touch forcefsck<br />
<br />
Now reboot the system, and when it comes up fsck will be forced on the system.<br />
<br />
$ shutdown -r now<br />
<br />
<br />
<br />
TIP 210:<br />
<br />
/dev/random and /dev/urandom differ in their random generating properties. /dev/random<br />
only returns bytes when enough noise has been generated from the entropy pool. In<br />
contrast /dev/urandom will always return bytes.<br />
<br />
<br />
Reference: http://sourceforge.net/direct-dl/mchirico/cpearls/simple_but_common.tar.gz (rand.c)<br />
<br />
<br />
<br />
TIP 211:<br />
<br />
Want to find out the speed of your NIC? (Full Duplex or Half), then use ethtool.<br />
<br />
[root@squeezel ~]# ethtool eth0<br />
Settings for eth0:<br />
Supported ports: [ MII ]<br />
Supported link modes: 10baseT/Half 10baseT/Full<br />
100baseT/Half 100baseT/Full<br />
1000baseT/Half 1000baseT/Full<br />
Supports auto-negotiation: Yes<br />
Advertised link modes: 10baseT/Half 10baseT/Full<br />
100baseT/Half 100baseT/Full<br />
1000baseT/Half 1000baseT/Full<br />
Advertised auto-negotiation: Yes<br />
Speed: 100Mb/s<br />
Duplex: Full<br />
Port: Twisted Pair<br />
PHYAD: 1<br />
Transceiver: internal<br />
Auto-negotiation: on<br />
Supports Wake-on: g<br />
Wake-on: d<br />
Current message level: 0x000000ff (255)<br />
Link detected: yes<br />
<br />
<br />
<br />
<br />
TIP 212:<br />
<br />
rpm install hang? You might need to delete the lock state information. <br />
<br />
$ nl /etc/rc.d/rc.sysinit | grep rpm<br />
720 rm -f /var/lib/rpm/__db* &> /dev/null<br />
<br />
Note the command <br />
<br />
$ rm -f /var/lib/rpm/__db*<br />
<br />
Because sometimes you will run "rpm -ivh somerpm" and it will just sit<br />
there.<br />
<br />
<br />
<br />
<br />
TIP 213:<br />
<br />
Apache - limit access to certain directories based on IP address in the<br />
httpd.conf file.<br />
<br />
You can do this completely from /etc/httpd/conf/httpd.conf which<br />
are shown below for multiple IP addresses. Note that all 3 setting<br />
are the same.<br />
<br />
10.0.0.0/255.0.0.0<br />
10.0.0.0/8<br />
10<br />
<br />
However, the following is different<br />
<br />
10.0.0.0/24 only allows 10.0.0.1 to 10.0.0.254<br />
<br />
<br />
Some complete settings in /etc/httpd/conf/httpd.conf <br />
<br />
<Directory /var/www/html/chirico/><br />
Order allow,deny<br />
Allow from 10.0.0.0/8 # All 10.<br />
Allow from 192.168.0.0/16 # All 192.168<br />
Allow from 127 # All 127.<br />
</Directory><br />
<br />
Don't forget to reload httpd with the following command.<br />
<br />
$ /etc/init.d/httpd reload<br />
<br />
<br />
<br />
TIP 214:<br />
<br />
Open Files - determining how many files are currently open.<br />
<br />
$ cat /proc/sys/fs/file-nr<br />
2030 263 104851<br />
| | \- maximum open file descriptors <br />
| | <br />
| \- total free allocated file descriptors<br />
|<br />
(Total allocated file descriptors since boot)<br />
<br />
Note the maximum number can be set or changed.<br />
<br />
$ cat /proc/sys/fs/file-max<br />
104851<br />
<br />
To change this<br />
<br />
$ echo "804854" > /proc/sys/fs/file-max<br />
<br />
Note lsof | wc -l will report higher numbers because this includes<br />
open files that are not using file descriptors such as directories,<br />
memory mapped files, and executable text files.<br />
<br />
(Reference http://www.netadmintools.com/art295.html<br />
and also see the man page for this: man 5 proc )<br />
<br />
<br />
<br />
TIP 215:<br />
<br />
Ctrl-Alt-Del will cause an immediate reboot, without syncing dirty buffers by<br />
setting the value > 0 in /proc/sys/kernel/ctrl-alt-del.<br />
<br />
$ echo 1 > /proc/sys/kernel/ctrl-alt-del<br />
<br />
<br />
(Reference: man 5 proc)<br />
<br />
<br />
<br />
<br />
TIP 216:<br />
<br />
Redefining keys in X using xev and xmodmap. The program xev, used in an X window <br />
terminal screen will display information on mouse movements, keys pressed and <br />
released.<br />
<br />
$ xev<br />
<br />
Now type shift-4 and you'll notice the event details below:<br />
<br />
KeyPress event, serial 29, synthetic NO, window 0x3800001,<br />
root 0x60, subw 0x0, time 55307049, (418,242), root:(428,339),<br />
state 0x1, keycode 13 (keysym 0x24, dollar), same_screen YES,<br />
XLookupString gives 1 bytes: (24) "$"<br />
XmbLookupString gives 1 bytes: (24) "$"<br />
XFilterEvent returns: False<br />
<br />
KeyRelease event, serial 29, synthetic NO, window 0x3800001,<br />
root 0x60, subw 0x0, time 55307184, (418,242), root:(428,339),<br />
state 0x1, keycode 13 (keysym 0x24, dollar), same_screen YES,<br />
XLookupString gives 1 bytes: (24) "$"<br />
<br />
So, if you want to redefine this key to say copyright, see (/usr/X11R6/include/X11/keysymdef.h)<br />
you would type the following.<br />
<br />
$ xmodmap -e 'keycode 13 = 4 copyright'<br />
<br />
To get the key back to the dollar, issue the following command.<br />
<br />
$ xmodmap -e 'keycode 13 = 4 dollar'<br />
<br />
By the way it's possible to define multiple key codes for a sigle key. You'll need<br />
to have a key defined as the Mode_switch. Perhaps you'd like to use the Windows key,<br />
or the key with the Microsoft logo on it, since you're using Linux. This key is<br />
keycode 115<br />
<br />
$ xmodmap -e 'keycode 115 = Mode_switch'<br />
<br />
Now you could define 3 values to the shift-4. For this example use ld, Yen and dollar.<br />
<br />
$ xmodmap -e 'keycode 13 = 4 dollar sterling yen'<br />
<br />
So pressing the keys gives you the following:<br />
<br />
shift-$ (dollar sign)<br />
Windows-$ (lb sign)<br />
Windows-shift-$ (Yen sign)<br />
<br />
You could go crazy and redefine all you keys.<br />
<br />
(Thanks to hisham for this tip).<br />
<br />
<br />
<br />
TIP 217:<br />
<br />
Threads - which version of threads are you using?<br />
<br />
$ getconf GNU_LIBPTHREAD_VERSION<br />
NPTL 2.3.90<br />
<br />
For a history on threads used with gcc reference the following:<br />
<br />
http://en.wikipedia.org/wiki/NPTL<br />
<br />
<br />
<br />
<br />
TIP 218:<br />
<br />
Screenshots using ImageMagick. <br />
<br />
If you want the entire screen, execute the following:<br />
<br />
$ import -window root screen.png<br />
<br />
Or to crosshair select the region with your mouse, execute <br />
the following instead.<br />
<br />
$ import screen.png<br />
<br />
KDE has the ability to take screenshots with the command below.<br />
<br />
$ ksnapshot<br />
<br />
GNOME likewise has a command too.<br />
<br />
$ gnome-panel-screenshot --delay 6<br />
<br />
<br />
<br />
Visting ImageMagick again, the xwininfo command give window information and the id can be<br />
used to capture images with the import command.<br />
<br />
$ xwininfo<br />
<br />
xwininfo: Please select the window about which you<br />
would like information by clicking the<br />
mouse in that window.<br />
<br />
xwininfo: Window id: 0x1e00007 "chirico@squeezel:/work/svn/souptonuts - Shell - Konsole"<br />
<br />
Absolute upper-left X: 4<br />
Absolute upper-left Y: 21<br />
Relative upper-left X: 0<br />
Relative upper-left Y: 0<br />
Width: 880<br />
Height: 510<br />
Depth: 24<br />
Visual Class: TrueColor<br />
Border width: 0<br />
Class: InputOutput<br />
Colormap: 0x20 (installed)<br />
Bit Gravity State: NorthWestGravity<br />
Window Gravity State: NorthWestGravity<br />
Backing Store State: NotUseful<br />
Save Under State: no<br />
Map State: IsViewable<br />
Override Redirect State: no<br />
Corners: +4+21 -396+21 -396-493 +4-493<br />
-geometry 880x510+0+0<br />
<br />
Now use the import command with the Window id. My example is shown below.<br />
<br />
$ import -window 0x1e00007 id.miff<br />
<br />
And to quickly display this image that you just saved, use the display command.<br />
<br />
$ display id.miff <br />
<br />
<br />
<br />
TIP 219:<br />
<br />
File Access over SSH using FUSE (Filesystem in USErspace). This is a very good way to <br />
mount a remote filesystem locally. It's like a secure NFS mount, but you don't require <br />
admin privileges on the remote computer. You do need to have fuse-sshfs installed on <br />
the local computer that will perform the filesystem mount.<br />
<br />
The following works with Fedora Core 5. Only the users added to the fuse group can mout <br />
external drives. Below the user chirico is being added to the group fuse.<br />
<br />
$ yum install fuse-sshfs<br />
$ usermod -a -G fuse chirico<br />
<br />
You'll need to reboot.<br />
<br />
$ shutdown -r now<br />
<br />
<br />
Next I'm going to mount the remote filesystem v0.squeezel.com. This is done as user chirico<br />
on the local computer. I'm using root on the remote computer v0.squeezel.com because I<br />
want to mount the complete drive.<br />
<br />
$ mkdir v0<br />
$ sshfs root@v0.squeezel.com:/ v0<br />
$ cd v0<br />
$ ls -l<br />
bin dev home lost+found media mnt opt q sbin srv tmp var<br />
boot etc lib master_backup misc net proc root selinux sys usr<br />
<br />
<br />
Now to unmount the filesystem<br />
<br />
$ fusermount -u /home/chirico/v0<br />
<br />
Yes, you can mount the filesystem on boot. Below shows an example entry for /etc/fstab, but<br />
this only allows user on the current system to view what is is /mnt/v0. <br />
<br />
sshfs#root@v0.squeezel.com:/var/log /mnt/v0 fuse defaults 0 0<br />
<br />
References:<br />
(http://fuse.sourceforge.net/sshfs.html)<br />
<br />
<br />
<br />
<br />
TIP 220:<br />
<br />
OpenVPN - A full-featured SSL VPN solution. The following demonstrates<br />
a very simple OpenVPN setup between two Fedora Core 5 computers<br />
big.squeezel.com 192.168.1.12 and tape.squeezel.com 192.168.1.155<br />
<br />
As root install the package on both computers.<br />
<br />
$ yum -y install openvpn<br />
<br />
<br />
Setup on big.squeezel.com 192.168.1.12<br />
<br />
$ iptables -A INPUT -p udp -s 192.168.1.155 --dport 1194 -j ACCEPT<br />
$ iptables -A INPUT -i tun+ -j ACCEPT<br />
$ iptables -A INPUT -i tap+ -j ACCEPT<br />
$ iptables -A INPUT -i tap+ -j ACCEPT<br />
$ iptables -A FORWARD -i tap+ -j ACCEPT<br />
<br />
Note - make sure you have commented out the following line <br />
in /etc/sysconfig/iptables<br />
<br />
# -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited<br />
<br />
Now from continuting with the commands that need to be executed on <br />
big.squeezel.com 192.168.1.12 do one of the following<br />
<br />
$ openvpn --remote tape.squeezel.com --dev tun1 --ifconfig 10.4.0.1 10.4.0.2 --verb 9<br />
<br />
The above statement gives lots of errors. Once it's working you may want<br />
the following statement without the --verb 9 option.<br />
<br />
$ openvpn --remote tape.squeezel.com --dev tun1 --ifconfig 10.4.0.1 10.4.0.2<br />
<br />
After you finish the setup commands for tape.squeezel.com immediately below, you'll be<br />
able to access tape.squeezel.com as 10.4.0.2.<br />
<br />
<br />
Setup on tape.squeezel.com 192.168.1.155<br />
<br />
$ iptables -A INPUT -p udp -s 192.168.1.12 --dport 1194 -j ACCEPT<br />
$ iptables -A INPUT -i tun+ -j ACCEPT<br />
$ iptables -A INPUT -i tap+ -j ACCEPT<br />
$ iptables -A INPUT -i tap+ -j ACCEPT<br />
$ iptables -A FORWARD -i tap+ -j ACCEPT<br />
<br />
Note - again, make sure you have commented out the following line <br />
in /etc/sysconfig/iptables<br />
<br />
# -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited<br />
<br />
The openvpn commands are tape.squeezel.com are reversed from what is shown<br />
above.<br />
<br />
$ openvpn --remote big.squeezel.com --dev tun1 --ifconfig 10.4.0.2 10.4.0.1 --verb 9<br />
<br />
Or<br />
$ openvpn --remote big.squeezel.com --dev tun1 --ifconfig 10.4.0.2 10.4.0.1<br />
<br />
<br />
Now you can access all services and ports from big.squeezel.com on 10.4.0.1 for <br />
such services as MySQL, secure Web, imap, etc. A quick test is nmap as follows:<br />
<br />
$ nmap -A -T4 10.4.0.1<br />
<br />
Starting Nmap 4.03 ( http://www.insecure.org/nmap/ ) at 2006-05-20 13:54 EDT<br />
Interesting ports on 10.4.0.1:<br />
(The 1671 ports scanned but not shown below are in state: closed)<br />
PORT STATE SERVICE VERSION<br />
22/tcp open ssh OpenSSH 4.3 (protocol 2.0)<br />
111/tcp open rpcbind 2 (rpc #100000)<br />
3306/tcp open mysql MySQL (unauthorized)<br />
<br />
Nmap finished: 1 IP address (1 host up) scanned in 7.116 seconds<br />
<br />
<br />
<br />
TIP 221:<br />
<br />
openssl - Some common commands.<br />
<br />
Finding the openssldir (Directory for OpenSSL files).<br />
<br />
$ openssl version -a|grep OPENSSLDIR<br />
OPENSSLDIR: "/etc/pki/tls"<br />
<br />
Connect to a secure SMTP server with STARTTLS, assuming the server name is<br />
squeezel.squeezel.com<br />
<br />
$ openssl s_client -connect squeezel.squeezel.com:25 -starttls<br />
<br />
<br />
<br />
Reference (http://www.madboa.com/geek/openssl/)<br />
<br />
<br />
<br />
TIP 222:<br />
<br />
Bash functions. This is easy, and I find it very useful to create bash functions<br />
for repeated commands. For example, suppose you want to create a quick bash function<br />
to cd to /var/log, tail messages and tail secure. You can create this function as<br />
follows:<br />
<br />
[root@v5 log]# m()<br />
m()<br />
> { cd /var/log<br />
{ cd /var/log<br />
> tail messages<br />
tail messages<br />
> tail secure<br />
tail secure<br />
> }<br />
}<br />
<br />
Above I'm typing m() then hitting return. Note the echo on the next line followed<br />
by the prompt >. I then enter {. <br />
<br />
<br />
<br />
TIP 223:<br />
<br />
Stats on DNS Server. You can get stats on your DNS server. <br />
<br />
The following works for BIND 9:<br />
<br />
$ rndc stats<br />
<br />
On my system I see the output in "/var/named/chroot/var/named/data/named_stats.txt", which<br />
if an FC4 system. By the way, if you're using BIND 8, the command is "ndc stats", but that<br />
has a completely different format.<br />
<br />
<br />
Format of the output<br />
<br />
+++ Statistics Dump +++ (1153791199)<br />
success 297621<br />
referral 32<br />
nxrrset 21953<br />
nxdomain 33742<br />
recursion 28243<br />
failure 54<br />
--- Statistics Dump --- (1153791199)<br />
<br />
The number (1153791199) can be converted with the date command.<br />
<br />
$ date -d '1970-01-01 1153791199 sec'<br />
Tue Jul 25 02:33:19 EDT 2006<br />
<br />
That's 1153791199 seconds since 1970-01-01 UCT. Which is 4 hours fast,<br />
from EDT.<br />
<br />
<br />
<br />
TIP 224:<br />
<br />
snmp - simple network monitoring protocol. The following steps setup snmp on Fedora Core 5.<br />
<br />
$ yum install net-snmp*<br />
<br />
Next add the following line in "/etc/snmp/snmpd.conf" at the bottom.<br />
<br />
rocommunity pA33worD<br />
<br />
Start the snmp service.<br />
<br />
$ /etc/init.d/snmpd restart<br />
<br />
Once started, from the command prompt, it's possible to get stats on the computer.<br />
<br />
$ snmpwalk -v 1 -c pA33worD localhost system<br />
Or<br />
$ snmpwalk -v 1 -c pA33worD localhost interface<br />
<br />
Or<br />
$ snmpgetnext -v 1 -c pA33worD localhost sysUpTime<br />
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (26452) 0:04:24.52<br />
<br />
Note the Timeticks is in 100th of a second. So the computer above has been running<br />
for 264.52 seconds.<br />
<br />
Reference( TIP 225 shows how to use MRTG for gathering snmp stats).<br />
http://www.net-snmp.org/tutorial/tutorial-5/commands/snmpv3.html<br />
<br />
<br />
TIP 225:<br />
<br />
MRTG - Multi Router Traffic Grapher. <br />
<br />
$ cfgmaker --output=/etc/mrtg/v5.squeezel.com \<br />
ifref=ip --global "workdir:/var/www/html/mrtg/stats"\<br />
pA33worD@v5.squeezel.com<br />
<br />
Reference: http://www.chinalinuxpub.com/doc/www.siliconvalleyccie.com/linux-hn/mrtg.htm<br />
<br />
<br />
<br />
TIP 226:<br />
<br />
Back Trace - This is a method of getting a back trace for all processes on the system.<br />
it assumes the following: a. Kernel was build with CONFIG_MAGIC_SYS-REQ <br />
enabled (which Fedora 5 kernels are) b. You can get direct access to the <br />
monitor.<br />
<br />
Step 1.<br />
<br />
Ctl-Alt-F1 (This brings you to the text console)<br />
<br />
Step 2.<br />
<br />
Alt-ScrollLock <br />
Ctl-ScrollLock<br />
<br />
Note above that's Alt-ScrollLock followed by Ctl-ScrollLock. You should see<br />
a lot of text on the screen. To fast to read, but don't worry the text will<br />
be in /var/log/messages at the end.<br />
<br />
On my system the ScrollLock key is next to the NumLock key. <br />
<br />
<br />
<br />
<br />
TIP 227:<br />
<br />
Ext3 Tuning - One advantage of Ext3 over Ext2 is directory indexing, which imporves file<br />
access in directories containing large files or when the directory contains<br />
many files. Directory indexing improves performance by using hashed binary <br />
trees. <br />
<br />
There are two ways to enable dir_index. First, find the device using the mount<br />
command.<br />
<br />
$ mount<br />
<br />
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)<br />
proc on /proc type proc (rw)<br />
sysfs on /sys type sysfs (rw)<br />
devpts on /dev/pts type devpts (rw,gid=5,mode=620)<br />
/dev/sda1 on /boot type ext3 (rw) <--- This is the one you want<br />
tmpfs on /dev/shm type tmpfs (rw)<br />
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)<br />
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)<br />
automount(pid2001) on /net type autofs (rw,fd=4,pgrp=2001,minproto=2,maxproto=4) <br />
<br />
<br />
From the above command, the device used is /dev/sda1. Using the tune2fs command,<br />
directory indexing will only apply to directories created after running the <br />
command below. <br />
<br />
$ tune2fs -O dir_index /dev/sda1<br />
<br />
However, if you want it to apply to all directories, use the e2fsck command as <br />
shown below:<br />
<br />
$ e2fsck -D -f /dev/sda1<br />
<br />
You'll need to bypass the warning message.<br />
<br />
<br />
Reference: "Tuning Journaling File Systems: A small amount of effort an dtime can yield big<br />
results",by Steve Best. Linux Magazine, September 10, 2006. This author as has<br />
a very good book titled: "Linux Debugging and Performance Tuning."<br />
<br />
<br />
<br />
TIP 228:<br />
<br />
NIC bonding - binding two or more NICs to one IP address to improve performance. The following<br />
instructions were done on Fedora Core 5.<br />
<br />
Step 1.<br />
<br />
Create the file ifcfg-bond0 with the IP address, netmask and gateway. Shown<br />
below is my file.<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-bond0<br />
<br />
DEVICE=bond0<br />
IPADDR=192.168.1.12<br />
NETMASK=255.255.255.0<br />
GATEWAY=192.168.1.1<br />
USERCTL=no<br />
BOOTPROTO=none<br />
ONBOOT=yes<br />
<br />
Step 2.<br />
<br />
Modify eth0, eth1 and eth2. Shown below are each one of my files. Note that<br />
you must comment out, or remove the ip address, netmask, gateway and hardware<br />
address from each one of these files, since settings should only come from<br />
the ifcfg-bond0 file above. I've chosen to comment out the lines, instead of <br />
removing, should I decide to unbond my NICS sometime in the future.<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0<br />
<br />
# Linksys Gigabit Network Adapter<br />
DEVICE=eth0<br />
BOOTPROTO=none<br />
#HWADDR=00:12:17:5C:A7:9D<br />
#IPADDR=192.168.1.12<br />
#NETMASK=255.255.255.0<br />
#TYPE=Ethernet<br />
#GATEWAY=192.168.1.1<br />
#USERCTL=no<br />
#IPV6INIT=no<br />
#PEERDNS=yes<br />
ONBOOT=yes<br />
# Settings for Bond<br />
MASTER=bond0<br />
SLAVE=yes<br />
<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth1<br />
<br />
# Linksys Gigabit Network Adapter<br />
DEVICE=eth1<br />
BOOTPROTO=none<br />
#HWADDR=00:12:17:5C:A7:C9<br />
#IPADDR=192.168.1.13<br />
#NETMASK=255.255.255.0<br />
ONBOOT=yes<br />
#TYPE=Ethernet<br />
USERCTL=no<br />
#IPV6INIT=no<br />
#PEERDNS=yes<br />
#<br />
# Settings for bonding<br />
MASTER=bond0<br />
SLAVE=yes<br />
<br />
<br />
$ cat /etc/sysconfig/network-scripts/ifcfg-eth2<br />
<br />
# Linksys Gigabit Network Adapter<br />
DEVICE=eth2<br />
BOOTPROTO=none<br />
#HWADDR=00:12:17:5C:A7:9D<br />
#IPADDR=192.168.1.12<br />
#NETMASK=255.255.255.0<br />
ONBOOT=yes<br />
#TYPE=Ethernet<br />
#GATEWAY=192.168.1.1<br />
#USERCTL=no<br />
#IPV6INIT=no<br />
#PEERDNS=yes<br />
MASTER=bond0<br />
SLAVE=yes<br />
<br />
Step 3.<br />
<br />
Set the load parameters for bond0 bonding kernel module. Append the<br />
following lines to /etc/modprobe.conf <br />
<br />
# bonding commands <br />
alias bond0 bonding<br />
options bond0 mode=balance-alb miimon=100<br />
<br />
<br />
Step 4.<br />
<br />
Load the bond driver module from the command prompt.<br />
<br />
$ modprobe bonding<br />
<br />
<br />
Step 5.<br />
<br />
Restart the network, or restart the computer. Note I restarted to computer,<br />
since my NICs above had MAC assignments.<br />
<br />
$ service network restart # Or restart computer<br />
<br />
Take a look at the proc settings. <br />
<br />
$ cat /proc/net/bonding/bond0 <br />
Ethernet Channel Bonding Driver: v3.0.3 (March 23, 2006)<br />
<br />
Bonding Mode: adaptive load balancing<br />
Primary Slave: None<br />
Currently Active Slave: eth2<br />
MII Status: up<br />
MII Polling Interval (ms): 100<br />
Up Delay (ms): 0<br />
Down Delay (ms): 0<br />
<br />
Slave Interface: eth2<br />
MII Status: up<br />
Link Failure Count: 0<br />
Permanent HW addr: 00:13:72:80:62:f0<br />
<br />
References:<br />
<br />
http://www.cyberciti.biz/nixcraft/vivek/blogger/2006/04/linux-bond-or-team-multiple-network.php<br />
Good, well written article describing the steps above.<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=24692&package_id=146474<br />
Documentation for bonding that can also be found in the kernel<br />
./Documentation/networking/bonding.txt<br />
<br />
<br />
<br />
TIP 229:<br />
<br />
/etc/nsswitch.conf - System Databases and Name Service Switch configuration file. <br />
<br />
This file determines lookup order of services. For example, to match a name<br />
to an IP address, an entry can be put into the /etc/hosts file. Or a DNS query<br />
can be made. What's the order? Normally, it's the entry in the /etc/hosts file.<br />
because /etc/nsswitch.conf contains the following setting<br />
<br />
hosts: files dns<br />
<br />
<br />
See man nsswitch.conf for more settings.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
THE FOLLOWING SECTIONS STARTS THE PROGRAMMING TIPS<br />
<br />
PROGRAMMING TIP 1:<br />
<br />
Simple open command that restarts the close if a signal<br />
occurs. Also note, the POSIX standards committee decided<br />
all new functions would not use errno and would instead<br />
directly return the error number in the function.<br />
<br />
A lot of functions return -1 on an error condition, then,<br />
set errno to the value of the error. This will still work<br />
for all the well known functions; but, it's changing.<br />
<br />
/* start of code open.c<br />
Compile gcc -o open open.c<br />
<br />
Reference (Look for simple_but_common_x.x.x.tar.gz):<br />
http://sourceforge.net/project/showfiles.php?group_id=79066<br />
<br />
*/<br />
#include <stdio.h><br />
#include <unistd.h><br />
#include <sys/types.h><br />
#include <sys/stat.h><br />
#include <fcntl.h><br />
#include <stdlib.h><br />
<br />
#include <string.h> /* for strerror(int errno) */<br />
#include <errno.h><br />
<br />
#define BUFLEN 100<br />
extern int errno;<br />
<br />
<br />
int<br />
main (void)<br />
{<br />
int fp,error;<br />
char buf[BUFLEN+1];<br />
<br />
if ((fp = open ("data", O_RDWR | O_CREAT, 0600)) == -1)<br />
{<br />
fprintf (stderr, "Can't open data: %s\n", strerror (errno));<br />
return 1;<br />
}<br />
<br />
snprintf (buf, BUFLEN, "123");<br />
write (fp, buf, strlen (buf));<br />
<br />
// Restart close should a signal occur */<br />
while((( error = close (fp) ) == -1) && (errno == EINTR));<br />
if(error == -1)<br />
perror("Failed to close the file\n");<br />
<br />
return 0;<br />
}<br />
/* end of open.c */<br />
<br />
<br />
<br />
PROGRAMMING TIP 2:<br />
<br />
Example of setting the effective UID on a file<br />
<br />
/* start of code<br />
gcc uid_open.c -o uid_open<br />
su<br />
chown root.chirico uid_open<br />
chmod u+s uid_open<br />
exit<br />
<br />
Now you can run this as chirico and write to the<br />
root directory<br />
<br />
<br />
*/<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <sys/types.h><br />
#include <sys/stat.h><br />
#include <fcntl.h><br />
#include <string.h><br />
#include <unistd.h><br />
<br />
<br />
int main()<br />
{<br />
int fd;<br />
<br />
if ((fd = open("/root/datajunk", O_RDWR | O_CREAT, 0600)) == -1) {<br />
fprintf(stderr, "Can't open file \n");<br />
return 1;<br />
}<br />
<br />
write(fd, "0123456", strlen("0123456"));<br />
close(fd);<br />
return 0;<br />
}<br />
<br />
/* end of code */<br />
<br />
<br />
<br />
PROGRAMMING TIP 3:<br />
<br />
Writing a C http post.<br />
<br />
For downloads reference:<br />
http://prdownloads.sourceforge.net/cpearls/spider.tar.gz?download<br />
<br />
<br />
<br />
PROGRAMMING TIP 4:<br />
<br />
Writing a 2.6.x Kernel Module:<br />
<br />
Look for the latest version of "procreadwrite". This is a 2.6 kernel<br />
modules that demonstrates how to create /proc entires and write directly<br />
to user-land via tty. It's updated to reflect replacement of "current->tty"<br />
with "current->signal->tty".<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=79066<br />
<br />
<br />
<br />
PROGRAMMING TIP 5:<br />
<br />
Creating a filename with '\n'. This goes with (TIP 71)<br />
<br />
/**** topen.c ***********************************************************<br />
Filenames can be created with any character except the null character<br />
and a slash.<br />
<br />
This example creates a file with returns '\n\n'<br />
<br />
There's a way to remove a file by inode:<br />
<br />
$ ls -libt *<br />
<br />
And, once you know the inode<br />
<br />
$ find . -inum <num> -exec mv '{}' goodstuff \;<br />
<br />
or<br />
<br />
$ find . -inum <num> -exec rm '{}' goodstuff \;<br />
<br />
or<br />
<br />
$ find . -inum <num> -exec cat '{}' \;<br />
<br />
<br />
<br />
Compile:<br />
<br />
gcc -o topen -Wall -W -O2 -s -pipe topen.c<br />
<br />
Reference:<br />
http://prdownloads.sourceforge.net/cpearls/simple_but_common_0.0.14.tar.gz?download<br />
<br />
*/<br />
#include <stdio.h><br />
#include <unistd.h><br />
#include <sys/types.h><br />
#include <sys/stat.h><br />
#include <fcntl.h><br />
#include <stdlib.h><br />
<br />
#include <string.h> /* for strerror(int errno) */<br />
#include <errno.h><br />
<br />
#define BUFLEN 100<br />
extern int errno;<br />
<br />
<br />
int<br />
main (void)<br />
{<br />
int fp,error;<br />
char buf[BUFLEN+1];<br />
<br />
if ((fp = open ("\n\n\n\n\n\n\n\n\n", O_RDWR | O_CREAT, 0600)) == -1)<br />
{<br />
fprintf (stderr, "Can't open data: %s\n", strerror (errno));<br />
return 1;<br />
}<br />
<br />
snprintf (buf, BUFLEN, "123");<br />
write (fp, buf, strlen (buf));<br />
<br />
// Restart close should a signal occur */<br />
while((( error = close (fp) ) == -1) && (errno == EINTR));<br />
if(error == -1)<br />
perror("Failed to close the file\n");<br />
<br />
return 0;<br />
<br />
}<br />
<br />
<br />
<br />
<br />
<br />
**Note, if you want email notification after every 50 new tips have been<br />
added, then, click on the following link:<br />
<br />
https://sourceforge.net/project/filemodule_monitor.php?filemodule_id=120838<br />
<br />
<br />
<br />
PROGRAMMING TIP 6:<br />
<br />
Working With The Lemon Parser Generator.<br />
http://prdownloads.sourceforge.net/souptonuts/lemon_examples.tar.gz?download<br />
<br />
<br />
PROGRAMMING TIP 7:<br />
<br />
copy command for std container output.<br />
<br />
#include <iostream><br />
#include <list><br />
#include <vector><br />
#include <iterator><br />
<br />
using namespace std;<br />
int main(void)<br />
{<br />
vector<int> v;<br />
list<int> l;<br />
<br />
v.push_back(1);<br />
v.push_back(2);<br />
copy(v.begin(),v.end(),ostream_iterator<int>(cout,"\n"));<br />
<br />
<br />
l.push_back(23);<br />
l.push_back(12);<br />
copy(l.begin(),l.end(),ostream_iterator<int>(cout,"\n"));<br />
<br />
}<br />
<br />
<br />
<br />
PROGRAMMING TIP 8:<br />
<br />
/* Copyright (c) 2005 Mike Chirico mchirico@comcast.net mchirico@users.sourceforge.net<br />
<br />
<br />
Example of using virtual functions. Note the use of "initialization lists"<br />
for assinging the variable first and last.<br />
<br />
Compile:<br />
g++ -o virtualfunc -Wall -W -O2 -s -pipe virtual_function.cc<br />
<br />
Download:<br />
http://prdownloads.sourceforge.net/cpearls/simple_but_common_cpp.tar.gz?download<br />
<br />
<br />
*/<br />
<br />
#include <iostream><br />
#include <string><br />
#include <list><br />
#include <algorithm><br />
#include <iterator><br />
#include <functional><br />
<br />
<br />
using namespace std;<br />
<br />
class Employee {<br />
string first,last;<br />
public:<br />
Employee(const string& fn="John",const string& ln="Smith"): first(fn),last(ln) {}<br />
virtual void print() const {<br />
cout << "First name: " << first << ", Last name: " << last << endl;<br />
}<br />
virtual ~Employee() {}<br />
};<br />
<br />
class Manager : public Employee {<br />
int level;<br />
list<Employee*> subordinates;<br />
public:<br />
Manager(const string& fn="Ivan",const string& ln="Stedwick", int lvl=1): Employee(fn,ln), level(lvl) {}<br />
void print() {<br />
cout << "Manager level: " << level << " ";<br />
Employee::print();<br />
cout << "Supervises:" << endl;<br />
for_each(subordinates.begin(),subordinates.end(),mem_fun(&Employee::print));<br />
cout << endl << endl;<br />
}<br />
void addstaff(Employee& staff){<br />
subordinates.push_front(&staff);<br />
}<br />
void addstaff(Employee* staff){<br />
subordinates.push_front(staff);<br />
}<br />
<br />
};<br />
<br />
<br />
int main()<br />
{<br />
Employee p0("Lisa","Payne");<br />
Manager m0;<br />
<br />
m0.addstaff(new Employee("Zoe","Bear")); /* uses void addstaff(Employee* staff) */<br />
m0.addstaff(new Employee("Leah","Bopper"));<br />
m0.addstaff(new Employee("Abby","Chicken"));<br />
m0.addstaff(p0); /* void addstaff(Employee& staff) needed for this one */<br />
m0.addstaff(new Employee());<br />
m0.print();<br />
<br />
<br />
return 0;<br />
}<br />
<br />
<br />
<br />
PROGRAMMING TIP 9:<br />
<br />
/* Named Constructor Idiom.<br />
Reference: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6<br />
<br />
*/<br />
#include <iostream><br />
#include <cmath><br />
using namespace std;<br />
<br />
class Point {<br />
<br />
public:<br />
static Point rectangular(float x, float y);<br />
static Point polar(float radius, float angle);<br />
float get_x() { return x_; }<br />
float get_y() { return y_; }<br />
<br />
private:<br />
Point(float x, float y);<br />
float x_, y_;<br />
};<br />
<br />
inline Point::Point(float x, float y)<br />
: x_(x), y_(y) {}<br />
<br />
inline Point Point::rectangular(float x, float y)<br />
{ return Point(x,y); }<br />
<br />
inline Point Point::polar(float radius, float angle)<br />
{ return Point(radius*cos(angle),radius*sin(angle)); }<br />
<br />
int main(void)<br />
{<br />
Point p1 = Point::rectangular(5.7,1.2);<br />
Point p2 = Point::polar(5.7,1.2);<br />
<br />
cout << "(" << p1.get_x() << ", " << p1.get_y() << ")" << endl;<br />
cout << "(" << p2.get_x() << ", " << p2.get_y() << ")" << endl;<br />
}<br />
<br />
<br />
PROGRAMMING TIP 10:<br />
<br />
/* Copy_constructor_assignment.cc<br />
Copyright (c) 2004 GPL Mike Chirico, mchirico@comcast.net or mchirico@users.sourceforge.net<br />
<br />
Reference: "The C++ Programming Language", 3rd ed, by Stroustrup<br />
pg. 246.<br />
<br />
<br />
Download:<br />
http://prdownloads.sourceforge.net/cpearls/simple_but_common.tar.gz?download<br />
<br />
*/<br />
<br />
<br />
#include <iostream><br />
<br />
<br />
class Name {<br />
public:<br />
char* s;<br />
};<br />
<br />
<br />
class Table {<br />
Name *p;<br />
size_t sz;<br />
public:<br />
Table(size_t s=15) {<br />
p = new Name[sz=s];<br />
for(size_t i=0; i< sz; ++i) p[i].s="****";<br />
}<br />
Table(const Table &t);<br />
Table& operator=(const Table&);<br />
int prt();<br />
void asgn(char* ts,size_t index);<br />
~Table(){ delete[] p; }<br />
};<br />
<br />
<br />
<br />
Table& Table::operator=(const Table &t)<br />
{<br />
if( this != &t) {<br />
delete[] p;<br />
p = new Name[sz=t.sz];<br />
for(size_t i=0; i< t.sz; ++i) p[i]=t.p[i];<br />
}<br />
return *this;<br />
}<br />
<br />
int Table::prt()<br />
{<br />
for(size_t i=0; i< sz; ++i) std::cout << p[i].s << " ";<br />
std::cout << std::endl;<br />
return 0;<br />
}<br />
<br />
/*<br />
asgn will increase the array of strings, if needed<br />
to size index+1, and add the string ts to position<br />
index.<br />
*/<br />
void Table::asgn(char* ts,size_t index)<br />
{<br />
if(index < sz ) {<br />
p[index].s=ts;<br />
}else if ( index >= sz ){<br />
Name *tp;<br />
tp=p;<br />
<br />
p = new Name[index+1];<br />
<br />
for(size_t i=0; i< sz; ++i) p[i].s=tp[i].s;<br />
delete [] tp;<br />
for(size_t i=sz; i < index; ++i)p[i].s="****";<br />
<br />
p[index].s=ts;<br />
sz=index+1;<br />
}<br />
<br />
}<br />
<br />
int main(void)<br />
{<br />
<br />
Table t1;<br />
Table t2(5);<br />
<br />
// this is bigger than initial sz<br />
t1.asgn("myname",20);<br />
t1.prt();<br />
t2.prt();<br />
<br />
t1=t2;<br />
<br />
t1.prt();<br />
t2.prt();<br />
}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
REFERENCES:<br />
<br />
(1) http://www.tldp.org/LDP/abs/html/index.html<br />
(2) http://www.shelldorado.com/<br />
(3) http://www.faqs.org/ftp/usenet/news.answers/unix-faq/faq/part1<br />
(4) http://www-106.ibm.com/developerworks/library/l-rpm1/<br />
(5) http://www-136.ibm.com/developerworks/linux/<br />
(6) http://www.gnu.org/manual/manual.html<br />
(7) http://fedora.redhat.com/<br />
(8) http://souptonuts.sourceforge.net/chirico/index.php<br />
(9) http://www.faqs.org/faqs/<br />
(10) http://www.faqs.org/docs/linux_network/<br />
(11) http://www.tml.hut.fi/~viu/linux/sag/sag-0.6.2.html/index.html<br />
(12) http://www.yolinux.com/TUTORIALS/LinuxTutorialSysAdmin.html<br />
(13) http://sed.sourceforge.net/grabbag/scripts/<br />
<br />
<br />
SUMMARY:<br />
(1)(2)(3) Excellent resource for bash scripts.<br />
(4) rpm resource<br />
(6) GNU Manuals Online<br />
(7) Fedora<br />
(8) Authors Website<br />
(11)(12) System Admin<br />
(13) Excellent source of sed scripts<br />
<br />
<br />
HIGHLY RECOMMENDED BOOKS:<br />
<br />
"UNIX Network Programming, The Sockets Networking API", Volume 1, Third Edition.<br />
W. Richard Stevens, Bill Fenner, Andrew M. Rudoff.<br />
<br />
"UNIX Network Programming, Interprocess Communications", Volume 2, Second Edition.<br />
W. Richard Stevens.<br />
<br />
"UNIX SYSTEMS Programming, Communication, Concurrency, and Threads", Kay A. Robbins,<br />
Steven Robbins<br />
<br />
"Programming with POSIX Threads", David R. Butenhof. Addison-Wesley<br />
<br />
"The C++ Programming Language" Third Edition. Bjarne Stroustrup. Addison-Wesley.<br />
<br />
"C Programming Language" (2nd Edition), Second Edition, Kernighan and Ritchie<br />
<br />
"Advanced Linux Programming" by Mark Mitchell, Jeffrey Oldham, and Alex Samuel, of<br />
CodeSourcery LL. This book if free at the following resource:<br />
http://www.advancedlinuxprogramming.com/<br />
<br />
"Accelerated C++, Practical Programming by Example" Andrew Koenig, Barbara E. Moo.<br />
Addison-Wesley.<br />
<br />
"C: A Reference Manual", Fifth Edition, Samuel P. Harbison, Guy L. Steele.<br />
<br />
"C++ Standard Library: A Tutorial and Reference, The", Nicolai M. Josuttis. Addison Wesley.<br />
<br />
"C++ Templates: The Complete Guide", David Vandevoorde, Nicolai M. Josuttis. Addison Wesley.<br />
<br />
"Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions", Herb Sutter.<br />
Addison Wesley.<br />
<br />
"More Exceptional C++", Herb Sutter.<br />
<br />
"Exceptional C++ Style: 40 New Engineering Puzzles, Programming Problems, and Solutions",<br />
Herb Sutter. Addison Wesley.<br />
<br />
"The Art of Computer Programming (TAOCP)", Vol 1,Vol 2, Vol 3. Donald E. Knuth. Addison-Wesley.<br />
<br />
"Programming Perl, 3rd Edition", Tom Christiansen, Jon Orwant, Larry Wall. O'Reilly.<br />
http://www.unix.org.ua/orelly/perl/prog3/<br />
<br />
"Programming from the Ground Up", Jonathan Bartlett, Edited by Dominick Bruno, Jr.<br />
http://savannah.nongnu.org/download/pgubook/<br />
<br />
"Expert C Programming", Peter van der Linden, Prentice Hall PTR.<br />
<br />
<br />
"C++ Coding Standards 101 Rules, Guidelines, and Best Practices", by Herb Sutter and<br />
Andrei Alexandrescu. http://www.gotw.ca/publications/c++cs/bibliography.htm<br />
<br />
"Linux Kernel Development: A practical guide to the design and implementation of<br />
the Linux kernel", by Robert Love, Sams Publishing.<br />
<br />
"C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond", by<br />
David Abrahams and Aleksey Gurtovoy. Addison Wesley.<br />
<br />
<br />
<br />
HIGHLY RECOMMENDED: PHILOSOPHICAL<br />
<br />
"Zen and the Art of Motorcycle Maintenance: An Inquiry into Values", Robert Pirsig.<br />
http://www.virtualschool.edu/mon/Quality/PirsigZen/index.html<br />
<br />
"Lila: An Inquiry Into Morals", Robert Pirsig.<br />
<br />
<br />
<br />
RECOMMENDED BOOKS:<br />
<br />
"Structure and Interpretation of Computer Programs", Harold Abelson, Gerald Jay Sussman,<br />
Julie Sussman. This book is free:<br />
http://mitpress.mit.edu/sicp/full-text/book/book.html<br />
and<br />
http://www.gnu.org/software/mit-scheme/<br />
<br />
<br />
RECOMMENDED HOTOS:<br />
<br />
Linux Networking-HOWTO (Previously the Net-3 Howto)<br />
http://en.tldp.org/HOWTO/NET3-4-HOWTO.html<br />
<br />
<br />
<br />
<br />
<br />
<br />
CORRECTIONS:<br />
<br />
<br />
The following people made suggestions and corrections:<br />
- Jorge Fabregas <fabregasj@prtc.net> TIP 21<br />
- Malcolm Parsons <malcolm.parsons@gmail.com> TIP 44<br />
- Andreas Haunschmidt <Andreas.Haunschmidt@utanet.at> TIP 102, TIP 90<br />
- P@draigBrady.com (Following links )<br />
- Jacques.GARNIER-EXTERIEUR@EU.RHODIA.COM TIP 46<br />
<br />
http://www.pixelbeat.org/cmdline.html<br />
http://www.pixelbeat.org/rotagator/linux.tips/rotagator.fortune<br />
http://www.pixelbeat.org/scripts/<br />
<br />
- Tobias Nix <tobias.nix@gmail.com> TIP 12<br />
<br />
<br />
<br />
<br />
</nowiki></pre></div>WikiSysophttps://wiki.gacq.com/index.php?title=VirtualBox&diff=2564VirtualBox2007-10-12T12:20:56Z<p>WikiSysop: Nueva página: =Debian lenny install= To solve kernel module problem sudo aptitude install virtualbox-ose virtualbox-ose-source module-assistant sudo m-a prepare sudo m-a a-i virtualbox-ose sud...</p>
<hr />
<div><br />
=Debian lenny install=<br />
To solve kernel module problem<br />
sudo aptitude install virtualbox-ose virtualbox-ose-source module-assistant<br />
sudo m-a prepare<br />
sudo m-a a-i virtualbox-ose<br />
sudo adduser [user] vboxusers<br />
<br />
Reference: [http://swik.net/Ubuntu/Planet+Ubuntu/Aaron+Toponce:+VirtualBox+OSE+on+Debian%2FUbuntu+Linux/bpb7a Aaron Toponce: VirtualBox OSE on Debian/Ubuntu Linux]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Portada&diff=2563Portada2007-10-12T12:16:49Z<p>WikiSysop: /* General */</p>
<hr />
<div>=Conceptos básicos para principiantes=<br />
Una selección de textos en español sobre conceptos básicos acerca del uso de las tecnologías - Su lectura no requiere de conocimientos técnicos<br />
*[[Software Libre]]<br />
*[[Estandares Libres]]<br />
*[[Conocimiento Libre]]<br />
*[[DRM]]<br />
*[[Patentes de Software]]<br />
*[[Pirateria]]<br />
*[[Licencias de software]]<br />
*[[Proyecto GNU]]<br />
*[[Copyleft]]<br />
<br />
=Software=<br />
==Paquetes==<br />
===Servidores===<br />
*[[Apache]]<br />
*[[Bind]]<br />
*[[CVS]]<br />
*[[Cyrus Imap]]<br />
*[[dhcpd]]<br />
*[[Fetchmail]]<br />
*[[FTP]]<br />
*[[Jabberd]]<br />
*[[Mailman]]<br />
*[[Munin]]<br />
*[[MySQL]]<br />
*[[NFS]]<br />
*[[OpenLDAP]]<br />
*[[PostFix]]<br />
*[[ProcMail]]<br />
*[[Samba]]<br />
*[[Squid]]<br />
**[[Chpasswd]]<br />
*[[SSH]]<br />
*[[Zabbix]]<br />
*[[Xen]]<br />
<br />
===General===<br />
*[[aircrack]]<br />
*[[apt]]<br />
*[[amavis]]<br />
*[[Bash]]<br />
*[[BitTorrent]]<br />
*[[Eclipse]]<br />
*[[Flowscan]]<br />
*[[Gaim]]<br />
*[[gimp]]<br />
*[[GNOME]]<br />
*[[GnuPG]]<br />
*[[gnuplot]]<br />
*[[grep]]<br />
*[[grub]]<br />
*[[iptables]]<br />
*[[JigDo]]<br />
*[[kismet]]<br />
*[[Mozilla]]<br />
*[[Mutt]]<br />
*[[NetworkManager]]<br />
*[[Open Dental]]<br />
*[[rsync]]<br />
*[[v4l2]]<br />
*[[Vim]]<br />
*[[VirtualBox]]<br />
*[[wget]]<br />
*[[XDMCP]]<br />
*[[XGL]]<br />
*[[Xserver]]<br />
<br />
===Web===<br />
*[[drupal]]<br />
*[[DotProject]]<br />
*[[egroupware]]<br />
*[[gallery]]<br />
*[[Squirrelmail]]<br />
*[[MediaWiki]]<br />
*[[Xoops]]<br />
<br />
===Software no libre===<br />
*[[VMWare]]<br />
*[[Windows]]<br />
**[[Software Libre para Windows]]<br />
**[[Migracion desde Windows]]<br />
**[[Integracion con Windows]]<br />
**[[Microsoft Varios]]<br />
*SUN<br />
**[[Solaris]]<br />
**[[Sun One Directory Server]]<br />
*[[Sybase]]<br />
*[[Oracle]]<br />
*[[Skype]]<br />
<br />
==Temas varios==<br />
*[[Raid por software]]<br />
*[[Análisis de tráfico]]<br />
*[[Monitoreo]]<br />
*[[Debian - Atlhon 64 bits]]<br />
*[[Comandos varios]]<br />
*[[Filesystems]]<br />
*[[Localizacion de pais]]<br />
*[[Infraestructure Management]]<br />
*[[Internet server configuration]]<br />
*[[Maquinas Chicas]]<br />
*[[Mail servers]]<br />
*[[Analisis de logs]]<br />
*[[Herramientas de diagnostico]]<br />
*[[CDs y DVDs]]<br />
*[[Protocolos a manopla]]<br />
*[[System debuging]]<br />
*[[Video]]<br />
*[[Sonido]]<br />
*[[Java]]<br />
*[[Expresiones regulares]]<br />
*[[Wake on lan]]<br />
*[[Kernel 2.6]]<br />
*[[Copiar directorios via tar y SSH]]<br />
*[[Ubuntu]]<br />
*[[Debian]]<br />
*[[Default passwords]]<br />
*[[Antispam methods]]<br />
*[[Consultorio Odontologico]]<br />
*[[Maquinas virtuales]]<br />
*[[Seguridad Informatica]]<br />
*[[Streaming]]<br />
*[[Wireless]]<br />
*[[DNS Dinamico]]<br />
*[[Bootsplash]]<br />
*[[Desktop]]<br />
*[[CRM]]<br />
*[[ERP]]<br />
*[[Electronica]]<br />
*[[VPN]]<br />
*[[Suspend - Hibernate]]<br />
*[[Virtualization]]<br />
*[[XML]]<br />
<br />
=Hardware=<br />
*[http://kmuto.jp/debian/hcl/ Debian GNU/Linux device driver check page]<br />
*[[ProveedoresHardware]]<br />
*[[Hardware roto]]<br />
==Por tipo==<br />
*[[ADSL]]<br />
*[[Cable Modem]]<br />
*[[Camaras Digitales]]<br />
*[[FireWire]]<br />
*[[Impresoras]]<br />
*[[Laptops]]<br />
*[[Modems]]<br />
*[[Monitores]]<br />
*[[Motherboards]]<br />
*[[Palm]]<br />
*[[Placas de Video]]<br />
*[[Scanners]]<br />
*[[WebCams]]<br />
*[[Dispositivos wireless]]<br />
*[[Wired network devices]]<br />
*[[PC Power Supply]]<br />
*[[Tablet PC]]<br />
<br />
=Internet=<br />
*[[Bookmarks]]<br />
*[[Sitios web problematicos]]<br />
*[[Dominios]]<br />
*[[Internet Service Providers]]<br />
<br />
=Varios=<br />
*[[Diseño Grafico]]<br />
*[[Temas generales]]<br />
<br />
*[[tmp]]<br />
*[[Linux]]<br />
<br />
==Desordenado==<br />
*[[Ordenar]]<br />
<br />
Este Wiki esta orientado hacia temas generales relacionados con tecnologías libres, principalmente en cuanto a lo que se refiere a la administracion de sistemas Debian GNU/Linux, aunque también se pueden encontrar otros temas. La información puede estar desactualizada o no ser correcta, por lo que se recomienda usarla con precaución.</div>WikiSysophttps://wiki.gacq.com/index.php?title=Laptops&diff=2545Laptops2007-07-17T21:36:01Z<p>WikiSysop: </p>
<hr />
<div>= General =<br />
*[http://www.linux-on-laptops.com/ Linux on Laptops]<br />
<br />
== Hibernate ==<br />
*[http://www.linux.com/article.pl?sid=06/05/24/1716222 How to suspend and hibernate a laptop under Linux]<br />
<br />
<br />
=Models=<br />
==Thinkpad==<br />
*http://www.thinkwiki.org<br />
<br />
==Dell==<br />
*[[Installing Debian on Dell M1210]]<br />
*[http://www.refert.com/ReWiki/HardWare/DellInspiron9400 Dell Inspiron 9400]<br />
*[http://www.laptopworldwide.com/linux/Dell.html Otras Dell]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Portada&diff=2544Portada2007-07-17T21:34:46Z<p>WikiSysop: /* Por tipo */</p>
<hr />
<div>=Conceptos básicos para principiantes=<br />
Una selección de textos en español sobre conceptos básicos acerca del uso de las tecnologías - Su lectura no requiere de conocimientos técnicos<br />
*[[Software Libre]]<br />
*[[Estandares Libres]]<br />
*[[Conocimiento Libre]]<br />
*[[DRM]]<br />
*[[Patentes de Software]]<br />
*[[Pirateria]]<br />
*[[Licencias de software]]<br />
*[[Proyecto GNU]]<br />
*[[Copyleft]]<br />
*[[Linux]]<br />
<br />
=Software=<br />
==Paquetes==<br />
===Servidores===<br />
*[[Apache]]<br />
*[[Bind]]<br />
*[[CVS]]<br />
*[[Cyrus Imap]]<br />
*[[dhcpd]]<br />
*[[Fetchmail]]<br />
*[[FTP]]<br />
*[[Jabberd]]<br />
*[[Mailman]]<br />
*[[Munin]]<br />
*[[MySQL]]<br />
*[[NFS]]<br />
*[[OpenLDAP]]<br />
*[[PostFix]]<br />
*[[ProcMail]]<br />
*[[Samba]]<br />
*[[Squid]]<br />
**[[Chpasswd]]<br />
*[[SSH]]<br />
*[[Zabbix]]<br />
*[[Xen]]<br />
<br />
===General===<br />
*[[aircrack]]<br />
*[[apt]]<br />
*[[amavis]]<br />
*[[Bash]]<br />
*[[BitTorrent]]<br />
*[[Eclipse]]<br />
*[[Flowscan]]<br />
*[[Gaim]]<br />
*[[gimp]]<br />
*[[GNOME]]<br />
*[[GnuPG]]<br />
*[[gnuplot]]<br />
*[[grep]]<br />
*[[grub]]<br />
*[[iptables]]<br />
*[[JigDo]]<br />
*[[kismet]]<br />
*[[Mozilla]]<br />
*[[Mutt]]<br />
*[[NetworkManager]]<br />
*[[Open Dental]]<br />
*[[rsync]]<br />
*[[v4l2]]<br />
*[[Vim]]<br />
*[[wget]]<br />
*[[XDMCP]]<br />
*[[XGL]]<br />
*[[Xserver]]<br />
<br />
===Web===<br />
*[[drupal]]<br />
*[[DotProject]]<br />
*[[egroupware]]<br />
*[[gallery]]<br />
*[[Squirrelmail]]<br />
*[[MediaWiki]]<br />
*[[Xoops]]<br />
<br />
===Software no libre===<br />
*[[VMWare]]<br />
*[[Windows]]<br />
**[[Software Libre para Windows]]<br />
**[[Migracion desde Windows]]<br />
**[[Integracion con Windows]]<br />
**[[Microsoft Varios]]<br />
*SUN<br />
**[[Solaris]]<br />
**[[Sun One Directory Server]]<br />
*[[Sybase]]<br />
*[[Oracle]]<br />
*[[Skype]]<br />
<br />
==Temas varios==<br />
*[[Raid por software]]<br />
*[[Análisis de tráfico]]<br />
*[[Monitoreo]]<br />
*[[Debian - Atlhon 64 bits]]<br />
*[[Comandos varios]]<br />
*[[Filesystems]]<br />
*[[Localizacion de pais]]<br />
*[[Infraestructure Management]]<br />
*[[Internet server configuration]]<br />
*[[Maquinas Chicas]]<br />
*[[Mail servers]]<br />
*[[Analisis de logs]]<br />
*[[Herramientas de diagnostico]]<br />
*[[CDs y DVDs]]<br />
*[[Protocolos a manopla]]<br />
*[[System debuging]]<br />
*[[Video]]<br />
*[[Sonido]]<br />
*[[Java]]<br />
*[[Expresiones regulares]]<br />
*[[Wake on lan]]<br />
*[[Kernel 2.6]]<br />
*[[Copiar directorios via tar y SSH]]<br />
*[[Ubuntu]]<br />
*[[Debian]]<br />
*[[Default passwords]]<br />
*[[Antispam methods]]<br />
*[[Consultorio Odontologico]]<br />
*[[Maquinas virtuales]]<br />
*[[Seguridad Informatica]]<br />
*[[Streaming]]<br />
*[[Wireless]]<br />
*[[DNS Dinamico]]<br />
*[[Bootsplash]]<br />
*[[Desktop]]<br />
*[[CRM]]<br />
*[[ERP]]<br />
*[[Electronica]]<br />
*[[VPN]]<br />
*[[Suspend - Hibernate]]<br />
*[[Virtualization]]<br />
*[[XML]]<br />
<br />
=Hardware=<br />
*[http://kmuto.jp/debian/hcl/ Debian GNU/Linux device driver check page]<br />
*[[ProveedoresHardware]]<br />
*[[Hardware roto]]<br />
==Por tipo==<br />
*[[ADSL]]<br />
*[[Cable Modem]]<br />
*[[Camaras Digitales]]<br />
*[[FireWire]]<br />
*[[Impresoras]]<br />
*[[Laptops]]<br />
*[[Modems]]<br />
*[[Monitores]]<br />
*[[Motherboards]]<br />
*[[Palm]]<br />
*[[Placas de Video]]<br />
*[[Scanners]]<br />
*[[WebCams]]<br />
*[[Dispositivos wireless]]<br />
*[[Wired network devices]]<br />
*[[PC Power Supply]]<br />
<br />
=Internet=<br />
*[[Bookmarks]]<br />
*[[Sitios web problematicos]]<br />
*[[Dominios]]<br />
*[[Internet Service Providers]]<br />
<br />
=Varios=<br />
*[[Diseño Grafico]]<br />
*[[Temas generales]]<br />
<br />
*[[tmp]]<br />
<br />
==Desordenado==<br />
*[[Ordenar]]<br />
<br />
Este Wiki esta orientado hacia temas generales relacionados con tecnologías libres, principalmente en cuanto a lo que se refiere a la administracion de sistemas Debian GNU/Linux, aunque también se pueden encontrar otros temas. La información puede estar desactualizada o no ser correcta, por lo que se recomienda usarla con precaución.</div>WikiSysophttps://wiki.gacq.com/index.php?title=Debian_Sarge_(oldstable)_to_Etch_(stable)_dist-upgrade&diff=2526Debian Sarge (oldstable) to Etch (stable) dist-upgrade2007-05-06T05:37:18Z<p>WikiSysop: /* Postfix */</p>
<hr />
<div>=Package with manual intervention required=<br />
==proftpd==<br />
<br />
<br />
==Postfix==<br />
<br />
;Message<br />
Postfix version 2.3.3-2 and later require changes in main.cf. Specifically, mydomain must be specified, since hostname(2) is not a fully-qualified domain name (FQDN).<br />
<br />
Failure to fix this will result in a broken mailer. Decline this option to abort the upgrade, giving you the opportunity to add this configuration yourself. Accept this option to automatically set mydomain based on the FQDN of the machine. <br />
Add mydomain entry in main.cf for upgrade?<br />
<br />
==Amavis==<br />
<br />
;Message<br />
Incompatible configuration file layout detected <br />
The Debian packages have changed the way they handle configuration files for amavisd-new to a better system, which uses multiple files instead of a single, monolithic file. <br />
<br />
The old amavisd-new configuration files that are still present in your system (named either /etc/amavisd.conf or /etc/amavis/amavisd.conf) are incompatible with this new config file layout. <br />
<br />
You should read /usr/share/doc/amavisd-new/README.Debian to understand the new configuration layout, and after that you should port your configuration to the new layout.<br />
<br />
For your safety, the old configuration files in your system have been disabled, and a ".disabled" postfix was added to their file names. The amavisd-new service will refuse to start until you remove (or rename) these ".disabled" files. <br />
<br />
This safety is in place to avoid starting an unconfigured amavisd-new in place of your previously configured one. Do not remove the ".disabled" files until you have read the /usr/share/doc/amavisd-new/README.Debian file and ported your old configuration to the new layout.<br />
<br />
<br />
=Re-configure on config file overwrite=<br />
==mySQL==<br />
<br />
==Apache==<br />
/etc/php4/apache2/php.ini<br />
memory_limit = 32M</div>WikiSysophttps://wiki.gacq.com/index.php?title=Debian_Sarge_(oldstable)_to_Etch_(stable)_dist-upgrade&diff=2525Debian Sarge (oldstable) to Etch (stable) dist-upgrade2007-05-06T05:37:10Z<p>WikiSysop: </p>
<hr />
<div>=Package with manual intervention required=<br />
==proftpd==<br />
<br />
<br />
==Postfix==<br />
<br />
;Message<br />
Postfix version 2.3.3-2 and later require changes in main.cf. Specifically, mydomain must be specified, since hostname(2) is not a fully-qualified domain name (FQDN).<br />
<br />
Failure to fix this will result in a broken mailer. Decline this option to abort the upgrade, giving you the opportunity to add this configuration yourself. Accept this option to automatically set mydomain based on the FQDN of the machine. <br />
Add mydomain entry in main.cf for upgrade?<br />
<br />
==Amavis==<br />
<br />
;Message<br />
Incompatible configuration file layout detected <br />
The Debian packages have changed the way they handle configuration files for amavisd-new to a better system, which uses multiple files instead of a single, monolithic file. <br />
<br />
The old amavisd-new configuration files that are still present in your system (named either /etc/amavisd.conf or /etc/amavis/amavisd.conf) are incompatible with this new config file layout. <br />
<br />
You should read /usr/share/doc/amavisd-new/README.Debian to understand the new configuration layout, and after that you should port your configuration to the new layout.<br />
<br />
For your safety, the old configuration files in your system have been disabled, and a ".disabled" postfix was added to their file names. The amavisd-new service will refuse to start until you remove (or rename) these ".disabled" files. <br />
<br />
This safety is in place to avoid starting an unconfigured amavisd-new in place of your previously configured one. Do not remove the ".disabled" files until you have read the /usr/share/doc/amavisd-new/README.Debian file and ported your old configuration to the new layout.<br />
<br />
<br />
=Re-configure on config file overwrite=<br />
==mySQL==<br />
<br />
==Apache==<br />
/etc/php4/apache2/php.ini<br />
memory_limit = 32M</div>WikiSysophttps://wiki.gacq.com/index.php?title=Debian_Sarge_(oldstable)_to_Etch_(stable)_dist-upgrade&diff=2524Debian Sarge (oldstable) to Etch (stable) dist-upgrade2007-05-06T05:34:57Z<p>WikiSysop: </p>
<hr />
<div>=Package with manual intervention required=<br />
==proftpd==<br />
<br />
<br />
==Postfix==<br />
Postfix version 2.3.3-2 and later require changes in main.cf. Specifically, mydomain must be specified, since hostname(2) is not a fully-qualified domain name (FQDN).<br />
<br />
Failure to fix this will result in a broken mailer. Decline this option to abort the upgrade, giving you the opportunity to add this configuration yourself. Accept this option to automatically set mydomain based on the FQDN of the machine. <br />
Add mydomain entry in main.cf for upgrade?<br />
<br />
==Amavis==<br />
Incompatible configuration file layout detected <br />
The Debian packages have changed the way they handle configuration files for amavisd-new to a better system, which uses multiple files instead of a single, monolithic file. <br />
<br />
The old amavisd-new configuration files that are still present in your system (named either /etc/amavisd.conf or /etc/amavis/amavisd.conf) are incompatible with this new config file layout. <br />
<br />
You should read /usr/share/doc/amavisd-new/README.Debian to understand the new configuration layout, and after that you should port your configuration to the new layout.<br />
<br />
For your safety, the old configuration files in your system have been disabled, and a ".disabled" postfix was added to their file names. The amavisd-new service will refuse to start until you remove (or rename) these ".disabled" files. <br />
<br />
This safety is in place to avoid starting an unconfigured amavisd-new in place of your previously configured one. Do not remove the ".disabled" files until you have read the /usr/share/doc/amavisd-new/README.Debian file and ported your old configuration to the new layout.<br />
<br />
<br />
=Re-configure on config file overwrite=<br />
==mySQL==<br />
<br />
==Apache==<br />
/etc/php4/apache2/php.ini<br />
memory_limit = 32M</div>WikiSysophttps://wiki.gacq.com/index.php?title=Debian_Sarge_(oldstable)_to_Etch_(stable)_dist-upgrade&diff=2523Debian Sarge (oldstable) to Etch (stable) dist-upgrade2007-05-06T05:34:28Z<p>WikiSysop: </p>
<hr />
<div>=Package with manual intervention required=<br />
==proftpd==<br />
<br />
<br />
==Postfix==<br />
Postfix version 2.3.3-2 and later require changes in main.cf. Specifically, mydomain must be specified, since hostname(2) is not a fully-qualified domain name (FQDN).<br />
<br />
Failure to fix this will result in a broken mailer. Decline this option to abort the upgrade, giving you the opportunity to add this configuration yourself. Accept this option to automatically set mydomain based on the FQDN of the machine. <br />
Add mydomain entry in main.cf for upgrade?<br />
<br />
==Amavis=<br />
Incompatible configuration file layout detected <br />
The Debian packages have changed the way they handle configuration files for amavisd-new to a better system, which uses multiple files instead of a single, monolithic file. <br />
<br />
The old amavisd-new configuration files that are still present in your system (named either /etc/amavisd.conf or /etc/amavis/amavisd.conf) are incompatible with this new config file layout. <br />
<br />
You should read /usr/share/doc/amavisd-new/README.Debian to understand the new configuration layout, and after that you should port your configuration to the new layout.<br />
<br />
For your safety, the old configuration files in your system have been disabled, and a ".disabled" postfix was added to their file names. The amavisd-new service will refuse to start until you remove (or rename) these ".disabled" files. <br />
<br />
This safety is in place to avoid starting an unconfigured amavisd-new in place of your previously configured one. Do not remove the ".disabled" files until you have read the /usr/share/doc/amavisd-new/README.Debian file and ported your old configuration to the new layout.<br />
<br />
<br />
=Re-configure on config file overwrite=<br />
==mySQL==<br />
<br />
==Apache==<br />
/etc/php4/apache2/php.ini<br />
memory_limit = 32M</div>WikiSysophttps://wiki.gacq.com/index.php?title=Debian&diff=2522Debian2007-05-06T05:34:07Z<p>WikiSysop: /* Upgrades */</p>
<hr />
<div>=Installation=<br />
Cuando estamos instalando sobre hardware nuevo podemos usar estas versiones del instalador modificadas:<br />
*[http://kmuto.jp/debian/d-i/ Backported d-i images archive]<br />
<br />
=Upgrades=<br />
*[[Debian Sarge (oldstable) to Etch (stable) dist-upgrade]]<br />
<br />
==Errors==<br />
===No common CD-ROM drive was detected.===<br />
SATA driver can block access to CD drive in installations from CD. On systems having a SATA IDE controller that also has the CD drive connected to it, you may see the installer hanging during hardware detection for the CD drive or failing to read the CD just afterwards. A possible reason is that the SATA driver (ata_piix and maybe others) is blocking access to the CD drive.<br />
You can try to work around this by booting the installer in expert mode and, in the "Detect and mount CD-ROM" step, selecting only the drivers needed for CD support. These are (ide-)generic, ide-cd and isofs.<br />
The drivers needed to access the disk will still be loaded, but at a later stage. By loading the CD drivers before the SATA driver in this way, you may be able to complete the installation. Note that CD-ROM access may still be an issue after rebooting into the installed system.<br />
<br />
<br />
==Instalando desde un drive USB==<br />
wget http://ftp.debian.org/debian/dists/testing/main/installer-i386/current/images/hd-media/boot.img.gz<br />
gzip -dc boot.img.gz >/dev/sdX<br />
init 6<br />
<br />
=Repositorios=<br />
<br />
/etc/apt/apt.conf<br />
[..]<br />
APT::Default-Release "testing";<br />
<br />
<br />
<br />
*[http://www.apt-get.org Unofficial APT repositories]<br />
<br />
*[http://www.freesoftwaremagazine.com/free_issues/issue_10/jump_to_debian/ A guide to why the Debian distro is a good choice]<br />
<br />
= Automatix para Etch =<br />
Este programa automatiza la instalación de muchas y muy útiles aplicaciones en la vida diaria de un usuario normal. Las características más importantes del programa son:<br />
<br />
*Códecs de audio y vídeo más comunes<br />
*Plugins más comunes para navegadores(Java, Flash, ...), fuentes TrueType.<br />
*Herramientas adicionales de empaquetamiento (rar y ace)<br />
*Adobe Reader y plugins del Firefox<br />
*Software de grabación de CD/DVD GnomeBaker<br />
*Instala clientes FTP para GNOME con SSH<br />
*Instala audio (Audacity) y video (Kino) y editores ID3 TAG (Easytag)<br />
*Instala ripeador de DVD (dvdrip)<br />
*Instala los plugins multimedia para Firefox y Mplayer<br />
*Instala Totem-xine y Beep Media Player (con docklet)<br />
*Habilita el menú Debian<br />
*Instala Azureus, Bittornado, Avidemux, Sun 1.5 JRE, Wine...<br />
*Herramientas de programación como Anjuta (C/C++ IDE)<br />
<br />
*http://debcentral.org/downloads/apps/dcconfig_0.4-3_i386.deb</div>WikiSysophttps://wiki.gacq.com/index.php?title=Portada&diff=2346Portada2006-12-15T18:34:01Z<p>WikiSysop: /* Software privativo */</p>
<hr />
<div>=Conceptos básicos=<br />
Una selección de textos en español sobre conceptos básicos acerca del uso de las tecnologías - Su lectura no requiere de conocimientos técnicos<br />
*[[Software Libre]]<br />
**[[Software Libre en Argentina]]<br />
**[[Software Libre en Español]]<br />
*[[Estandares Libres]]<br />
*[[Conocimiento Libre]]<br />
*[[DRM]]<br />
*[[Patentes de Software]]<br />
*[[Licencias de software]]<br />
*[[Proyecto GNU]]<br />
*[[Copyleft]]<br />
<br />
=Software=<br />
==Modulos==<br />
===Servidores===<br />
*[[Apache]]<br />
*[[Bind]]<br />
*[[CVS]]<br />
*[[Cyrus Imap]]<br />
*[[dhcpd]]<br />
*[[Fetchmail]]<br />
*[[FTP]]<br />
*[[Mailman]]<br />
*[[Munin]]<br />
*[[MySQL]]<br />
*[[NFS]]<br />
*[[OpenLDAP]]<br />
*[[PostFix]]<br />
*[[ProcMail]]<br />
*[[Samba]]<br />
*[[Squid]]<br />
*[[SSH]]<br />
*[[Zabbix]]<br />
*[[Xen]]<br />
<br />
===General===<br />
*[[aircrack]]<br />
*[[apt]]<br />
*[[amavis]]<br />
*[[Bash]]<br />
*[[BitTorrent]]<br />
*[[Eclipse]]<br />
*[[Flowscan]]<br />
*[[Gaim]]<br />
*[[gimp]]<br />
*[[GNOME]]<br />
*[[GnuPG]]<br />
*[[gnuplot]]<br />
*[[grep]]<br />
*[[grub]]<br />
*[[iptables]]<br />
*[[JigDo]]<br />
*[[kismet]]<br />
*[[Mozilla]]<br />
*[[Mutt]]<br />
*[[NetworkManager]]<br />
*[[Open Dental]]<br />
*[[rsync]]<br />
*[[v4l2]]<br />
*[[Vim]]<br />
*[[wget]]<br />
*[[XDMCP]]<br />
*[[XGL]]<br />
*[[Xserver]]<br />
<br />
===Web===<br />
*[[drupal]]<br />
*[[DotProject]]<br />
*[[egroupware]]<br />
*[[gallery]]<br />
*[[Squirrelmail]]<br />
*[[MediaWiki]]<br />
*[[Xoops]]<br />
<br />
===Software privativo===<br />
*[[VMWare]]<br />
*[[Windows]]<br />
**[[Software Libre para Windows]]<br />
**[[Migracion desde Windows]]<br />
**[[Integracion con Windows]]<br />
*[[Solaris]]<br />
*[[Sybase]]<br />
*[[Oracle]]<br />
*[[Skype]]<br />
<br />
==Temas varios==<br />
*[[Raid por software]]<br />
*[[Análisis de tráfico]]<br />
*[[Monitoreo]]<br />
*[[Debian - Atlhon 64 bits]]<br />
*[[Comandos varios]]<br />
*[[Filesystems]]<br />
*[[Localizacion de pais]]<br />
*[[Infraestructure Management]]<br />
*[[Internet server configuration]]<br />
*[[Maquinas Chicas]]<br />
*[[Mail servers]]<br />
*[[Analisis de logs]]<br />
*[[Herramientas de diagnostico]]<br />
*[[CDs y DVDs]]<br />
*[[Protocolos a manopla]]<br />
*[[System debuging]]<br />
*[[Video]]<br />
*[[Sonido]]<br />
*[[Java]]<br />
*[[Expresiones regulares]]<br />
*[[Wake on lan]]<br />
*[[Kernel 2.6]]<br />
*[[Copiar directorios via tar y SSH]]<br />
*[[Ubuntu]]<br />
*[[Debian]]<br />
*[[Default passwords]]<br />
*[[Antispam methods]]<br />
*[[Consultorio Odontologico]]<br />
*[[Maquinas virtuales]]<br />
*[[Seguridad Informatica]]<br />
*[[Streaming]]<br />
*[[Wireless]]<br />
*[[DNS Dinamico]]<br />
*[[Bootsplash]]<br />
*[[Desktop]]<br />
*[[CRM]]<br />
*[[Electronica]]<br />
*[[VPN]]<br />
<br />
=Hardware=<br />
*[http://kmuto.jp/debian/hcl/ Debian GNU/Linux device driver check page]<br />
*[[ProveedoresHardware]]<br />
*[[Hardware roto]]<br />
==Por tipo==<br />
*[[ADSL]]<br />
*[[Cable Modem]]<br />
*[[Camaras Digitales]]<br />
*[[FireWire]]<br />
*[[Impresoras]]<br />
*[[NoteBooks]]<br />
*[[Modems]]<br />
*[[Monitores]]<br />
*[[Motherboards]]<br />
*[[Palm]]<br />
*[[Placas de Video]]<br />
*[[Scanners]]<br />
*[[WebCams]]<br />
*[[Dispositivos wireless]]<br />
<br />
=Internet=<br />
*[[Bookmarks]]<br />
*[[Sitios web problematicos]]<br />
*[[Dominios]]<br />
*[[Internet Service Providers]]<br />
<br />
=Varios=<br />
*[[Diseño Grafico]]<br />
*[[Temas generales]]<br />
<br />
*[[tmp]]<br />
<br />
==Desordenado==<br />
*[[Ordenar]]<br />
<br />
Este Wiki esta orientado hacia temas generales relacionados con tecnologías libres, principalmente en cuanto a lo que se refiere a la administracion de sistemas Debian GNU/Linux, aunque también se pueden encontrar otros temas. La información puede estar desactualizada o no ser correcta, por lo que se recomienda usarla con precaución.</div>WikiSysophttps://wiki.gacq.com/index.php?title=Portada&diff=2318Portada2006-11-28T02:53:48Z<p>WikiSysop: /* Temas varios */</p>
<hr />
<div>=Conceptos básicos=<br />
Una selección de textos en español sobre conceptos básicos acerca del uso de las tecnologías - Su lectura no requiere de conocimientos técnicos<br />
*[[Software Libre]]<br />
*[[Estandares Libres]]<br />
*[[Conocimiento Libre]]<br />
*[[DRM]]<br />
*[[Patentes de Software]]<br />
*[[Licencias de software]]<br />
*[[Proyecto GNU]]<br />
*[[Copyleft]]<br />
<br />
=Software=<br />
==Modulos==<br />
===Servidores===<br />
*[[Apache]]<br />
*[[Bind]]<br />
*[[CVS]]<br />
*[[Cyrus Imap]]<br />
*[[dhcpd]]<br />
*[[Fetchmail]]<br />
*[[FTP]]<br />
*[[Mailman]]<br />
*[[Munin]]<br />
*[[MySQL]]<br />
*[[NFS]]<br />
*[[OpenLDAP]]<br />
*[[PostFix]]<br />
*[[ProcMail]]<br />
*[[Samba]]<br />
*[[Squid]]<br />
*[[SSH]]<br />
*[[Zabbix]]<br />
*[[Xen]]<br />
<br />
===General===<br />
*[[aircrack]]<br />
*[[apt]]<br />
*[[amavis]]<br />
*[[Bash]]<br />
*[[BitTorrent]]<br />
*[[Eclipse]]<br />
*[[Flowscan]]<br />
*[[Gaim]]<br />
*[[gimp]]<br />
*[[GNOME]]<br />
*[[GnuPG]]<br />
*[[gnuplot]]<br />
*[[grep]]<br />
*[[grub]]<br />
*[[iptables]]<br />
*[[JigDo]]<br />
*[[kismet]]<br />
*[[Mozilla]]<br />
*[[Mutt]]<br />
*[[NetworkManager]]<br />
*[[Open Dental]]<br />
*[[rsync]]<br />
*[[v4l2]]<br />
*[[Vim]]<br />
*[[wget]]<br />
*[[XDMCP]]<br />
*[[XGL]]<br />
*[[Xserver]]<br />
<br />
===Web===<br />
*[[drupal]]<br />
*[[DotProject]]<br />
*[[egroupware]]<br />
*[[gallery]]<br />
*[[Squirrelmail]]<br />
*[[MediaWiki]]<br />
*[[Xoops]]<br />
<br />
===Software privativo===<br />
*[[VMWare]]<br />
*[[Windows]]<br />
**[[Software Libre para Windows]]<br />
**[[Migracion desde Windows]]<br />
**[[Integracion con Windows]]<br />
*[[Solaris]]<br />
*[[Sybase]]<br />
*[[Oracle]]<br />
*[[Skype]]<br />
<br />
==Temas varios==<br />
*[[Raid por software]]<br />
*[[Análisis de tráfico]]<br />
*[[Monitoreo]]<br />
*[[Debian - Atlhon 64 bits]]<br />
*[[Comandos varios]]<br />
*[[Filesystems]]<br />
*[[Localizacion de pais]]<br />
*[[Infraestructure Management]]<br />
*[[Internet server configuration]]<br />
*[[Maquinas Chicas]]<br />
*[[Mail servers]]<br />
*[[Analisis de logs]]<br />
*[[Herramientas de diagnostico]]<br />
*[[CDs y DVDs]]<br />
*[[Protocolos a manopla]]<br />
*[[System debuging]]<br />
*[[Video]]<br />
*[[Sonido]]<br />
*[[Java]]<br />
*[[Expresiones regulares]]<br />
*[[Wake on lan]]<br />
*[[Kernel 2.6]]<br />
*[[Copiar directorios via tar y SSH]]<br />
*[[Ubuntu]]<br />
*[[Debian]]<br />
*[[Default passwords]]<br />
*[[Sistemas antispam]]<br />
*[[Consultorio Odontologico]]<br />
*[[Maquinas virtuales]]<br />
*[[Seguridad Informatica]]<br />
*[[Streaming]]<br />
*[[Wireless]]<br />
*[[DNS Dinamico]]<br />
*[[Bootsplash]]<br />
*[[Desktop]]<br />
*[[CRM]]<br />
*[[Electronica]]<br />
*[[VPN]]<br />
<br />
=Hardware=<br />
*[http://kmuto.jp/debian/hcl/ Debian GNU/Linux device driver check page]<br />
*[[ProveedoresHardware]]<br />
*[[Hardware roto]]<br />
==Por tipo==<br />
*[[ADSL]]<br />
*[[Cable Modem]]<br />
*[[Camaras Digitales]]<br />
*[[FireWire]]<br />
*[[Impresoras]]<br />
*[[NoteBooks]]<br />
*[[Modems]]<br />
*[[Monitores]]<br />
*[[Motherboards]]<br />
*[[Palm]]<br />
*[[Placas de Video]]<br />
*[[Scanners]]<br />
*[[WebCams]]<br />
*[[Dispositivos wireless]]<br />
<br />
=Internet=<br />
*[[Bookmarks]]<br />
*[[Sitios web problematicos]]<br />
*[[Dominios]]<br />
*[[Internet Service Providers]]<br />
<br />
=Varios=<br />
*[[Diseño Grafico]]<br />
*[[Temas generales]]<br />
<br />
*[[tmp]]<br />
<br />
==Desordenado==<br />
*[[Ordenar]]<br />
<br />
Este Wiki esta orientado hacia temas generales relacionados con tecnologías libres, principalmente en cuanto a lo que se refiere a la administracion de sistemas Debian GNU/Linux, aunque también se pueden encontrar otros temas. La información puede estar desactualizada o no ser correcta, por lo que se recomienda usarla con precaución.</div>WikiSysophttps://wiki.gacq.com/index.php?title=Streaming&diff=2258Streaming2006-11-04T14:02:31Z<p>WikiSysop: /* oggfwd/icecast */</p>
<hr />
<div>=Audio=<br />
==[http://www.icecast.org/ Icecast]==<br />
Icecast is a streaming media server which currently supports Ogg<br />
Vorbis and MP3 audio streams. It can be used to create an Internet<br />
radio station or a privately running jukebox and many things in<br />
between. It is very versatile in that new formats can be added<br />
relatively easily and supports open standards for commuincation and<br />
interaction.<br />
=Video=<br />
==oggfwd/icecast==<br />
*'''dvgrav''' captura la camara<br />
*'''ffmpeg2theroa''' comprime<br />
*'''oggfwd''' lo manda al icecast<br />
*'''freej''' hace todo eso pero es grafico<br />
<br />
===en la grabadora===<br />
apt-get install freej dvgrab ffmpeg2theora oggfwd<br />
<br />
;Subir al icecast<br />
dvgrab --format raw - \<br />
| ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - \<br />
| oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
;Subir al icecast y dejar un archivo local comprimido<br />
dvgrab --format raw - \<br />
| ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - \<br />
| tee capture.ogg \<br />
| oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
===en el icecast===<br />
<br />
<br />
===En las PCs clientes===<br />
;VLC<br />
*[http://www.videolan.org/doc/vls-user-guide/es/vls-user-guide-es.html Guía de usuario de VLS]<br />
*[http://www.videolan.org/doc/faq/es/videolan-faq-es.html VideoLAN FAQ]<br />
<br />
==mpeg4ip==<br />
*[http://mpeg4ip.net/ Home]<br />
**[http://mpeg4ip.sourceforge.net/documentation/index.php README]<br />
*http://redes-linux.all-inone.net/manuales/streaming/streaming_linux.pdf<br />
'''Problemas con patentes'''<br />
<br />
==Para analizar==<br />
<br />
*http://www.videolan.org/vlc/streaming.html<br />
*http://developer.apple.com/opensource/server/streaming/index.html<br />
*http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2699</div>WikiSysophttps://wiki.gacq.com/index.php?title=Streaming&diff=2257Streaming2006-11-03T21:23:46Z<p>WikiSysop: /* en la grabadora */</p>
<hr />
<div>=Audio=<br />
==[http://www.icecast.org/ Icecast]==<br />
Icecast is a streaming media server which currently supports Ogg<br />
Vorbis and MP3 audio streams. It can be used to create an Internet<br />
radio station or a privately running jukebox and many things in<br />
between. It is very versatile in that new formats can be added<br />
relatively easily and supports open standards for commuincation and<br />
interaction.<br />
=Video=<br />
==oggfwd/icecast==<br />
===en la grabadora===<br />
;Subir al icecast<br />
dvgrab --format raw - \<br />
| ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - \<br />
| oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
;Subir al icecast y dejar un archivo local comprimido<br />
dvgrab --format raw - \<br />
| ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - \<br />
| tee capture.ogg \<br />
| oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
===en el icecast===<br />
<br />
<br />
===En las PCs clientes===<br />
;VLC<br />
*[http://www.videolan.org/doc/vls-user-guide/es/vls-user-guide-es.html Guía de usuario de VLS]<br />
*[http://www.videolan.org/doc/faq/es/videolan-faq-es.html VideoLAN FAQ]<br />
<br />
==mpeg4ip==<br />
*[http://mpeg4ip.net/ Home]<br />
**[http://mpeg4ip.sourceforge.net/documentation/index.php README]<br />
*http://redes-linux.all-inone.net/manuales/streaming/streaming_linux.pdf<br />
'''Problemas con patentes'''<br />
<br />
==Para analizar==<br />
<br />
*http://www.videolan.org/vlc/streaming.html<br />
*http://developer.apple.com/opensource/server/streaming/index.html<br />
*http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2699</div>WikiSysophttps://wiki.gacq.com/index.php?title=Streaming&diff=2256Streaming2006-11-03T21:17:30Z<p>WikiSysop: /* en la grabadora */</p>
<hr />
<div>=Audio=<br />
==[http://www.icecast.org/ Icecast]==<br />
Icecast is a streaming media server which currently supports Ogg<br />
Vorbis and MP3 audio streams. It can be used to create an Internet<br />
radio station or a privately running jukebox and many things in<br />
between. It is very versatile in that new formats can be added<br />
relatively easily and supports open standards for commuincation and<br />
interaction.<br />
=Video=<br />
==oggfwd/icecast==<br />
===en la grabadora===<br />
;Subir al icecast<br />
dvgrab --format raw - \<br />
| ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - \<br />
| oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
;Subir al icecast y dejar un archivo local comprimido<br />
dvgrab --format raw - |<br />
| ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - \<br />
| tee capture.ogg \<br />
| oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
===en el icecast===<br />
<br />
<br />
===En las PCs clientes===<br />
;VLC<br />
*[http://www.videolan.org/doc/vls-user-guide/es/vls-user-guide-es.html Guía de usuario de VLS]<br />
*[http://www.videolan.org/doc/faq/es/videolan-faq-es.html VideoLAN FAQ]<br />
<br />
==mpeg4ip==<br />
*[http://mpeg4ip.net/ Home]<br />
**[http://mpeg4ip.sourceforge.net/documentation/index.php README]<br />
*http://redes-linux.all-inone.net/manuales/streaming/streaming_linux.pdf<br />
'''Problemas con patentes'''<br />
<br />
==Para analizar==<br />
<br />
*http://www.videolan.org/vlc/streaming.html<br />
*http://developer.apple.com/opensource/server/streaming/index.html<br />
*http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2699</div>WikiSysophttps://wiki.gacq.com/index.php?title=Streaming&diff=2255Streaming2006-11-03T21:16:23Z<p>WikiSysop: /* Video */</p>
<hr />
<div>=Audio=<br />
==[http://www.icecast.org/ Icecast]==<br />
Icecast is a streaming media server which currently supports Ogg<br />
Vorbis and MP3 audio streams. It can be used to create an Internet<br />
radio station or a privately running jukebox and many things in<br />
between. It is very versatile in that new formats can be added<br />
relatively easily and supports open standards for commuincation and<br />
interaction.<br />
=Video=<br />
==oggfwd/icecast==<br />
===en la grabadora===<br />
;Subir al icecast<br />
dvgrab --format raw - | ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - | oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
;Subir al icecast y dejar un archivo local comprimido<br />
dvgrab --format raw - | ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - | tee capture.ogg | oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
===en el icecast===<br />
<br />
<br />
===En las PCs clientes===<br />
;VLC<br />
*[http://www.videolan.org/doc/vls-user-guide/es/vls-user-guide-es.html Guía de usuario de VLS]<br />
*[http://www.videolan.org/doc/faq/es/videolan-faq-es.html VideoLAN FAQ]<br />
<br />
==mpeg4ip==<br />
*[http://mpeg4ip.net/ Home]<br />
**[http://mpeg4ip.sourceforge.net/documentation/index.php README]<br />
*http://redes-linux.all-inone.net/manuales/streaming/streaming_linux.pdf<br />
'''Problemas con patentes'''<br />
<br />
==Para analizar==<br />
<br />
*http://www.videolan.org/vlc/streaming.html<br />
*http://developer.apple.com/opensource/server/streaming/index.html<br />
*http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2699</div>WikiSysophttps://wiki.gacq.com/index.php?title=Streaming&diff=2254Streaming2006-11-03T21:08:46Z<p>WikiSysop: /* oggfwd/icecast */</p>
<hr />
<div>=Audio=<br />
==[http://www.icecast.org/ Icecast]==<br />
Icecast is a streaming media server which currently supports Ogg<br />
Vorbis and MP3 audio streams. It can be used to create an Internet<br />
radio station or a privately running jukebox and many things in<br />
between. It is very versatile in that new formats can be added<br />
relatively easily and supports open standards for commuincation and<br />
interaction.<br />
=Video=<br />
==oggfwd/icecast==<br />
===en la grabadora===<br />
;Subir al icecast<br />
dvgrab --format raw - | ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - | oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
;Subir al icecast y dejar un archivo local comprimido<br />
dvgrab --format raw - | ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H 11025 -o /dev/stdout - | tee capture.ogg | oggfwd gacq.com 8000 mypass /gacq.ogg<br />
<br />
===en el icecast===<br />
<br />
==mpeg4ip==<br />
*[http://mpeg4ip.net/ Home]<br />
**[http://mpeg4ip.sourceforge.net/documentation/index.php README]<br />
*http://redes-linux.all-inone.net/manuales/streaming/streaming_linux.pdf<br />
'''Problemas con patentes'''<br />
<br />
==Para analizar==<br />
<br />
*http://www.videolan.org/vlc/streaming.html<br />
*http://developer.apple.com/opensource/server/streaming/index.html<br />
*http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2699</div>WikiSysophttps://wiki.gacq.com/index.php?title=Streaming&diff=2253Streaming2006-11-03T19:08:54Z<p>WikiSysop: </p>
<hr />
<div>=Audio=<br />
==[http://www.icecast.org/ Icecast]==<br />
Icecast is a streaming media server which currently supports Ogg<br />
Vorbis and MP3 audio streams. It can be used to create an Internet<br />
radio station or a privately running jukebox and many things in<br />
between. It is very versatile in that new formats can be added<br />
relatively easily and supports open standards for commuincation and<br />
interaction.<br />
=Video=<br />
==oggfwd/icecast==<br />
dvgrab --format raw - | ffmpeg2theora -f dv -x 320 -y 240 -V 80 -a -1 -H<br />
11025 -o /dev/stdout - | oggfwd usla.org.ar 8000 sonomondo /test.ogg <br />
<br />
==mpeg4ip==<br />
*[http://mpeg4ip.net/ Home]<br />
**[http://mpeg4ip.sourceforge.net/documentation/index.php README]<br />
*http://redes-linux.all-inone.net/manuales/streaming/streaming_linux.pdf<br />
'''Problemas con patentes'''<br />
<br />
==Para analizar==<br />
<br />
*http://www.videolan.org/vlc/streaming.html<br />
*http://developer.apple.com/opensource/server/streaming/index.html<br />
*http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2699</div>WikiSysophttps://wiki.gacq.com/index.php?title=VPN&diff=2252VPN2006-11-02T21:34:10Z<p>WikiSysop: /* Installation */</p>
<hr />
<div>=vpnc=<br />
==Errors==<br />
vpnc: quick mode response rejected: ISAKMP_N_INVALID_PAYLOAD_TYPE(1)<br />
this means the concentrator did not like what we had to offer.<br />
<br />
'''Did not work trying with Cisco VPN Client'''<br />
<br />
=Cisco VPN Client=<br />
*[http://www.cs.uu.nl/technical/services/vpn/ Download site]<br />
*[http://www.cisco.com/en/US/products/sw/secursw/ps2308/products_user_guide_book09186a00802aa59f.html Cisco Official User Guide] - [http://www.cisco.com/application/pdf/en/us/guest/products/ps5982/c1629/ccmigration_09186a00805438b5.pdf PDF]<br />
==Installation==<br />
tar zxf vpnclient-linux-x86_64-4.8.00.0490-k9.tar.gz<br />
cd vpnclient<br />
./vpn_install<br />
/etc/init.d/vpnclient_init start<br />
<br />
==Configuration==<br />
cd /etc/CiscoSystemsVPNClient/Profiles<br />
cp sample.pcf gacq.pcf<br />
vi gacq.pcf<br />
vpnclient connect gacq</div>WikiSysophttps://wiki.gacq.com/index.php?title=VPN&diff=2251VPN2006-11-02T21:15:16Z<p>WikiSysop: /* Cisco VPN Client */</p>
<hr />
<div>=vpnc=<br />
==Errors==<br />
vpnc: quick mode response rejected: ISAKMP_N_INVALID_PAYLOAD_TYPE(1)<br />
this means the concentrator did not like what we had to offer.<br />
<br />
'''Did not work trying with Cisco VPN Client'''<br />
<br />
=Cisco VPN Client=<br />
*[http://www.cs.uu.nl/technical/services/vpn/ Download site]<br />
*[http://www.cisco.com/en/US/products/sw/secursw/ps2308/products_user_guide_book09186a00802aa59f.html Cisco Official User Guide] - [http://www.cisco.com/application/pdf/en/us/guest/products/ps5982/c1629/ccmigration_09186a00805438b5.pdf PDF]<br />
==Installation==<br />
tar zxf vpnclient-linux-x86_64-4.8.00.0490-k9.tar.gz<br />
cd vpnclient<br />
./vpn_install<br />
/etc/init.d/vpnclient_init start</div>WikiSysophttps://wiki.gacq.com/index.php?title=VPN&diff=2250VPN2006-11-02T21:14:26Z<p>WikiSysop: /* Cisco VPN Client */</p>
<hr />
<div>=vpnc=<br />
==Errors==<br />
vpnc: quick mode response rejected: ISAKMP_N_INVALID_PAYLOAD_TYPE(1)<br />
this means the concentrator did not like what we had to offer.<br />
<br />
'''Did not work trying with Cisco VPN Client'''<br />
<br />
=Cisco VPN Client=<br />
*[http://www.cs.uu.nl/technical/services/vpn/ Download site]<br />
*[http://www.cisco.com/en/US/products/sw/secursw/ps2308/products_user_guide_book09186a00802aa59f.html Cisco Official User Guide]<br />
==Installation==<br />
tar zxf vpnclient-linux-x86_64-4.8.00.0490-k9.tar.gz<br />
cd vpnclient<br />
./vpn_install<br />
/etc/init.d/vpnclient_init start</div>WikiSysophttps://wiki.gacq.com/index.php?title=VPN&diff=2249VPN2006-11-02T21:08:49Z<p>WikiSysop: </p>
<hr />
<div>=vpnc=<br />
==Errors==<br />
vpnc: quick mode response rejected: ISAKMP_N_INVALID_PAYLOAD_TYPE(1)<br />
this means the concentrator did not like what we had to offer.<br />
<br />
'''Did not work trying with Cisco VPN Client'''<br />
<br />
=Cisco VPN Client=<br />
==Installation==<br />
tar zxf vpnclient-linux-x86_64-4.8.00.0490-k9.tar.gz<br />
cd vpnclient<br />
./vpn_install<br />
/etc/init.d/vpnclient_init start</div>WikiSysophttps://wiki.gacq.com/index.php?title=VPN&diff=2248VPN2006-11-02T21:07:20Z<p>WikiSysop: </p>
<hr />
<div>=vpnc=<br />
==Errors==<br />
vpnc: quick mode response rejected: ISAKMP_N_INVALID_PAYLOAD_TYPE(1)<br />
this means the concentrator did not like what we had to offer.<br />
<br />
<br />
tar zxf vpnclient-linux-x86_64-4.8.00.0490-k9.tar.gz<br />
cd vpnclient<br />
./vpn_install<br />
/etc/init.d/vpnclient_init start</div>WikiSysophttps://wiki.gacq.com/index.php?title=VPN&diff=2247VPN2006-11-02T20:57:52Z<p>WikiSysop: </p>
<hr />
<div><br />
=vpnc=<br />
==Errors==<br />
vpnc: quick mode response rejected: ISAKMP_N_INVALID_PAYLOAD_TYPE(1)<br />
this means the concentrator did not like what we had to offer.</div>WikiSysophttps://wiki.gacq.com/index.php?title=Portada&diff=2246Portada2006-11-02T20:42:59Z<p>WikiSysop: /* Temas varios */</p>
<hr />
<div>=Conceptos básicos=<br />
Una selección de textos en español sobre conceptos básicos acerca del uso de las tecnologías - Su lectura no requiere de conocimientos técnicos<br />
*[[Software Libre]]<br />
*[[Estandares Libres]]<br />
*[[Conocimiento Libre]]<br />
*[[DRM]]<br />
*[[Patentes de Software]]<br />
*[[Licencias de software]]<br />
*[[Proyecto GNU]]<br />
*[[Copyleft]]<br />
<br />
=Software=<br />
==Modulos==<br />
===Servidores===<br />
*[[Apache]]<br />
*[[Bind]]<br />
*[[CVS]]<br />
*[[Cyrus Imap]]<br />
*[[dhcpd]]<br />
*[[Fetchmail]]<br />
*[[FTP]]<br />
*[[Mailman]]<br />
*[[Munin]]<br />
*[[MySQL]]<br />
*[[NFS]]<br />
*[[OpenLDAP]]<br />
*[[PostFix]]<br />
*[[ProcMail]]<br />
*[[Samba]]<br />
*[[Squid]]<br />
*[[SSH]]<br />
*[[Zabbix]]<br />
*[[Xen]]<br />
<br />
===General===<br />
*[[aircrack]]<br />
*[[apt]]<br />
*[[amavis]]<br />
*[[Bash]]<br />
*[[BitTorrent]]<br />
*[[Eclipse]]<br />
*[[Flowscan]]<br />
*[[Gaim]]<br />
*[[gimp]]<br />
*[[GNOME]]<br />
*[[GnuPG]]<br />
*[[grep]]<br />
*[[grub]]<br />
*[[iptables]]<br />
*[[JigDo]]<br />
*[[kismet]]<br />
*[[Mozilla]]<br />
*[[Mutt]]<br />
*[[NetworkManager]]<br />
*[[Open Dental]]<br />
*[[rsync]]<br />
*[[v4l2]]<br />
*[[Vim]]<br />
*[[wget]]<br />
*[[XDMCP]]<br />
*[[XGL]]<br />
*[[Xserver]]<br />
<br />
===Web===<br />
*[[drupal]]<br />
*[[DotProject]]<br />
*[[egroupware]]<br />
*[[gallery]]<br />
*[[Squirrelmail]]<br />
*[[MediaWiki]]<br />
*[[Xoops]]<br />
<br />
===Software privativo===<br />
*[[VMWare]]<br />
*[[Windows]]<br />
**[[Software Libre para Windows]]<br />
**[[Migracion desde Windows]]<br />
**[[Integracion con Windows]]<br />
*[[Solaris]]<br />
*[[Sybase]]<br />
*[[Oracle]]<br />
*[[Skype]]<br />
<br />
==Temas varios==<br />
*[[Raid por software]]<br />
*[[Análisis de tráfico]]<br />
*[[Monitoreo]]<br />
*[[Debian - Atlhon 64 bits]]<br />
*[[Comandos varios]]<br />
*[[Filesystems]]<br />
*[[Localizacion de pais]]<br />
*[[Infraestructure Management]]<br />
*[[Internet server configuration]]<br />
*[[Maquinas Chicas]]<br />
*[[Mail servers]]<br />
*[[Analisis de logs]]<br />
*[[Herramientas de diagnostico]]<br />
*[[CDs y DVDs]]<br />
*[[Protocolos a manopla]]<br />
*[[System debuging]]<br />
*[[Video]]<br />
*[[Sonido]]<br />
*[[Java]]<br />
*[[Expresiones regulares]]<br />
*[[Wake on lan]]<br />
*[[Kernel 2.6]]<br />
*[[Copiar directorios via tar y SSH]]<br />
*[[Ubuntu]]<br />
*[[Debian]]<br />
*[[Default passwords]]<br />
*[[Sistemas antispam]]<br />
*[[Consultorio Odontologico]]<br />
*[[Maquinas virtuales]]<br />
*[[Seguridad Informatica]]<br />
*[[Streaming]]<br />
*[[Wireless]]<br />
*[[DNS Dinamico]]<br />
*[[Bootsplash]]<br />
*[[Desktop]]<br />
*[[CRM]]<br />
*[[Electronica]]<br />
*[[spam]]<br />
*[[VPN]]<br />
<br />
=Hardware=<br />
*[http://kmuto.jp/debian/hcl/ Debian GNU/Linux device driver check page]<br />
*[[ProveedoresHardware]]<br />
*[[Hardware roto]]<br />
==Por tipo==<br />
*[[ADSL]]<br />
*[[Cable Modem]]<br />
*[[Camaras Digitales]]<br />
*[[FireWire]]<br />
*[[Impresoras]]<br />
*[[NoteBooks]]<br />
*[[Modems]]<br />
*[[Monitores]]<br />
*[[Motherboards]]<br />
*[[Palm]]<br />
*[[Placas de Video]]<br />
*[[Scanners]]<br />
*[[WebCams]]<br />
*[[Dispositivos wireless]]<br />
<br />
=Internet=<br />
*[[Bookmarks]]<br />
*[[Sitios web problematicos]]<br />
*[[Dominios]]<br />
*[[Internet Service Providers]]<br />
<br />
=Varios=<br />
*[[Diseño Grafico]]<br />
*[[Temas generales]]<br />
<br />
*[[tmp]]<br />
<br />
==Desordenado==<br />
*[[Ordenar]]<br />
<br />
Este Wiki esta orientado hacia temas generales relacionados con tecnologías libres, principalmente en cuanto a lo que se refiere a la administracion de sistemas Debian GNU/Linux, aunque también se pueden encontrar otros temas. La información puede estar desactualizada o no ser correcta, por lo que se recomienda usarla con precaución.</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2245Installing Debian on Dell M12102006-11-02T12:29:39Z<p>WikiSysop: /* Summary */</p>
<hr />
<div>'''This guide is not completed, feel free to update it if you have more information'''<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || Download driver: linux-uvc<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:grey" | not tested ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || working for other people<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || working for other people<br />
|-<br />
! S-Video output || style="background:green" | Works ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:green" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:yellow" | Works with some work || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
==Details==<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build<br />
<br />
=Base installation=<br />
<br />
==Using Daily Build (I have used this)==<br />
Today, dailybuild Debian installer CD has solved SATA & CD problem<br />
<br />
==Using Debian Installer Etch beta 3 release==<br />
Error message:<br />
No common CD-ROM drive was detected.<br />
SATA driver can block access to CD drive in installations from CD. On systems having a SATA IDE controller that also has the CD drive connected to it, you may see the installer hanging during hardware detection for the CD drive or failing to read the CD just afterwards. A possible reason is that the SATA driver (ata_piix and maybe others) is blocking access to the CD drive.<br />
You can try to work around this by booting the installer in expert mode and, in the "Detect and mount CD-ROM" step, selecting only the drivers needed for CD support. These are (ide-)generic, ide-cd and isofs.<br />
The drivers needed to access the disk will still be loaded, but at a later stage. By loading the CD drivers before the SATA driver in this way, you may be able to complete the installation. Note that CD-ROM access may still be an issue after rebooting into the installed system.<br />
===Booting debian netinst from USB drive===<br />
The workaround I used is to boot from a USB stick (don't worry you will get your CDROM working later).<br />
<pre><nowiki><br />
wget http://ftp.debian.org/debian/dists/testing/\<br />
main/installer-i386/current/images/hd-media/boot.img.gz<br />
gzip -dc boot.img.gz >/dev/sdX<br />
</nowiki></pre><br />
Enable USB drive boot from BIOS setup, and then Install Debian base system as usual.<br />
<br />
===Using kernel boot parameters===<br />
(Not checked)<br />
You can append libata.atapi_enabled=1 to the install or expert command lines at the boot prompt to get your cdrom detected and then be able to install from it.<br />
<br />
=Configuration=<br />
==APT==<br />
/etc/apt/sources.list<br />
deb http://mirrors.kernel.org/debian/ testing main contrib non-free<br />
deb http://mirrors.kernel.org/debian/ unstable main contrib non-free<br />
deb http://security.debian.org/ testing/updates main contrib non-free<br />
deb http://www.debian-multimedia.org/ testing main<br />
deb http://www.debian-multimedia.org/ sid main<br />
<br />
/etc/apt/apt.conf<br />
[..]<br />
APT::Default-Release "testing";<br />
<br />
Upgrade base system<br />
apt-get update<br />
apt-get upgrade<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Installing nvidia drivers==<br />
===Pre-compiled driver if you install a linux-image===<br />
apt-get install nvidia-kernel-2.6.1x-1-686-smp<br />
apt-get install nvidia-glx nvidia-settings<br />
<br />
===Build your own nvidia driver if you have builded your kernel===<br />
apt-get install nvidia-kernel-source nvidia-kernel-common<br />
cd /usr/src<br />
tar xvzf nvidia-kernel-source.tar.gz<br />
cd linux-source-2.6.18<br />
make-kpkg --revision gacq01 modules_image<br />
cd ..<br />
dpkg -i nvidia-kernel-2.6.18_1.0.8776-1+gacq01_i386.deb<br />
apt-get install nvidia-glx nvidia-settings<br />
<br />
More info in:<br />
*http://wiki.debian.org/NvidiaGraphicsDrivers<br />
*http://www.leonscape.co.uk/linux/how2-nvg4.html<br />
*http://taliesin.wordpress.com/linux-kernel-custom-compile-the-debian-way/<br />
*http://wiki.clug.org.za/wiki/How_do_I_compile_my_own_kernel_into_a_deb%3F<br />
<br />
==Configuration==<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
1. Downloads<br />
<br />
'''driver''' from http://ipw3945.sourceforge.net/ for example<br />
wget http://ufpr.dl.sourceforge.net/sourceforge/ipw3945/ipw3945-1.1.0.tgz<br />
<br />
'''ieee80211 subsystem''' from http://ieee80211.sourceforge.net/ for example<br />
wget http://ufpr.dl.sourceforge.net/sourceforge/ieee80211/ieee80211-1.2.15.tgz<br />
<br />
'''firmware''' from http://bughost.org/ipw3945/ for example<br />
wget http://bughost.org/ipw3945/ucode/ipw3945-ucode-1.13.tgz<br />
<br />
'''regulatory daemon''' from http://bughost.org/ipw3945/ for example<br />
wget http://bughost.org/ipw3945/daemon/ipw3945d-1.7.22.tgz<br />
<br />
2. Install these modules ONLY if you didn't compile your own kernel<br />
apt-get install linux-headers-2.6.1x-1-686-smp<br />
apt-get install gcc-4.0<br />
<br />
3. Complile and install modules<br />
tar -zxvf ieee80211-1.2.15.tgz<br />
cd ieee80211-1.2.15<br />
make<br />
make install<br />
cd ..<br />
tar -zxvf ipw3945-1.1.0.tgz<br />
cd ipw3945-1.1.0<br />
# if you have problems here see notes<br />
make<br />
cd ..<br />
tar zxvf ipw3945-ucode-1.13.tgz<br />
mkdir /usr/local/lib/firmware/<br />
cp ipw3945-ucode-1.13/ipw3945.ucode /usr/local/lib/firmware/<br />
tar zxvf ipw3945d-1.7.22.tgz<br />
cp ipw3945d-1.7.22/x86/ipw3945d /sbin/ipw3945d-$(uname -r)<br />
cd ipw3945-1.1.0<br />
cp ipw3945.ko /lib/modules/$(uname -r)<br />
depmod -a<br />
<br />
4. /etc/init.d/ipw3945 <br />
#!/bin/bash<br />
<br />
case $1 in<br />
start)<br />
echo -n "Load ipw3945:"<br />
modprobe -i ipw3945<br />
/sbin/ipw3945d-$(uname -r) --timeout=30<br />
sleep 2<br />
echo " done."<br />
;;<br />
<br />
stop)<br />
echo -n "Unloading ipw3945:"<br />
/sbin/ipw3945d-$(uname -r) --kill<br />
modprobe -ir ipw3945<br />
sleep 2<br />
echo " done."<br />
;;<br />
esac<br />
<br />
exit 0<br />
<br />
chmod 755 /etc/init.d/ipw3945<br />
<br />
5. Enable start on boot<br />
update-rc.d ipw3945 defaults 30<br />
<br />
6. /etc/network/interfaces<br />
auto eth2<br />
iface eth2 inet dhcp<br />
<br />
Notes:<br />
*If your are planning to use your wireless interface in monitor mode, for example to use kismet, uncomment "CONFIG_IPW3945_MONITOR=y" from the driver Makefile before running make.<br />
*If you have error: "too few arguments to function ‘ieee80211_tx_frame’" problems compiling ipw3945-1.1.0 with 2.6.18 kernel. ipw does not properly recognize the version of ieee802.11 stuff in the kernel. A quick hack is to change "EXTRA_CFLAGS += -DIEEE80211_API_VERSION=$(IEEE80211_API)" to "EXTRA_CFLAGS += -DIEEE80211_API_VERSION=2" on line 96 of Makefile. (http://dotcommie.net/projects/XPS-M1210/)<br />
<br />
'''References'''<br />
*http://eomer.mine.nu/?q=node/18<br />
*http://alidhaey.blogspot.com/2006/08/instalar-debian-etch-en-un-dell.html<br />
*http://math.umh.ac.be/an/D820/#Wireless<br />
<br />
=WebCam=<br />
==Using uvcvideo - Only work with v4l2==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
'''Webcam test'''<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20060706.tar.gz<br />
tar -xvf luvcview-20060706.tar.gz<br />
cd luvcview-20060706<br />
make<br />
./luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
**[http://www.linuxant.com/drivers/hsf/full/archive/hsfmodem-7.47.00.01full/hsfmodem_7.47.00.01full_k2.6.15_26_686_ubuntu_i386.deb.zip Download propietary Dapper 2.6.15-26-686 driver]<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
dpkg -i hsfmodem_{version}_{arch}.deb<br />
if necessary, run "hsfconfig" to complete the installation, enter license information, or to change your modem's configuration.<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
Cambiar en /etc/default/acpi-support<br />
<pre><nowiki><br />
ACPI_SLEEP=true<br />
#ACPI_HIBERNATE=true<br />
ENABLE_LAPTOP_MODE=true<br />
</nowiki></pre><br />
<br />
=Specifications=<br />
==Detected by preinstaled windows==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2244Installing Debian on Dell M12102006-11-02T12:29:20Z<p>WikiSysop: /* Summary */</p>
<hr />
<div>'''This guide is not completed, feel free to update it if you have more information'''<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || Download driver: linux-uvc<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:grey" | not tested ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || working for other people<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || working for other people<br />
|-<br />
! S-Video output || style="background:green" | Works | ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:green" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:yellow" | Works with some work || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
==Details==<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build<br />
<br />
=Base installation=<br />
<br />
==Using Daily Build (I have used this)==<br />
Today, dailybuild Debian installer CD has solved SATA & CD problem<br />
<br />
==Using Debian Installer Etch beta 3 release==<br />
Error message:<br />
No common CD-ROM drive was detected.<br />
SATA driver can block access to CD drive in installations from CD. On systems having a SATA IDE controller that also has the CD drive connected to it, you may see the installer hanging during hardware detection for the CD drive or failing to read the CD just afterwards. A possible reason is that the SATA driver (ata_piix and maybe others) is blocking access to the CD drive.<br />
You can try to work around this by booting the installer in expert mode and, in the "Detect and mount CD-ROM" step, selecting only the drivers needed for CD support. These are (ide-)generic, ide-cd and isofs.<br />
The drivers needed to access the disk will still be loaded, but at a later stage. By loading the CD drivers before the SATA driver in this way, you may be able to complete the installation. Note that CD-ROM access may still be an issue after rebooting into the installed system.<br />
===Booting debian netinst from USB drive===<br />
The workaround I used is to boot from a USB stick (don't worry you will get your CDROM working later).<br />
<pre><nowiki><br />
wget http://ftp.debian.org/debian/dists/testing/\<br />
main/installer-i386/current/images/hd-media/boot.img.gz<br />
gzip -dc boot.img.gz >/dev/sdX<br />
</nowiki></pre><br />
Enable USB drive boot from BIOS setup, and then Install Debian base system as usual.<br />
<br />
===Using kernel boot parameters===<br />
(Not checked)<br />
You can append libata.atapi_enabled=1 to the install or expert command lines at the boot prompt to get your cdrom detected and then be able to install from it.<br />
<br />
=Configuration=<br />
==APT==<br />
/etc/apt/sources.list<br />
deb http://mirrors.kernel.org/debian/ testing main contrib non-free<br />
deb http://mirrors.kernel.org/debian/ unstable main contrib non-free<br />
deb http://security.debian.org/ testing/updates main contrib non-free<br />
deb http://www.debian-multimedia.org/ testing main<br />
deb http://www.debian-multimedia.org/ sid main<br />
<br />
/etc/apt/apt.conf<br />
[..]<br />
APT::Default-Release "testing";<br />
<br />
Upgrade base system<br />
apt-get update<br />
apt-get upgrade<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Installing nvidia drivers==<br />
===Pre-compiled driver if you install a linux-image===<br />
apt-get install nvidia-kernel-2.6.1x-1-686-smp<br />
apt-get install nvidia-glx nvidia-settings<br />
<br />
===Build your own nvidia driver if you have builded your kernel===<br />
apt-get install nvidia-kernel-source nvidia-kernel-common<br />
cd /usr/src<br />
tar xvzf nvidia-kernel-source.tar.gz<br />
cd linux-source-2.6.18<br />
make-kpkg --revision gacq01 modules_image<br />
cd ..<br />
dpkg -i nvidia-kernel-2.6.18_1.0.8776-1+gacq01_i386.deb<br />
apt-get install nvidia-glx nvidia-settings<br />
<br />
More info in:<br />
*http://wiki.debian.org/NvidiaGraphicsDrivers<br />
*http://www.leonscape.co.uk/linux/how2-nvg4.html<br />
*http://taliesin.wordpress.com/linux-kernel-custom-compile-the-debian-way/<br />
*http://wiki.clug.org.za/wiki/How_do_I_compile_my_own_kernel_into_a_deb%3F<br />
<br />
==Configuration==<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
1. Downloads<br />
<br />
'''driver''' from http://ipw3945.sourceforge.net/ for example<br />
wget http://ufpr.dl.sourceforge.net/sourceforge/ipw3945/ipw3945-1.1.0.tgz<br />
<br />
'''ieee80211 subsystem''' from http://ieee80211.sourceforge.net/ for example<br />
wget http://ufpr.dl.sourceforge.net/sourceforge/ieee80211/ieee80211-1.2.15.tgz<br />
<br />
'''firmware''' from http://bughost.org/ipw3945/ for example<br />
wget http://bughost.org/ipw3945/ucode/ipw3945-ucode-1.13.tgz<br />
<br />
'''regulatory daemon''' from http://bughost.org/ipw3945/ for example<br />
wget http://bughost.org/ipw3945/daemon/ipw3945d-1.7.22.tgz<br />
<br />
2. Install these modules ONLY if you didn't compile your own kernel<br />
apt-get install linux-headers-2.6.1x-1-686-smp<br />
apt-get install gcc-4.0<br />
<br />
3. Complile and install modules<br />
tar -zxvf ieee80211-1.2.15.tgz<br />
cd ieee80211-1.2.15<br />
make<br />
make install<br />
cd ..<br />
tar -zxvf ipw3945-1.1.0.tgz<br />
cd ipw3945-1.1.0<br />
# if you have problems here see notes<br />
make<br />
cd ..<br />
tar zxvf ipw3945-ucode-1.13.tgz<br />
mkdir /usr/local/lib/firmware/<br />
cp ipw3945-ucode-1.13/ipw3945.ucode /usr/local/lib/firmware/<br />
tar zxvf ipw3945d-1.7.22.tgz<br />
cp ipw3945d-1.7.22/x86/ipw3945d /sbin/ipw3945d-$(uname -r)<br />
cd ipw3945-1.1.0<br />
cp ipw3945.ko /lib/modules/$(uname -r)<br />
depmod -a<br />
<br />
4. /etc/init.d/ipw3945 <br />
#!/bin/bash<br />
<br />
case $1 in<br />
start)<br />
echo -n "Load ipw3945:"<br />
modprobe -i ipw3945<br />
/sbin/ipw3945d-$(uname -r) --timeout=30<br />
sleep 2<br />
echo " done."<br />
;;<br />
<br />
stop)<br />
echo -n "Unloading ipw3945:"<br />
/sbin/ipw3945d-$(uname -r) --kill<br />
modprobe -ir ipw3945<br />
sleep 2<br />
echo " done."<br />
;;<br />
esac<br />
<br />
exit 0<br />
<br />
chmod 755 /etc/init.d/ipw3945<br />
<br />
5. Enable start on boot<br />
update-rc.d ipw3945 defaults 30<br />
<br />
6. /etc/network/interfaces<br />
auto eth2<br />
iface eth2 inet dhcp<br />
<br />
Notes:<br />
*If your are planning to use your wireless interface in monitor mode, for example to use kismet, uncomment "CONFIG_IPW3945_MONITOR=y" from the driver Makefile before running make.<br />
*If you have error: "too few arguments to function ‘ieee80211_tx_frame’" problems compiling ipw3945-1.1.0 with 2.6.18 kernel. ipw does not properly recognize the version of ieee802.11 stuff in the kernel. A quick hack is to change "EXTRA_CFLAGS += -DIEEE80211_API_VERSION=$(IEEE80211_API)" to "EXTRA_CFLAGS += -DIEEE80211_API_VERSION=2" on line 96 of Makefile. (http://dotcommie.net/projects/XPS-M1210/)<br />
<br />
'''References'''<br />
*http://eomer.mine.nu/?q=node/18<br />
*http://alidhaey.blogspot.com/2006/08/instalar-debian-etch-en-un-dell.html<br />
*http://math.umh.ac.be/an/D820/#Wireless<br />
<br />
=WebCam=<br />
==Using uvcvideo - Only work with v4l2==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
'''Webcam test'''<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20060706.tar.gz<br />
tar -xvf luvcview-20060706.tar.gz<br />
cd luvcview-20060706<br />
make<br />
./luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
**[http://www.linuxant.com/drivers/hsf/full/archive/hsfmodem-7.47.00.01full/hsfmodem_7.47.00.01full_k2.6.15_26_686_ubuntu_i386.deb.zip Download propietary Dapper 2.6.15-26-686 driver]<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
dpkg -i hsfmodem_{version}_{arch}.deb<br />
if necessary, run "hsfconfig" to complete the installation, enter license information, or to change your modem's configuration.<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
Cambiar en /etc/default/acpi-support<br />
<pre><nowiki><br />
ACPI_SLEEP=true<br />
#ACPI_HIBERNATE=true<br />
ENABLE_LAPTOP_MODE=true<br />
</nowiki></pre><br />
<br />
=Specifications=<br />
==Detected by preinstaled windows==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Installing_Debian_on_Dell_M1210&diff=2243Installing Debian on Dell M12102006-11-01T13:11:06Z<p>WikiSysop: /* Wireless interface */</p>
<hr />
<div>'''This guide is not completed, feel free to update it if you have more information'''<br />
<br />
=Summary=<br />
{| border="1" align="center"<br />
|+ Summary <br />
! Component !! Status !! Comments<br />
|-<br />
! Camera || style="background:yellow" | Works || Download driver: linux-uvc<br />
|-<br />
! Card reader || style="background:yellow" | Need more research || kernel patch? MMC dot work?<br />
|-<br />
! CD/DVD || style="background:green" | Works || parameter at boot?<br />
|-<br />
! Dual Core CPU || style="background:green" | Works || Install smp kernel<br />
|-<br />
! Ethernet || style="background:green" | Works || out of the box<br />
|-<br />
! Firewire || style="background:grey" | not tested ||<br />
|-<br />
! Media Butoms || style="background:green" | Works || out of the box<br />
|-<br />
! Modem || style="background:orange" | not tested, but... || Propietary driver limit modem to 14.4Kb<br />
|-<br />
! SATA Disk || style="background:green" | Works || out of the box<br />
|-<br />
! Sound || style="background:green" | Works || out of the box<br />
|-<br />
! Suspend to RAM || style="background:grey" | Need more research || Some problems reported for 2.6.16<br />
|-<br />
! Suspen to disk || style="background:grey" | Need more research || Some problems reported for 2.6.16<br />
|-<br />
! S-Video output || style="background:grey" | not tested ||<br />
|-<br />
! Touchpad || style="background:green" | Works || out of the box<br />
|-<br />
! USB || style="background:green" | Works || out of the box<br />
|-<br />
! VGA Port || style="background:grey" | Works || <br />
|-<br />
! Video (NVIDIA) || style="background:green" | Works || free and propietary driver<br />
|-<br />
! Wireless || style="background:yellow" | Works with some work || Download driver: ipw3945<br />
|-<br />
|}<br />
<br />
==Details==<br />
*Debian GNU/Linux Etch (testing) Daily Build Debian Installer<br />
*kernel 2.6.18-3 - Custom build<br />
<br />
=Base installation=<br />
<br />
==Using Daily Build (I have used this)==<br />
Today, dailybuild Debian installer CD has solved SATA & CD problem<br />
<br />
==Using Debian Installer Etch beta 3 release==<br />
Error message:<br />
No common CD-ROM drive was detected.<br />
SATA driver can block access to CD drive in installations from CD. On systems having a SATA IDE controller that also has the CD drive connected to it, you may see the installer hanging during hardware detection for the CD drive or failing to read the CD just afterwards. A possible reason is that the SATA driver (ata_piix and maybe others) is blocking access to the CD drive.<br />
You can try to work around this by booting the installer in expert mode and, in the "Detect and mount CD-ROM" step, selecting only the drivers needed for CD support. These are (ide-)generic, ide-cd and isofs.<br />
The drivers needed to access the disk will still be loaded, but at a later stage. By loading the CD drivers before the SATA driver in this way, you may be able to complete the installation. Note that CD-ROM access may still be an issue after rebooting into the installed system.<br />
===Booting debian netinst from USB drive===<br />
The workaround I used is to boot from a USB stick (don't worry you will get your CDROM working later).<br />
<pre><nowiki><br />
wget http://ftp.debian.org/debian/dists/testing/\<br />
main/installer-i386/current/images/hd-media/boot.img.gz<br />
gzip -dc boot.img.gz >/dev/sdX<br />
</nowiki></pre><br />
Enable USB drive boot from BIOS setup, and then Install Debian base system as usual.<br />
<br />
===Using kernel boot parameters===<br />
(Not checked)<br />
You can append libata.atapi_enabled=1 to the install or expert command lines at the boot prompt to get your cdrom detected and then be able to install from it.<br />
<br />
=Configuration=<br />
==APT==<br />
/etc/apt/sources.list<br />
deb http://mirrors.kernel.org/debian/ testing main contrib non-free<br />
deb http://mirrors.kernel.org/debian/ unstable main contrib non-free<br />
deb http://security.debian.org/ testing/updates main contrib non-free<br />
deb http://www.debian-multimedia.org/ testing main<br />
deb http://www.debian-multimedia.org/ sid main<br />
<br />
/etc/apt/apt.conf<br />
[..]<br />
APT::Default-Release "testing";<br />
<br />
Upgrade base system<br />
apt-get update<br />
apt-get upgrade<br />
<br />
=Kernel=<br />
==Compiling a custom kernel==<br />
apt-get install linux-source-2.6.18 libncurses5-dev kernel-package<br />
cd /usr/src<br />
tar jxf linux-source-2.6.18.tar.bz2<br />
cd linux-source-2.6.18<br />
make menuconfig<br />
make-kpkg --initrd --revision gacq01 kernel_image<br />
cd ..<br />
dpkg -i linux-image-2.6.18_gacq01_i386.deb<br />
<br />
Manually edit /boot/grub/menu.lst and reboot<br />
<br />
=NVIDIA=<br />
==Installing nvidia drivers==<br />
===Pre-compiled driver if you install a linux-image===<br />
apt-get install nvidia-kernel-2.6.1x-1-686-smp<br />
apt-get install nvidia-glx nvidia-settings<br />
<br />
===Build your own nvidia driver if you have builded your kernel===<br />
apt-get install nvidia-kernel-source nvidia-kernel-common<br />
cd /usr/src<br />
tar xvzf nvidia-kernel-source.tar.gz<br />
cd linux-source-2.6.18<br />
make-kpkg --revision gacq01 modules_image<br />
cd ..<br />
dpkg -i nvidia-kernel-2.6.18_1.0.8776-1+gacq01_i386.deb<br />
apt-get install nvidia-glx nvidia-settings<br />
<br />
More info in:<br />
*http://wiki.debian.org/NvidiaGraphicsDrivers<br />
*http://www.leonscape.co.uk/linux/how2-nvg4.html<br />
*http://taliesin.wordpress.com/linux-kernel-custom-compile-the-debian-way/<br />
*http://wiki.clug.org.za/wiki/How_do_I_compile_my_own_kernel_into_a_deb%3F<br />
<br />
==Configuration==<br />
Update your /etc/X11/xorg.conf<br />
Section "Module"<br />
[..]<br />
#Load "dri"<br />
[..]<br />
EndSection<br />
<br />
Section "Device"<br />
Identifier "NVIDIA"<br />
Driver "nvidia"<br />
Option "NoLogo"<br />
Option "RenderAccel" "true"<br />
Option "NvAGP" "1"<br />
EndSection<br />
<br />
Section "Screen"<br />
[..]<br />
Device "NVIDIA"<br />
[..]<br />
EndSection<br />
<br />
=Wireless interface=<br />
1. Downloads<br />
<br />
'''driver''' from http://ipw3945.sourceforge.net/ for example<br />
wget http://ufpr.dl.sourceforge.net/sourceforge/ipw3945/ipw3945-1.1.0.tgz<br />
<br />
'''ieee80211 subsystem''' from http://ieee80211.sourceforge.net/ for example<br />
wget http://ufpr.dl.sourceforge.net/sourceforge/ieee80211/ieee80211-1.2.15.tgz<br />
<br />
'''firmware''' from http://bughost.org/ipw3945/ for example<br />
wget http://bughost.org/ipw3945/ucode/ipw3945-ucode-1.13.tgz<br />
<br />
'''regulatory daemon''' from http://bughost.org/ipw3945/ for example<br />
wget http://bughost.org/ipw3945/daemon/ipw3945d-1.7.22.tgz<br />
<br />
2. Install these modules ONLY if you didn't compile your own kernel<br />
apt-get install linux-headers-2.6.1x-1-686-smp<br />
apt-get install gcc-4.0<br />
<br />
3. Complile and install modules<br />
tar -zxvf ieee80211-1.2.15.tgz<br />
cd ieee80211-1.2.15<br />
make<br />
make install<br />
cd ..<br />
tar -zxvf ipw3945-1.1.0.tgz<br />
cd ipw3945-1.1.0<br />
# if you have problems here see notes<br />
make<br />
cd ..<br />
tar zxvf ipw3945-ucode-1.13.tgz<br />
mkdir /usr/local/lib/firmware/<br />
cp ipw3945-ucode-1.13/ipw3945.ucode /usr/local/lib/firmware/<br />
tar zxvf ipw3945d-1.7.22.tgz<br />
cp ipw3945d-1.7.22/x86/ipw3945d /sbin/ipw3945d-$(uname -r)<br />
cd ipw3945-1.1.0<br />
cp ipw3945.ko /lib/modules/$(uname -r)<br />
depmod -a<br />
<br />
4. /etc/init.d/ipw3945 <br />
#!/bin/bash<br />
<br />
case $1 in<br />
start)<br />
echo -n "Load ipw3945:"<br />
modprobe -i ipw3945<br />
/sbin/ipw3945d-$(uname -r) --timeout=30<br />
sleep 2<br />
echo " done."<br />
;;<br />
<br />
stop)<br />
echo -n "Unloading ipw3945:"<br />
/sbin/ipw3945d-$(uname -r) --kill<br />
modprobe -ir ipw3945<br />
sleep 2<br />
echo " done."<br />
;;<br />
esac<br />
<br />
exit 0<br />
<br />
chmod 755 /etc/init.d/ipw3945<br />
<br />
5. Enable start on boot<br />
update-rc.d ipw3945 defaults 30<br />
<br />
6. /etc/network/interfaces<br />
auto eth2<br />
iface eth2 inet dhcp<br />
<br />
Notes:<br />
*If your are planning to use your wireless interface in monitor mode, for example to use kismet, uncomment "CONFIG_IPW3945_MONITOR=y" from the driver Makefile before running make.<br />
*If you have error: "too few arguments to function ‘ieee80211_tx_frame’" problems compiling ipw3945-1.1.0 with 2.6.18 kernel. ipw does not properly recognize the version of ieee802.11 stuff in the kernel. A quick hack is to change "EXTRA_CFLAGS += -DIEEE80211_API_VERSION=$(IEEE80211_API)" to "EXTRA_CFLAGS += -DIEEE80211_API_VERSION=2" on line 96 of Makefile. (http://dotcommie.net/projects/XPS-M1210/)<br />
<br />
'''References'''<br />
*http://eomer.mine.nu/?q=node/18<br />
*http://alidhaey.blogspot.com/2006/08/instalar-debian-etch-en-un-dell.html<br />
*http://math.umh.ac.be/an/D820/#Wireless<br />
<br />
=WebCam=<br />
==Using uvcvideo - Only work with v4l2==<br />
Driver: http://linux-uvc.berlios.de/<br />
<pre><nowiki><br />
apt-get install libpt-plugins-v4l2<br />
svn checkout http://svn.berlios.de/svnroot/repos/linux-uvc/<br />
cd linux-uvc/linux-uvc/trunk<br />
make<br />
sudo make install<br />
modprobe uvcvideo<br />
dmesg | tail<br />
ln -s /dev/video0 /dev/video<br />
</nowiki></pre><br />
<br />
Notes:<br />
*Only [[v4l2]] is supported<br />
*Add users to system group "video"<br />
<br />
'''Webcam test'''<br />
apt-get install libsdl1.2-dev<br />
wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20060706.tar.gz<br />
tar -xvf luvcview-20060706.tar.gz<br />
cd luvcview-20060706<br />
make<br />
./luvcview -d /dev/video0 -f jpg -s 640x480<br />
<br />
'''References'''<br />
*http://linux-uvc.berlios.de/<br />
*http://www.eldemonionegro.com/wordpress/archivos/category/informatica/<br />
<br />
<br />
<br />
=Sound card=<br />
If you have conflict with the webcam USB microphone you can use this configuration in /etc/modprobe.d/sound to set the correct device order asignation.<br />
alias snd-card-0 snd-hda-intel<br />
options snd-hda-intel index=0<br />
alias snd-card-1 snd-usb-audio<br />
options snd-usb-audio index=1<br />
<br />
=dvd/cdrom=<br />
Error trying to open /dev/sg0 exclusively (Permission denied)... retrying in 1 second.<br />
cdrecord: Permission denied. Cannot open '/dev/sg0'. Cannot open SCSI driver.<br />
do:<br />
chgrp cdrom /dev/sg0<br />
<br />
=Modem (Not tested)=<br />
==Driver==<br />
*http://www.linuxant.com<br />
**[http://www.linuxant.com/drivers/hsf/full/archive/hsfmodem-7.47.00.01full/hsfmodem_7.47.00.01full_k2.6.15_26_686_ubuntu_i386.deb.zip Download propietary Dapper 2.6.15-26-686 driver]<br />
These are NOT free, however - an uncrippled version will set you back USD 19.99, the free ones only support 14k4 :-(<br />
<br />
dpkg -i hsfmodem_{version}_{arch}.deb<br />
if necessary, run "hsfconfig" to complete the installation, enter license information, or to change your modem's configuration.<br />
<br />
'''Hacerlo andar igual'''<br />
*http://www.linuxespanol.com/tema7832.html?sid=992dcc97f759926ea2ec902a71a44eb5<br />
<br />
'''Otros'''<br />
http://www.thinkwiki.org/wiki/Conexant_HSF_modem_drivers<br />
<br />
=Ricoh Card Reader=<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
<br />
=Suspend=<br />
==Suspend to RAM - Not working yet==<br />
apt-get install gnome-power-manager<br />
<br />
'''to validate'''<br />
*After the installation of the NVIDIA driver, Suspend to RAM worked well after setting SUSPEND2RAM_FORCE="yes" in '/etc/powersave/sleep'.<br />
<br />
'''research'''<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://en.opensuse.org/NVidia_Suspend_HOWTO<br />
*https://help.ubuntu.com/community/NvidiaLaptopBinaryDriverSuspend<br />
*https://help.ubuntu.com/community/SuspendHowto<br />
<br />
Cambiar en /etc/default/acpi-support<br />
<pre><nowiki><br />
ACPI_SLEEP=true<br />
#ACPI_HIBERNATE=true<br />
ENABLE_LAPTOP_MODE=true<br />
</nowiki></pre><br />
<br />
=Specifications=<br />
==Detected by preinstaled windows==<br />
Modem:Conexant HDA D110 MDC V.92 (winmodem)<br />
DVD: Sony DVD+-RW DW-Q58A<br />
NIC: Intel(R) PRO/Wireless 3945ABG Network Connection<br />
SATA: Intel(R) 82801GMB/GHM (ICH7-M Family) Serial ATA Storage Controller - 27C4<br />
Card Reader: Ricoh Memory Stick Y MMC<br />
Webcam: QuickCam for Dell Network<br />
PAD: Synaptics PS/2 Port Pointing device<br />
<br />
=General references=<br />
==Other sites about M1210 & Linux==<br />
*http://imaging.ugent.be/mr/Suse/suse-m1210.html<br />
*http://dotcommie.net/projects/XPS-M1210/<br />
*http://toufeeq.blogspot.com/2006/07/linux-on-dell-xps-m1210.html<br />
*http://www.serpentine.com/blog/software/linux-on-m1210.html<br />
*http://www.serveur32.net/~tom/wordpress/materiel/xps1210/<br />
*http://toufeeq.blogspot.com/2006/06/dell-xps-m1210.html<br />
*http://g33k.wordpress.com/2006/07/20/the-dell-xps-m1210-a-mini-review/<br />
*http://dellxpsm1210.blogspot.com/<br />
*https://wiki.ubuntu.com/LaptopTestingTeam/DellXPSM1210<br />
<br />
==About Debian==<br />
*[http://www.ehomeupgrade.com/entry/2812/how-to_setup_debian How-To: Setup Debian Linux Desktop with Full Multimedia Support and Faster Processing]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Comandos_varios&diff=2242Comandos varios2006-11-01T01:21:01Z<p>WikiSysop: </p>
<hr />
<div>=Otras recopilaciones=<br />
*http://www.esdebian.org/staticpages/index.php?page=200601112133535<br />
<br />
<br />
== Time Syncronization ==<br />
<pre><nowiki><br />
ntpdate time.sinectis.com.ar<br />
hwclock --systohc<br />
tzconfig<br />
</nowiki></pre><br />
<br />
== Recursive find and replace string in files ==<br />
<pre><nowiki><br />
#!/bin/sh<br />
for tfile in `find . -type f`<br />
do<br />
cat $tfile | sed "s^$1^$2^" > $tfile.junk<br />
mv -f $tfile.junk $tfile<br />
done<br />
</nowiki></pre><br />
<br />
=== Usar una unidad de cinta remota ===<br />
<pre><nowiki><br />
rsh host dd if=/dev/rmt ibs=10k | tar xobf<br />
</nowiki></pre><br />
<br />
=== Una forma de copiar archivos con ssh pero sin scp ===<br />
Util para cuando tenemos archivos muy grandes y el scp se queda en "stalled"<br />
<pre><nowiki><br />
tar cvzf - dir-o-file | ssh servidor tar xCzf directorio -<br />
</nowiki></pre><br />
<br />
=== delete files older than 7 days ===<br />
<pre><nowiki><br />
find . -ctime +7 -print | xargs rm -f<br />
</nowiki></pre><br />
<br />
=== Para encontrar IP Address ===<br />
<pre><nowiki><br />
find / -type f -print | xargs egrep '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'<br />
</nowiki></pre><br />
<br />
== Lista de parametros muy grande ==<br />
<pre><nowiki><br />
intranet:/# grep regexp *<br />
-su: /bin/grep: Argument list too long<br />
</nowiki></pre><br />
<br />
=== Se resuelve con ===<br />
<pre><nowiki><br />
intranet:/# ls | xargs grep -i regexp<br />
</nowiki></pre><br />
<br />
== Velocidad de la placa de red ==<br />
<pre><nowiki><br />
mii-tool<br />
</nowiki></pre><br />
<br />
== Borrar algo de un archivo ==<br />
<pre><nowiki><br />
# echo 'g/non-free/d<br />
wq'|ed - /etc/apt/sources.list<br />
</nowiki></pre><br />
<br />
== Partir un archivo en partes del tamaño de un CD de 700 MB ==<br />
<pre><nowiki><br />
split -b <br />
</nowiki></pre><br />
<br />
== httptunnel ==<br />
<pre><nowiki><br />
If you are placed behind an HTTP-proxy (with or without user-authentication), you can not simply use ssh to connect to an outside server. Everything else but HTTP is locked.<br />
If for some reason you desperately need to get out, do the following:<br />
<br />
server (outside the proxy):<br />
apt-get install httptunnel<br />
hts -F localhost:22 1234<br />
<br />
client (inside the proxy):<br />
apt-get install httptunnel<br />
htc -F 5678 -A proxyuser:proxypwd -P proxy-server remote-host:1234<br />
ssh -p 5678 localhost<br />
<br />
With this, the local port "5678" is tunnelled to "remote-host's" port "22" via an HTTP-protocol-based "connection" between the HTTP-Tunnel-Client and the HTTP-Tunnel-Server (port "1234").<br />
SSH connects to localhost:5678 and reaches remote-host:22 (in this configuration). <br />
</nowiki></pre><br />
<br />
== Cambiar hostname ==<br />
1. Cambiarlo de /etc/hostname<br />
1. init 6<br />
<br />
== Convertir los archivos txt de DOS a UNIX ==<br />
Hay varias opciones para sacar los ^M del final de las lineas<br />
<pre><nowiki><br />
# Con tr<br />
tr -d '\15\32' < archivo-dos > archivo-unix<br />
<br />
# Con vi<br />
1,$s/^M//g<br />
<br />
# Con dos2unix<br />
apt-get install sysutils<br />
dos2unix winfile.txt unixfile.txt<br />
<br />
# Con awk<br />
awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt<br />
<br />
# Con perl<br />
perl -p -e 's/\r$//' < winfile.txt > unixfile.txt<br />
</nowiki></pre><br />
<br />
== Convertir los archivos txt de UNIX a DOS ==<br />
Hay varias opciones para sacar los ^M del final de las lineas<br />
<pre><nowiki><br />
# Con unix2dos<br />
apt-get install sysutils<br />
unix2dos unixfile.txt winfile.txt<br />
<br />
# Con awk<br />
awk 'sub("$", "\r")' unixfile.txt > winfile.txt<br />
<br />
# Con Perl<br />
perl -p -e 's/\n/\r\n/' < unixfile.txt > winfile.txt<br />
</nowiki></pre><br />
<br />
== Renombrar muchos archivos a la vez ==<br />
<pre><nowiki><br />
for i in 'ls *.<oldextension>'; do mv $i ${i/<oldextension>/<newextension>}; done<br />
# Ejemplo:<br />
for i in `ls *.shtml` ; do mv $i ${i/shtml/html}; done<br />
</nowiki></pre><br />
<br />
<br />
==Poner bien permisos==<br />
find /xxx -type d -exec chmod 755 '{}' \;<br />
find /xxx -type f -exec chmod 644 '{}' \;<br />
<br />
= Avisar con sonido cuando se corta la red =<br />
En el crontab se puede poner algo como<br />
<pre><nowiki><br />
* * * * * root if ! ping -c 2 -n 195.22.220.52 >> /dev/null; then aplay informational.au; fi<br />
</nowiki></pre><br />
<br />
= Filter =<br />
en /etc/aliases<br />
<pre><nowiki><br />
gacq: gacq,"| /usr/bin/filter -o /tmp/filter.err -f /.elm/filter-rules.gacq"<br />
</nowiki></pre><br />
<br />
=Duplicando discos sobre la red=<br />
<pre><nowiki><br />
#dd if=/dev/hda bs=10k | ssh <IP_DESTINO> dd of=/dev/hda bs=10k<br />
</nowiki></pre><br />
<br />
=Proxy server=<br />
Para usar lynx, etc es necesario setar la variable /etc/profile, bashrc, etc.<br />
<pre><nowiki><br />
http_proxy=http://proxy.uolfast.com.ar:80<br />
</nowiki></pre></div>WikiSysophttps://wiki.gacq.com/index.php?title=Integracion_con_Windows&diff=2241Integracion con Windows2006-11-01T01:16:53Z<p>WikiSysop: </p>
<hr />
<div>=Ver bien los acentos y eñes al montar una particion fat32=<br />
Usamos iocharset=utf8, por ejemplo.<br />
mount -o iocharset=utf8 /dev/hdb1 /mnt/discod<br />
<br />
= Reciebiendo attachs winmail.dat =<br />
Muchos de los usuarios de Internet que no usan el Microsoft Outlook habrán visto mensajes de email que contienen un archivo adjunto denominado winmail.dat (application/ms-tnef). Este archivo es creado y anexionado por Outlook, y contiene información para el formato de textos. Pero aunque esta información no sea lo más importante, Outlook también incluye los anexos regulares dentro de estos archivos. Es un poco frustrante que usted no pueda abrir el anexo sin Outlook - si usted no usa una herramienta especial.<br />
<br />
En debian el paquete ktnef trae un utilitario que nos va apermitir extraer los archivos adjuntos sin problemas<br />
<br />
Otro que no probe en: http://www.safer-networking.org/es/articles/outlookattachments.html<br />
<br />
=Boteando linux usando NTloader=<br />
Usando el gestor de arranque (NTloader) de windows:<br />
Se copian los sectores de arranque de las particiones al archivo debian_sarge.lnx:<br />
<br />
dd if=/dev/hda2 of=/debian_sarge.lnx bs=512 count=1 (tenemos sarge en hda2 con lilo o grup)<br />
dd if=/dev/hda5 of=/debian_etch.lnx bs=512 count=1 (tenemos etch en hda5 con lilo o grup)<br />
<br />
los archivos debian*.lnx se copian en la partición raiz de windows y al archivo boot.ini de windows,oculto y de sólo lectura,le agregamos las siguientes lineas dentro de su sección [operating systems]: <br />
C:\debian_sarge.lnx="Debian Sarge" <br />
C:\debian_etch.lnx="Debian Etch" <br />
<br />
;Atención:<br />
cada vez que modifiquemos los sectores de inicio o gestores de arranque de las particiones linux habrá que volver a realizar lo anterior ya que los ficheros .lnx habrán quedado desactualizados.</div>WikiSysophttps://wiki.gacq.com/index.php?title=ProveedoresHardware&diff=2240ProveedoresHardware2006-10-31T23:08:00Z<p>WikiSysop: </p>
<hr />
<div>*Se listan proveedores de hardware recomendados o explicitamente no recomendados<br />
*Es importante que vendan partes sueltas, no solo PC armadas o perfericos<br />
*Se valorara tambien los que distribuyan hardware compatible con Linux<br />
<br />
=Recomendados=<br />
=== PC Ace ===<br />
Av. Rivadavia 6836 Piso 2 - 4637-6196<br />
http://www.pc-ace.com.ar<br />
Muy buen precio, poca variedad<br />
Recomiendan: gacq<br />
<br />
== Abelyn ==<br />
Salcedo 3282 - 4909-2100 - (Parque Patricios)<br />
General Urquiza 424 - 4127-2700 - (Once)<br />
http://www.abelyn.com.ar<br />
MSI, tienen buen precio, servicio de postventa regular<br />
Rony: 4127-2706<br />
Recomienda: Bauna, Luis, Donatuc<br />
<br />
=Hardware específico=<br />
==Placas wireless==<br />
TL Informática<br />
Compu Solve SA<br />
Galeria Jardin - Local 408<br />
4393-1927<br />
(Placas D-Link chipset Atheros)<br />
Recomiendan: gacq<br />
<br />
=Mayoristas=<br />
== MRS ==<br />
*Maza 365 - 4866-4466 - http://www.mrs.com.ar<br />
*Mayorista, vende ASUS<br />
*Recomienda: Diabolo<br />
<br />
== Cercano a Flores ==<br />
=== Mexx ===<br />
Juan Bautista Alberdi 1233 Piso 2 Oficina 1 - 4433-3829 - http://www.mexx-argentina.com<br />
=== Korencomp ===<br />
Acoyte 145 - 4903-7727 4901-1721 - http://www.korencomp.com.ar<br />
=== Compu Mar ===<br />
Av. de la Plata 444 - 4958-7775 - http://www.compumar.com<br />
=== Digital Soft ===<br />
Av. Rivadavia 5500 - 4431-4396 - hotmail....<br />
MSI<br />
=== OC Store ===<br />
Av. Rivadavia 5320 Local 25 - 4901-6900 - http://www.ocstore.com.ar<br />
MSI<br />
=== Atrellius ===<br />
Av. de la Plata 714 - 4925-3309 - http://www.atrellius.com<br />
=== Compu Master ===<br />
Av. Directorio 483 - 4922-4409/4962 - http://www.compu-master.com<br />
MSI, menor/mayor<br />
=== Flores Central ===<br />
Bolivia 23 - 4637-8999/5539 - http://www.tayson.com.ar</div>WikiSysophttps://wiki.gacq.com/index.php?title=Analisis_de_logs&diff=2239Analisis de logs2006-10-31T01:39:10Z<p>WikiSysop: /* AWStats */</p>
<hr />
<div>Describe AnalisisLogs here.<br />
<br />
= Especificos =<br />
<br />
*http://www.loganalysis.org/sections/parsing/application-specific/<br />
<br />
= Teoria =<br />
*[http://www.cs.umd.edu/hcil/treemap-history/index.shtml Treemaps for space-constrained visualization of hierarchies]<br />
<br />
== Software ==<br />
*[http://dag.wieers.com/home-made/dstat/ Dstat: Versatile resource statistics tool]<br />
<br />
<br />
== Utilitarios logs del sistema ==<br />
*swatch<br />
*logwatch<br />
=== logcheck ===<br />
<pre><nowiki><br />
# Testing rules<br />
sed -e 's/[[:space:]]*$//' /var/log/syslog | egrep \a<br />
'^\w{3} [ :0-9]{11} oempc wwwoffled\[[0-9]+\]: WWWOFFLE (On|Off)line\.$'<br />
</nowiki></pre><br />
<br />
'''Reglas'''<br />
<pre><nowiki><br />
# Postfix<br />
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ postfix/lmtp\[[0-9]+\]: [[:upper:][:digit:]]+: to=<[^[:space:]]+>, relay=[^[:space:]]+(\]|\[[^[:space:]]+\]), delay=[0-9]+, status=bounced \(host [^[:space:]]+(\]|\[[^[:space:]]+\]) said\: 550\-Mailbox unknown\. Either there is no mailbox associated with this 550\-name or you do not have authorization to see it\. 550 5\.1\.1 User unknown \(in reply to RCPT TO command\)\)<br />
</nowiki></pre><br />
<br />
<br />
<br />
== Apache logs ==<br />
<br />
*AWStats (El mejor) - ver /usr/share/doc/awstats/README.Debian al instalar por temas permisos<br />
*Analog<br />
*WEBALIZER<br />
<br />
=== AWStats ===<br />
<pre><nowiki><br />
apt-get install awstats<br />
<br />
# poner en permisos de creacion 644<br />
vi /etc/logrotate.d/apache<br />
<br />
# Cambiar los permisos de los archivos actuales del apache<br />
chmod 644 /var/log/apache/*.log<br />
<br />
# Copiar el ejemplo de archivo de configuracion<br />
cp /usr/share/doc/awstats/examples/apache.conf /etc/apache/conf.d/awstat<br />
/etc/init.d/apache restart<br />
<br />
# Cambiar el parametro SiteDomain al nombre del dominio y poner los alias que correspondan<br />
vi /etc/awstats/awstats.conf<br />
<br />
# APARENTEMENTE NO ES NECESARIO Correr la configuracion<br />
#/usr/share/doc/awstats/examples/awstats_configure.pl<br />
<br />
# Esperar unos minutos e ir a http://localhost/cgi-bin/awstats.pl<br />
<br />
</nowiki></pre><br />
<br />
<br />
;Awstats in a chroot enviroment without perl inside the jail<br />
/etc/cron.d/awstats<br />
MAILTO=root<br />
*/10 * * * * root /usr/lib/cgi-bin/awstats.pl config=mydomain.org -output -update > /var/www/var/www/virtual/mydomain/htdocs/awstats/cafeconf.org/index.html<br />
<br />
Remember to copy icons to the new location</div>WikiSysophttps://wiki.gacq.com/index.php?title=Cosas_para_el_asado&diff=2217Cosas para el asado2006-10-27T19:42:33Z<p>WikiSysop: /* Bebidas */</p>
<hr />
<div>=Picada=<br />
*Queso (tipo a definir)x 1/2 k<br />
*Salamines x 3<br />
*Aceitunas - 250 gr.<br />
*Papitas/Chizitos/etc..<br />
<br />
Comentario del asador: Regulen este tema que despues no me comen la carne!<br />
<br />
=Bebidas=<br />
Formula de calculo de <br />
{|cellspacing="0" border="1"<br />
|- style="background-color:#94dbef;" <br />
|'''Bebida'''|| '''Cantidad'''<br />
|-<br />
|'''Coca Cola 1,5 litros'''|| 2<br />
|-<br />
|'''Sprite 0 litros'''|| 2<br />
|-<br />
|'''Cerveza de litro'''|| 2<br />
|-<br />
|'''Vino tinto'''|| 2<br />
|-<br />
|'''Vino blanco'''|| ?<br />
|-<br />
|'''Agua con gas'''|| ?<br />
|-<br />
|}<br />
<br />
Los vinos los puedo aportar yo (DiegA) de mi propia bodega.<br />
<br />
=Ensaladas=<br />
==Mixta==<br />
;cantidad 2 ensaladeras<br />
*Lechuga= 1 kg<br />
*Cebolla= 0.5 kg<br />
*Tomate= 2 kg<br />
<br />
==Remolacha==<br />
Si alguno quiere otra ensalda anote los ingredientes<br />
<br />
=Postre=<br />
*¿Compramos helado en el super?<br />
*¿Cuanto?<br />
<br />
=Miscelaneas=<br />
*ABRIGO!!!!</div>WikiSysophttps://wiki.gacq.com/index.php?title=Cosas_para_el_asado&diff=2216Cosas para el asado2006-10-27T19:40:53Z<p>WikiSysop: Revertida a la última edición por 200.69.253.65</p>
<hr />
<div>=Picada=<br />
*Queso (tipo a definir)x 1/2 k<br />
*Salamines x 3<br />
*Aceitunas - 250 gr.<br />
*Papitas/Chizitos/etc..<br />
<br />
Comentario del asador: Regulen este tema que despues no me comen la carne!<br />
<br />
=Bebidas=<br />
Formula de calculo de <br />
{|cellspacing="0" border="1"<br />
|- style="background-color:#94dbef;" <br />
|'''Bebida'''|| '''Cantidad'''<br />
|-<br />
|'''Coca Cola 1,5 litros'''|| 3<br />
|-<br />
|'''Cerveza de litro'''|| 2<br />
|-<br />
|'''Vino tinto'''|| 2<br />
|-<br />
|'''Vino blanco'''|| ?<br />
|-<br />
|'''Agua con gas'''|| ?<br />
|-<br />
|}<br />
<br />
Los vinos los puedo aportar yo (DiegA) de mi propia bodega.<br />
<br />
=Ensaladas=<br />
==Mixta==<br />
;cantidad 2 ensaladeras<br />
*Lechuga= 1 kg<br />
*Cebolla= 0.5 kg<br />
*Tomate= 2 kg<br />
<br />
==Remolacha==<br />
Si alguno quiere otra ensalda anote los ingredientes<br />
<br />
=Postre=<br />
*¿Compramos helado en el super?<br />
*¿Cuanto?<br />
<br />
=Miscelaneas=<br />
*ABRIGO!!!!</div>WikiSysophttps://wiki.gacq.com/index.php?title=Cosas_para_el_asado&diff=2205Cosas para el asado2006-10-27T18:41:27Z<p>WikiSysop: </p>
<hr />
<div>=Picada=<br />
*Queso (tipo a definir)x 1/2 k<br />
*Salamines x 3<br />
*Aceitunas - 250 gr.<br />
<br />
=Bebidas=<br />
Formula de calculo de <br />
{|cellspacing="0" border="1"<br />
|- style="background-color:#94dbef;" <br />
|'''Bebida'''|| '''Cantidad'''<br />
|-<br />
|'''Coca Cola 1,5 litros'''|| 3<br />
|-<br />
|'''Cerveza de litro'''|| ?<br />
|-<br />
|}<br />
<br />
=Ensaladas=<br />
==Mixta==<br />
;cantidad 2 ensaladeras<br />
*Luchuga= 1 kg<br />
*Cebolla= 0.5 kg<br />
*Tomate= 2 kg<br />
<br />
==Remolacha==<br />
?<br />
<br />
=Postre=<br />
*¿Compramos helado en el super?<br />
*¿Cuanto?</div>WikiSysophttps://wiki.gacq.com/index.php?title=Tmp&diff=2204Tmp2006-10-27T18:28:13Z<p>WikiSysop: </p>
<hr />
<div><br />
[[Cosas para el asado]]</div>WikiSysophttps://wiki.gacq.com/index.php?title=Portada&diff=2203Portada2006-10-27T18:27:47Z<p>WikiSysop: /* Desordenado */</p>
<hr />
<div>=Conceptos básicos=<br />
Una selección de textos en español sobre conceptos básicos acerca del uso de las tecnologías - Su lectura no requiere de conocimientos técnicos<br />
*[[Software Libre]]<br />
*[[Estandares Libres]]<br />
*[[Conocimiento Libre]]<br />
*[[DRM]]<br />
*[[Patentes de Software]]<br />
*[[Licencias de software]]<br />
*[[Proyecto GNU]]<br />
*[[Copyleft]]<br />
<br />
=Software=<br />
==Modulos==<br />
===Servidores===<br />
*[[Apache]]<br />
*[[Bind]]<br />
*[[CVS]]<br />
*[[Cyrus Imap]]<br />
*[[dhcpd]]<br />
*[[Fetchmail]]<br />
*[[FTP]]<br />
*[[Mailman]]<br />
*[[Munin]]<br />
*[[MySQL]]<br />
*[[NFS]]<br />
*[[OpenLDAP]]<br />
*[[PostFix]]<br />
*[[ProcMail]]<br />
*[[Samba]]<br />
*[[Squid]]<br />
*[[SSH]]<br />
*[[Zabbix]]<br />
*[[Xen]]<br />
<br />
===General===<br />
*[[aircrack]]<br />
*[[apt]]<br />
*[[amavis]]<br />
*[[Bash]]<br />
*[[BitTorrent]]<br />
*[[Eclipse]]<br />
*[[Flowscan]]<br />
*[[Gaim]]<br />
*[[gimp]]<br />
*[[GNOME]]<br />
*[[GnuPG]]<br />
*[[grep]]<br />
*[[grub]]<br />
*[[iptables]]<br />
*[[JigDo]]<br />
*[[kismet]]<br />
*[[Mozilla]]<br />
*[[Mutt]]<br />
*[[NetworkManager]]<br />
*[[Open Dental]]<br />
*[[rsync]]<br />
*[[v4l2]]<br />
*[[Vim]]<br />
*[[wget]]<br />
*[[XDMCP]]<br />
*[[XGL]]<br />
*[[Xserver]]<br />
<br />
===Web===<br />
*[[drupal]]<br />
*[[DotProject]]<br />
*[[egroupware]]<br />
*[[gallery]]<br />
*[[Squirrelmail]]<br />
*[[MediaWiki]]<br />
*[[Xoops]]<br />
<br />
===Software privativo===<br />
*[[VMWare]]<br />
*[[Windows]]<br />
**[[Software Libre para Windows]]<br />
**[[Migracion desde Windows]]<br />
**[[Integracion con Windows]]<br />
*[[Solaris]]<br />
*[[Sybase]]<br />
*[[Oracle]]<br />
*[[Skype]]<br />
<br />
==Temas varios==<br />
*[[Raid por software]]<br />
*[[Análisis de tráfico]]<br />
*[[Monitoreo]]<br />
*[[Debian - Atlhon 64 bits]]<br />
*[[Comandos varios]]<br />
*[[Filesystems]]<br />
*[[Localizacion de pais]]<br />
*[[Infraestructure Management]]<br />
*[[Internet server configuration]]<br />
*[[Maquinas Chicas]]<br />
*[[Mail servers]]<br />
*[[Analisis de logs]]<br />
*[[Herramientas de diagnostico]]<br />
*[[CDs y DVDs]]<br />
*[[Protocolos a manopla]]<br />
*[[System debuging]]<br />
*[[Video]]<br />
*[[Sonido]]<br />
*[[Java]]<br />
*[[Expresiones regulares]]<br />
*[[Wake on lan]]<br />
*[[Kernel 2.6]]<br />
*[[Copiar directorios via tar y SSH]]<br />
*[[Ubuntu]]<br />
*[[Debian]]<br />
*[[Default passwords]]<br />
*[[Sistemas antispam]]<br />
*[[Consultorio Odontologico]]<br />
*[[Maquinas virtuales]]<br />
*[[Seguridad Informatica]]<br />
*[[Streaming]]<br />
*[[Wireless]]<br />
*[[DNS Dinamico]]<br />
*[[Bootsplash]]<br />
*[[Desktop]]<br />
*[[CRM]]<br />
*[[Electronica]]<br />
*[[spam]]<br />
<br />
=Hardware=<br />
*[http://kmuto.jp/debian/hcl/ Debian GNU/Linux device driver check page]<br />
*[[ProveedoresHardware]]<br />
*[[Hardware roto]]<br />
==Por tipo==<br />
*[[ADSL]]<br />
*[[Cable Modem]]<br />
*[[Camaras Digitales]]<br />
*[[FireWire]]<br />
*[[Impresoras]]<br />
*[[NoteBooks]]<br />
*[[Modems]]<br />
*[[Monitores]]<br />
*[[Motherboards]]<br />
*[[Palm]]<br />
*[[Placas de Video]]<br />
*[[Scanners]]<br />
*[[WebCams]]<br />
*[[Dispositivos wireless]]<br />
<br />
=Internet=<br />
*[[Bookmarks]]<br />
*[[Sitios web problematicos]]<br />
*[[Dominios]]<br />
*[[Internet Service Providers]]<br />
<br />
=Varios=<br />
*[[Diseño Grafico]]<br />
*[[Temas generales]]<br />
<br />
*[[tmp]]<br />
<br />
==Desordenado==<br />
*[[Ordenar]]<br />
<br />
Este Wiki esta orientado hacia temas generales relacionados con tecnologías libres, principalmente en cuanto a lo que se refiere a la administracion de sistemas Debian GNU/Linux, aunque también se pueden encontrar otros temas. La información puede estar desactualizada o no ser correcta, por lo que se recomienda usarla con precaución.</div>WikiSysop