Archivi per la categoria post a caso
Crisis Management
Quando offri un servizio online può capitare di avere dei problemi (bug, DDoS, guasti hardware, router impazziti, ecc.) che precludono l'accesso al servizio a buona parte dell'utenza (se non tutta).
Ci sono almeno due modi per affrontare la comunicazione con gli utenti durante una crisi:
- far finta di nulla;
- ammettere che si sta verificando un problema.
Il primo modo di replicare - a mio personalissimo parere - è inutile, a meno che non si stia affrontando una crisi che potrebbe avere ripercussioni gravissime sulla sicurezza degli utenti. In quel caso, è sempre buona norma dispensare le informazioni col contagocce e spiegare solo a problema risolto.
Il secondo modo, invece, porterà inevitabilmente alla domanda da un milione di dollari:
Quando risolverete il problema?
E qui scatta a chiunque la molla del VAFFANCULOPEZZODIMERDANONMIROMPERELEPALLECHEGIAHOIMIEICASINIDARISOLVERECIMANCHISOLOTU, specialmente se il servizio è gratuito. Reazione comprensibilissima, per carità, ma che non deve durare più di 5 millisecondi e che non deve assolutamente diventare di pubblico dominio.
A mio avviso, in una situazione di crisi bisogna osservare alcune semplici regole:
- spiegare onestamente all'utenza quale problema si sta verificando e quali sono i tempi previsti per la risoluzione (se ce ne sono, altrimenti ammettere tranquillamente di non sapere quanto tempo ci vorrà);
- mordersi le dita prima di rispondere male ad un utente, anche al più insistente;
- staccarsi le dita prima di limitare l'accesso ad un utente che chiede spiegazioni (questa è in assoluto la peggior cazzata che si possa fare);
- se non si è in grado di reggere la pressione lasciare che siano altri ad occuparsi del crisis management;
- risolvere il problema nel minor tempo possibile :-)
Insomma...
... s'è dimesso o no?
QuickLaTeX
Lo so, le formule sono allineate alla cazzo, appena avrò dieci minuti di tempo le sistemerò. Risolto (era un bug del plugin).
Giochini in Erlang
Esempio rubato spudoratamente da OpenDLM:
-module(dig_test).
-export([run_test/0]).
-export([init/0]).
-spec(run_test() -> pid()).
run_test() ->
spawn(?MODULE, init, []).
-spec(init() -> none()).
init() ->
TWFG = digraph:new(),
%% Simulate the same TWFG present in OpenDLM specs
C1 = add_client(TWFG, c1),
R1 = add_resource(TWFG, r1),
C2 = add_client(TWFG, c2),
R2 = add_resource(TWFG, r2),
R3 = add_resource(TWFG, r3),
C3 = add_client(TWFG, c3),
digraph:add_edge(TWFG, C1, R1),
digraph:add_edge(TWFG, R1, C2),
digraph:add_edge(TWFG, C2, R2),
digraph:add_edge(TWFG, C2, R3),
digraph:add_edge(TWFG, R2, C3),
digraph:add_edge(TWFG, R3, C1),
detect_deadlock_for(TWFG, R1),
digraph:delete(TWFG),
exit(normal).
-spec(add_client(digraph(), atom()) -> digraph:vertex()).
add_client(WaitForGraph, ClientName) ->
add_vertex(WaitForGraph, {client, ClientName}).
-spec(add_resource(digraph(), atom()) -> digraph:vertex()).
add_resource(WaitForGraph, ResourceName) ->
add_vertex(WaitForGraph, {resource, ResourceName}).
-spec(add_vertex(digraph(), term()) -> digraph:vertex()).
add_vertex(WaitForGraph, Label) ->
Vertex = digraph:add_vertex(WaitForGraph),
digraph:add_vertex(WaitForGraph, Vertex, Label).
-spec(detect_deadlock_for(digraph(), digraph:vertex()) -> ok).
detect_deadlock_for(WaitForGraph, Vertex) ->
case digraph:get_cycle(WaitForGraph, Vertex) of
false ->
io:format("No deadlocks detected for ~p~n", [vertex_name(WaitForGraph, Vertex)]);
VList ->
io:format("Deadlock detected between ~p~n", [vertices_names(WaitForGraph, VList)])
end.
-spec(vertex_name(digraph(), digraph:vertex()) -> term()).
vertex_name(WaitForGraph, Vertex) ->
{_, Name} = digraph:vertex(WaitForGraph, Vertex),
Name.
-spec(vertices_names(digraph(), nil() | [digraph:vertex()]) -> nil() | [term()]).
vertices_names(WaitForGraph, VList) ->
vertices_names(WaitForGraph, VList, []).
-spec(vertices_names(digraph(), nil() | [digraph:vertex()], nil() | [term()]) -> nil() | [term()]).
vertices_names(_WaitForGraph, [], Acc) ->
lists:reverse(Acc);
vertices_names(WaitForGraph, [Vertex|Tail], Acc) ->
vertices_names(WaitForGraph, Tail, [vertex_name(WaitForGraph, Vertex)|Acc]).
(se vi state chiedendo perché TWFG non varia, la risposta è che digraph usa ETS per mantenere lo stato del grafo).
Yet another switch
Stavolta da lighttpd a nginx. Appena ho 5 minuti di tempo posto un po' di dettagli.
Pretendo spiegazioni
Fino a 20 minuti fa l'adsl funzionava regolarmente, portante a circa 5 Mbps downstream. Di botto la connessione si resetta, la portante non syncha a più di 1.8 Mbps e ho questi valori di rumore e attenuazione:
relative capacity occupation: 99%
noise margin downstream: 12.0 db
output power upstream: 12.0 dbm
attenuation downstream: 40.0 db
A questo punto, PRETENDO delle spiegazioni da Telecom.
E no, eh...
PID: 349
Process: WindowServer
Kernel stack:
machine_switch_context (in /mach_kernel) + 753 (0x2a6a37)
thread_dispatch (in /mach_kernel) + 1966 (0x226e4b)
thread_block_reason (in /mach_kernel) + 331 (0x2270ea)
thread_block (in /mach_kernel) + 33 (0x227178)
lck_mtx_sleep (in /mach_kernel) + 87 (0x22193c)
IOLockSleep (in /mach_kernel) + 39 (0x52a716)
0x0097fe90 (0x97fe90)
0x00994e5c (0x994e5c)
shim_io_connect_method_structureI_structureO (in /mach_kernel) + 350 (0x561322)
IOUserClient::externalMethod(unsigned int, IOExternalMethodArguments*, IOExternalMethodDispatch*, OSObject*, void*) (in /mach_kernel) + 894 (0x562422)
is_io_connect_method (in /mach_kernel) + 467 (0x562c9c)
iokit_server_routine (in /mach_kernel) + 4669 (0x28499c)
ipc_kobject_server (in /mach_kernel) + 244 (0x21d7eb)
ipc_kmsg_send (in /mach_kernel) + 111 (0x210977)
mach_msg_overwrite_trap (in /mach_kernel) + 274 (0x216bda)
thread_setuserstack (in /mach_kernel) + 405 (0x293dd1)
lo64_mach_scall (in /mach_kernel) + 77 (0x29f48d)
User stack:
mach_msg_trap (in libSystem.B.dylib) + 10 (0x7fff8077b75a)
io_connect_method (in IOKit) + 490 (0x7fff8884b166)
IOConnectCallMethod (in IOKit) + 325 (0x7fff888098c8)
gldCreateBuffer (in ATIRadeonX2000GLDriver) + 317 (0x1122c2bfd)
gldFinish (in ATIRadeonX2000GLDriver) + 12916 (0x1122da474)
gldDestroyVertexArray (in ATIRadeonX2000GLDriver) + 587 (0x1122d56fb)
gldGetTextureLevelImage (in ATIRadeonX2000GLDriver) + 192880 (0x11233a9a0)
gldGetTextureLevelImage (in ATIRadeonX2000GLDriver) + 193712 (0x11233ace0)
gldUpdateDispatch (in ATIRadeonX2000GLDriver) + 65969 (0x1122f9581)
gldUpdateDispatch (in ATIRadeonX2000GLDriver) + 66508 (0x1122f979c)
gldUpdateDispatch (in ATIRadeonX2000GLDriver) + 98523 (0x1123014ab)
gldUpdateDispatch (in ATIRadeonX2000GLDriver) + 1144 (0x1122e9848)
gleDoDrawDispatchCore (in GLEngine) + 259 (0x1121d92f5)
glBegin_Exec (in GLEngine) + 104 (0x112116aea)
_CGXGLCompositeLayer_ (in CoreGraphics) + 6583 (0x7fff81c5786f)
_CGXGLCompositeLayers (in CoreGraphics) + 1177 (0x7fff81c55def)
CGXGLAccelComposite (in CoreGraphics) + 794 (0x7fff81c552cd)
CGLayerComposite (in CoreGraphics) + 242 (0x7fff81c54272)
CGXUpdateDisplay (in CoreGraphics) + 7110 (0x7fff81c300cc)
_CGXRunTimerPass (in CoreGraphics) + 344 (0x7fff81c28e6c)
CGXRunOneServicesPass (in CoreGraphics) + 138 (0x7fff81c3fd77)
CGXServerLoop (in CoreGraphics) + 139 (0x7fff81c48e8e)
CGXGetRootAdminCredentials (in CoreGraphics) + 0 (0x7fff81c13956)
main (in WindowServer) + 9 (0x100000f29)
start (in WindowServer) + 52 (0x100000f18)
0x00000002 (in WindowServer) (0x2)
Ora, non vorrei dire qualcosa, ma è la 2130989432esima volta che mi s'inchioda l'iMac con 10.6.3, ed è la seconda volta che catturo lo stesso stacktrace di WindowServer. Qualcosa mi dice che Apple ha fatto un piiiiiccolo SNAFU nel passaggio da 10.6.2 a 10.6.3.
Speriamo che 10.6.4 + reset della PRAM abbiano risolto il problema...
Lighttpd e IPv6: workaround per gli indirizzi v4mapped
Da un po di tempo ho abilitato IPv6 su lighttpd, in modo tale da rendere raggiungibili sia il mio blog che devel.azzurra.org da chi utilizza connettività IPv6. Questa "genialata", però, ha causato un po' di casino con i logfile, perché lighttpd NON apre due socket (uno v4 e uno v6), bensì apre un singolo socket v6 e si aspetta che il sistema operativo permetta l'utilizzo dei malefici indirizzi v4mapped (per chi è a digiuno di IPv6, indirizzi del tipo ::ffff:NNN.NNN.NNN.NNN).
Leggendo il bugreport relativo, ho trovato uno squisito scambio di battute tra un certo sysadmin italiano ed uno degli sviluppatori di lighttpd che ha tagliato corto dicendo "se non volete gli indirizzi v4mapped aprite due socket, non ho intenzione di cambiare il codice".
In sostanza, quindi, il modo migliore per far funzionare un server dual-stack IPv4-IPv6 è di avere queste righe nel file di configurazione:
server.use-ipv6 = "enable"
server.port = 80
server.bind = "[::1]"
$SERVER["socket"] == "0.0.0.0:80" { }
$SERVER["socket"] == "[2001:41d0:1:89df::1]:80" { }
sostituendo a 2001:41d0:1:89df::1 il vostro indirizzo IPv6 su cui volete porre in ascolto lighttpd. Lo stesso procedimento vale per SSL.
Assurdo? Sì. Lo risolveranno? Credo di no.
Scala di intensità sismica Aquilana
- Essiju
- bottarella
- bella botta
- sileppa
- slenghera
- saraga
- petenga
- 'ngulallazia
Si ringrazia Angelo De Nicola per aver condiviso questa perla su Il Messaggero :)
CNCPO Fail
A quanto pare, img5.imageshack.us per il CNCPO è un gran covo di pedofili, visto che il sito suddetto da alcuni giorni è nella famigerata lista nera dei siti i cui record DNS sono sottoposti all'hijacking di stato.
Mi viene da chiedermi se chi ha ordinato l'inserimento in blacklist si sia accorto che in fondo ad ogni immagine c'è il tasto "Report Abuse".
O se sia stato minimamente sfiorato dal dubbio che su quel server ci sono (decine di) migliaia di immagini perfettamente legittime.
Per contro, ho preso 30 a Sistemi Operativi, quindi chissenefrega :D
Sputtanamenti
Mai e poi mai fare commenti di un certo tipo se si hanno scheletri nell'armadio
(Grazie a Md per aver condiviso questa perla)
Anno nuovo, template nuovo
Sono in vena di esperimenti...
Questo template fa schifo oppure posso tenerlo?
(PS: almeno questo è XHTML 1.0 Transitional valido - quando mi ricordo di scrivere decentemente i post, ovvio)
(PPS: il CSS non viene validato per via di una cazzata chiamata IE...come non detto, con un po' di olio di gomito e "qualche" modifica a mano ora anche il CSS è valido)
La gran madre di tutte le minchiate
E noi ci crediamo che è una notizia dell'ANSA...
---EDIT---
A quanto pare, era veramente una notizia ANSA riservata agli abbonati e passata su La Nuova Sardegna.
Mi chiedo se l'ANSA verifichi le fonti (o quantomeno che i presunti "giornalisti" siano tali, ma vabbè...).




