Me ha vuelto a dar por usar linux en el trabajo, llevo ya cosa de 3 semanas sin arrancar windows y de momento no lo hecho de menos, está vez me ha decidido el que el cliente zenworks se tome la libertad de joderme el MBR (y el grub) cada vez que arranco windows, luego tengo que arrancar de un usb y desde ahí volver a instalar grub en el MBR. Puto Novell, como se atreven a tocar el mbr con sus mierdas. En fin. También me viene muy bien para poder usar pycharm con todas las librerias que necesito y en un entorno más parecido al de producción para probar las cambios en local.
Escribo esto más que nada como documentación propia, si le vale de algo a alguien más mira tu que bien.
Como gestor de ventanas estoy usando dwm (http://www.suckless.org), y como distro ubuntu 15.10 (es beta, me he arrapentido un par de veces de no haber instalado una versión estable, pero bueno, funciona). Los programas que suelo usar en windows y los sustitutos:
outlook -> Thunderbird (con el plugin exQuilla), funciona muy bien, sobre todo me va muchisimo más rapido para buscar correos en el archivo (4.2GB).
Visio -> yEd además permite importar datos de excel localc, me está gustando mucho, aunque visio hace cosas que no hace, para diagramas de red está muy bien.
Office -> Libreoffice (localc y lowriter)
Adobe acrobat -> evince
Unidades de red -> ncpmount (instaladas desde un rpm creado para otra versión a veces se quedan colgadas las unidades y tengo que reiniciar para que se arregle :-/).
Chrome -> Firefox, hay chrome para linux pero me he cambiado.
Otros programas que uso como mysql-workbench, keepass ó pycharm tienen versión para linux y funciona bien.
Como xterm estoy usando terminator es un poco redundante una consola con soporte de tiling usando dwm, pero a veces viene bien y en todo caso no estorba.
Unidades de red de novell
Ejemplo de uso:
ncpmount -S logical_server_name (muchas veces como el DNS pero solo el basename) -A nombre/ip -U nombre_de_usuario_con_path_completo (ie: FULANITO.COMPRAS.GIJON.T1.ES) -V volumen -P clave punto_de_montaje (/media/novell_sistemas por ejemplo)
La impresora la configuré con el comando system-config-printer (algo de gnome supongo) y funciona bien.
DWM
Ubuntu viene con una versión un poco vieja de dwm que además no sé donde deja las fuentes, así que me bajé la última versión del git (git clone http://git.suckless.org/dwm) e instalé desde allí, aunque primero instalar la versión de ubuntu con apt para que me configurase el gdm o lo que sea eso que me pide el login al arrancar y me deja escoger el gestor de ventanas.
En mi caso tengo dos monitores, el más grande a la derecha, así que uso un script que ejecuto en el arranque para configurarlo (usando gnome no hace falta pero con dwm sí).
while true; do /home/nicolavm/bin/dwmstatus; sleep 1s; done & (barra de estado de dwm)
/usr/bin/wmname LG3D (esto es para que funcionen bien en dwm algunos programas sobre todo cosas de java)
/home/nicolavm/bin/screen.sh (ver script más abajo)
------------------ bin/screen.sh configuration
La barra de estado de dwm la configuré con soporte de mpc por que me mola que ponga el titulo de la canción que suena (http://dwm.suckless.org/dwmstatus/ + http://dwm.suckless.org/dwmstatus/mpdstatus.c) y también configuré unos shortcuts para manejar el mpc (eso va en la configuración de dwm):#!/bin/bash IN="HDMI2" EXT="VGA1" if (xrandr | grep "$EXT disconnected"); then xrandr --output $IN --auto --output $EXT --off else xrandr --output $IN --auto --primary --output $EXT --auto --left-of $IN fi
ctrl+alt+k para abrir el keepass
ctrl+alt+flecha arriba y abajo para canción siguiente y anterior (con mpc)
ctrl+alt+flecha izda y derecha para atrasar adelantar cación
ctrl+alt+space para pausar y lanzar mpc
alt+[F11,F12] bajar y subir el volumen
shift+prtintgr(Impr Pant) para lanzar un programa de captura de pantalla (seleccionando la parte a copiar)
Y el fichero de configuración de dwm-6.1 (config.h):
En ubuntu 14.04 el login parece que está gestionado por lightdm, y por defecto no lee el .xsession (.xinitrc), así que para usarlo crear (como usuario root) /usr/share/xsessions/custom.desktop con el contenido:/* See LICENSE file for copyright and license details. */ /* appearance */ static const char *fonts[] = { "monospace:size=10" }; static const char dmenufont[] = "monospace:size=10"; static const char normbordercolor[] = "#444444"; static const char normbgcolor[] = "#222222"; static const char normfgcolor[] = "#bbbbbb"; static const char selbordercolor[] = "#005577"; static const char selbgcolor[] = "#005577"; static const char selfgcolor[] = "#eeeeee"; static const unsigned int borderpx = 1; /* border pixel of windows */ static const unsigned int snap = 32; /* snap pixel */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ /* tagging */ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const Rule rules[] = { /* xprop(1): * WM_CLASS(STRING) = instance, class * WM_NAME(STRING) = title */ /* class instance title tags mask isfloating monitor */ { "Gimp", NULL, NULL, 0, 1, -1 }, { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, { "chromium-browser", NULL, NULL, 1 << 8, 0, -1 }, { "Chromium", NULL, NULL, 1 << 8, 0, -1 }, { "Thunderbird", NULL, NULL, 1 << 3, 0, -1 }, }; /* layout(s) */ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ static const int nmaster = 1; /* number of clients in master area */ static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ static const Layout layouts[] = { /* symbol arrange function */ { "[]=", tile }, /* first entry is default */ { "><>", NULL }, /* no layout function means floating behavior */ { "[M]", monocle }, }; /* key definitions */ #define MODKEY Mod1Mask #define WINKEY Mod4Mask #define TAGKEYS(KEY,TAG) \ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, /* helper for spawning shell commands in the pre dwm-5.0 fashion */ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; static const char *termcmd[] = { "terminator", NULL }; static const char *screenlock[] = { "xtrlock", "-b", NULL }; static const char *keepass[] = { "/usr/bin/keepass2", "/onedir/mykeepassfile.kdbx", NULL }; static const char *volup[] = { "/usr/bin/amixer", "-D", "pulse", "sset", "Master", "5%+", NULL }; static const char *voldown[] = { "/usr/bin/amixer", "-D", "pulse", "sset", "Master", "5%-", NULL }; static const char *mpcnext[] = { "/usr/bin/mpc", "next", NULL }; static const char *mpcprev[] = { "/usr/bin/mpc", "prev", NULL }; static const char *mpcforward[] = { "/usr/bin/mpc", "seek", "+3%", NULL }; static const char *mpcbackward[] = { "/usr/bin/mpc", "seek", "-3%", NULL }; static const char *mpctoggle[] = { "/usr/bin/mpc", "toggle", NULL }; static const char *shutter_s[] = { "/usr/bin/shutter", "-s", NULL }; static Key keys[] = { /* modifier key function argument */ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, { WINKEY, XK_l, spawn, {.v = screenlock } }, { MODKEY|ControlMask, XK_k, spawn, {.v = keepass } }, { MODKEY, XK_F12, spawn, {.v = volup } }, { MODKEY, XK_F11, spawn, {.v = voldown } }, { MODKEY|ControlMask, XK_Up, spawn, {.v = mpcnext } }, { MODKEY|ControlMask, XK_Down, spawn, {.v = mpcprev } }, { MODKEY|ControlMask, XK_Right, spawn, {.v = mpcforward } }, { MODKEY|ControlMask, XK_Left, spawn, {.v = mpcbackward } }, { MODKEY|ControlMask, XK_space, spawn, {.v = mpctoggle } }, { ShiftMask, XK_Print, spawn, {.v = shutter_s } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, { MODKEY, XK_i, incnmaster, {.i = +1 } }, { MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY, XK_Return, zoom, {0} }, { MODKEY, XK_Tab, view, {0} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, { MODKEY, XK_comma, focusmon, {.i = -1 } }, { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) TAGKEYS( XK_4, 3) TAGKEYS( XK_5, 4) TAGKEYS( XK_6, 5) TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, }; /* button definitions */ /* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ static Button buttons[] = { /* click event mask button function argument */ { ClkLtSymbol, 0, Button1, setlayout, {0} }, { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, { ClkWinTitle, 0, Button2, zoom, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, { ClkTagBar, 0, Button1, view, {0} }, { ClkTagBar, 0, Button3, toggleview, {0} }, { ClkTagBar, MODKEY, Button1, tag, {0} }, { ClkTagBar, MODKEY, Button3, toggletag, {0} }, };
Crear el .xinitrc, en mi caso:[Desktop Entry] Name=Xsession Exec=/etc/X11/Xsession
Luego crear un enlace de .xsession a .xinitrc (podía crear directamente el .xsession pero soy un nostálgico).~/bin/mpdstatus & /usr/bin/wmname LG3D & ~/bin/screen.sh & /usr/bin/feh --bg-max --no-xinerama bg/doble1.jpg & while true; do # Log stderror to a file /usr/bin/dwm 2> ~/.dwm.log # No error logging #dwm >/dev/null 2>&1 done
Y luego en la entrada de lightdm donde nos dice los distintos wm que tenemos para arrancar seleccionar xsession. ...Y en el portatil (toshiba l300) hice algo parecido. Pero cambiando un poco la configuración de las teclas del para que funcione la ruedita del volumen y para suspender el portatil pulsando ctrl+alt+home(inicio), para ello primero hay que dar permisos a nuestro usuario para que pueda ejecutar pm-suspend con sudo sin falta de meter la clave, editar (como root) el fichero /etc/sudoers y añadir:ln -s ~/.xinitrc ~/.xsession
username ALL = NOPASSWD: /usr/sbin/pm-hibernate
username ALL = NOPASSWD: /usr/sbin/pm-suspend
Y en el fichero config.h de dwm añadir las líneas en su sitio correspondiente:
static const char *suspend[] = { "/usr/bin/sudo", "/usr/sbin/pm-suspend", NULL };
{ ShiftMask, XK_Home, spawn, {.v = suspend } },
Luego compilar e instalar el dwm:
make
sudo make install PREFIX=/usr
Libreoffice Writer (el equivalente del Word de Ms Office)
Libreoffice (lowriter) me parece más pejiguero con el tema de los párrafos y los saltos de línea que el word, hay que tener cuidado al aplicar estilos o al usar bulleting & numbering, que los parrafos terminen donde piensas (y usar character style en vez de paragraph style si quieres aplicar un estilo sólo al texto seleccionado), otro problema es que al pegar código, por ejemplo de un terminal, todos los saltos de línea se convierten en nuevos párrafos.
La función de buscar y reemplazar de lowriter (aunque uses expresiones regulares), no te deja sustituir el caracter de "nuevo párrafo" ($) por "nueva línea" (el equivalente de shift+enter (\n)). Te deja buscar "nueva línea" con \n, pero si lo usas como sustitución (en la caja de "Replace with") te plancha un "nuevo párrafo" ($) en vez de un "nueva línea" (MAL libreoffice MAL!).
Instalando un plugin extra, este sí te permite buscar "nuevo párrafo" con \p y sustituirlo por "nueva línea" con \n, en todo el documento o en el texto seleccionado. El plugin se llama Alt Search y se puede descargar de enlace.
Para usarlo yo me configuré unos shortcuts como explican en aquí.
Problemas al compilar mbrowse, no encuentra las libreas de snmp, hay que indicarle donde están con ./configure --with-snmp-lib=/usr/lib/x86_64-linux-gnu/.