Preserving movies with a Raspberry Pi

Kinograph: preserving 1920s movies with a Raspberry Pi

3 comments Tags: 3 hours agoby liz

submit to reddit

A great motivator for us in developing the Raspberry Pi was bringing down the cost of computing. Nobody should be excluded from being able to learn about computing, or from using it for work or pleasure, by what’s in their pocket.

The pricing of electronics means that some important and useful tools have historically been outside the reach of anyone without a large chunk of capital behind them. You’ll have seen the photography hacks we feature here, which use a Pi to make very, very inexpensive versions of photography equipment like time-lapse rigs, gigapixel rigs, water droplet setups and the like. Off-the-shelf versions of equipment like this can cost thousands of pounds, but a Pi and some ingenuity can bring the cost right down to levels which are sensible and affordable. These projects are not just for amateurs: we have seen professional photographers using Pi-based, home-hacked equipment in preference to the expensive stuff. It works just the same, and there’s a lot to be said for the warm glow you get from making your work tools yourself.

It’s not just individuals and small businesses who are sometimes priced out of doing worthwhile stuff by the price of electronics. Libraries, museums and other public institutions are often priced out of being able to digitise collections by the prohibitive cost of equipment.

Isolating audio

Kinograph is an astonishing thesis project from Matthew Epler, an artist and film historian. It’s a Pi-powered, open-source, scalable device for digitising old film stock, complete with the ability to stabilise images (another application for OpenCV) and recapture sound. A good DSLR camera is the most expensive part of the setup, at about $2000; the rest of the equipment comes to $1200. (Matthew is working on getting that figure down below the magic $1000.) Compare that to the $480,000 it would cost you to digitise 50 films on reels at a film lab, or the $175,000 it’d cost you to buy a Kinetta (the nearest commercial equivalent device) and a whole world of possibilities opens up. Film stock, be it celluloid, acetate or nitrate based, is not stable, and being able to record and save our film heritage is a pressing concern. We’ve already lost more than 90% of all silent movies, and around 50% of the films with audio made before 1950.

Kinograph at work – note the 3D printed rollers

I have what could probably be called a bit of an old movie problem; my bedroom wall has framed pictures of pre-talkies Norma Shearer, Lupe Velez and Anna May Wong, like the bedroom of a teenager who’s been time-shifted 90 years. I howl with frustration at poor Eben, who has to share that bedroom, when I read the synopses of pre-code movies I’d give my right arm to see, which have gone forever. We’ve got shelves of books on silent movies, along with boxes of DVDs and old fan magazines. That the Raspberry Pi is a part of this project makes me unspeakably proud.

Here’s a two and a half minute video about the technology.

Matthew is working to iron out a few remaining bugs and to bring the cost down further. He expects to be posting the materials, instructions, and code online at the end of July. Watch this space!

Fonte: Raspberry PI .org

How-To: LED Photo Lights

What do you use to light small objects you’re trying to photograph? MAKE contributing editor and author of the bestselling Make: Electronics book Charles Platt found that electronic flash is overkill and photo lights are too bulky and hot, so he built an array of miniature LED photo lights and shared the how-to with us in MAKE Volume 34.

From Charles’ intro:

On eBay I found complete LED reflector bulbs for just $3 each. They are plug-compatible and identical in size and packaging to the little 12V quartz-halogen spotlights often used in track lighting (although the LEDs have a cooler light temperature of 6,000 Kelvin–very similar to cloudy daylight). … Since each unit was rated at 4W, I needed a 12VDC AC adapter rated to supply at least 40W. Fortunately this kind of switching power supply is commonly available as a power source for laptops and LED displays. I found a 50W unit for $5.

How to mount the lights? I wanted to use them in two sets of five, so that I could position each set on opposite sides of a subject. The angle of each individual light had to be adjustable, so that I could focus their combined beams around a small object, or point them at a larger object from farther away. I also wanted to be able to angle the lights up and down, or backward toward a reflective photographic umbrella if I needed diffuse, shadowless illumination.

The design that I came up with uses jointed arms, made from 3/4″ oak and small aluminum angle brackets. Originally, the lights push-fitted onto a 3/8″ brass peg. I later changed the design so that they screwed onto a ¼-20 threaded stud, which is a more common termination on a photographic light stand (plus it fits on a tripod). If you don’t have light stands or extra tripods, you can easily improvise something from a vertical 1″ dowel screwed into a plywood base.

Essentially, you cut the wood and aluminum angle to size, make the brackets, mount the lights, wire it up, test, and you’re ready to shoot. Below is a general visual overview. Check out Charles’ full LED Photo Lights how-to for the details.

led photo lights wood diagram

led photo light bracket

led photo light mounted

led photo light mounted2

led photo light diagram

led photo light mounted3

led photo lights2

Fonte: Makezine

Le minacce alle applicazioni Web

OWASP ha appena aggiornato la classifica relative alle minacce per la sicurezza ritenute maggiormente critiche. Ecco la “Top 10”.

Fonte: Michele Nasi – www.ilsoftware.it

17 Giugno 2013

La Open Web Application Security Project (OWASP) è una fondazione senza scopo di lucro che incentra le sue attività sulla produzione di risorse, articoli e materiale relativo a problematiche collegate con la sicurezza informatica. Non affiliata con alcuna società, OWASP può contare sul supporto di una comunità di collaboratori a livello mondiale.
A distanza di tre anni (le precedenti indagini risalivano al 2004, al 2007 ed al 2010), OWASP ha appena aggiornato la classifica relative alle minacce per la sicurezza ritenute maggiormente critiche.

La “OWASP Top 10 2013” (prelevabile cliccando qui; file in formato PDF) si propone come un valido aiuto per professionisti e realtà aziendali. L’obiettivo è quello di diffondere una maggiore consapevolezza sulle minacce informatiche e favorirne una più corretta gestione.

Di seguito le problematiche che OWASP menziona in ordine di importanza: vediamone in breve il significato.

1° Injection Flaws (in 1° posizione nel 2010)
Si chiama “SQL injection” una particolare pratica di hacking che mira a colpire applicazioni web che si appoggiano a DBMS (ad esempio, MySQL, SQL Server, Oracle, Access e così via) per la memorizzazione e la gestione di dati. L’attacco si concretizza quando l’aggressore riesce ad inviare, semplicemente usando il browser, una query SQL arbitraria all’applicazione web.
Quando i dati inviati in input non vengono opportunamente filtrati, l’interrogazione SQL ricevuta in ingresso dalla pagina web, potrebbe essere “agganciata” alla query effettuata a livello server dall’applicazione web. I risultati possono essere drammatici: l’aggressore, nel caso in cui l’attacco dovesse andare a buon fine, può essere in grado di alterare dati memorizzati nel database, aggiungere informazioni maligne nelle pagine web dinamiche generate a partire dal contenuto della base dati, modificare username e password.

2° Broken Authentication and Session Management (in 3° posizione nel 2010)
Le credenziali di autenticazione e i “session token” sono spesso non adeguatamente difesi.
Un “session token” è un identificatore univoco, solitamente prodotto nella forma di un valore di hash, che viene generato ed inviato dal server al client in modo tale da stabilire la corrente sessione di lavoro. Il client memorizza ed invia il token come un cookie HTTP trasmettendolo come parametro nelle query GET e POST.
Un aggressore può sfruttare le “lacune” nella gestione di questi dati per modificare password, chiavi od assumere identità altrui.

3° Cross Site Scripting (XSS) (in 2° posizione nel 2010)
Una vulnerabilità XSS si presenta nel momento in cui un’applicazione prende in carico i dati ricevuti in ingresso reinviandoli poi al browser web senza operare una validazione dell’input o senza codificarlo in alcun modo.
Malintenzionati possono sfruttare falle XSS per eseguire script nocivi attraverso il browser web dell’utente, sottraendo dati di autenticazione, invocando il download di malware, modificando porzioni del sito web visitato.

4° Insecure Direct Object Reference (in 4° posizione anche nel 2010)
Il problema di sicurezza si verifica nel momento in cui lo sviluppatore espone in chiaro dei riferimenti ad oggetti-chiave come file, directory, database, chiavi. L’aggressore potrebbe manipolare questi riferimenti per accedere ad altri oggetti senza alcuna autorizzazione.

5° Security Misconfiguration (in 6° posizione nel 2010)
Una configurazione lato server sicura è sempre la chiave di volta per non avere problemi di sicurezza. I software installati debbono essere sempre mantenuti aggiornati e le impostazioni di applicazioni, framework, software server, database server e sistemi operativi vanno sempre revisionate per accertarsi della loro adeguatezza.

6° Sensitive date exposure (non in classifica nel 2010)
I tecnici di OWASP fanno riferimento alla scarsa protezione dei dati sensibili conferiti dagli utenti che viene offerta da molte applicazioni web. Il rischio che si corre, in questo caso, è che un aggressore si impadronisca di informazioni sulle carte di credito e sulle credenziali di autenticazione appartenenti ad altri utenti.

7° Missing Function Level Access Control (non in classifica nel 2010)
Un’applicazione web generalmente effettua il controllo delle credenziali d’accesso di un utente e visualizza, di conseguenza, gli strumenti che possono essere utilizzati con quello specifico account. La disponibilità dei permessi per l’utilizzo di ogni specifica funzione dev’essere controllata anche nel momento in cui l’utente richiede l’accesso alla funzione stessa.

8° Cross Site Request Forgery (CSRF) (in 5° posizione nel 2010)

Si tratta di un attacco che si concretizza inviando ad una applicazione web delle richieste sfruttando le autorizzazioni di un utente “trusted”, ad esempio una persona che abbia effettuato il login su un determinato sito web.
Supponiamo che l’utente Bob sia loggato su un sito web di una banca e che, non effettuando il login, egli acceda – ad esempio – ad una pagina web dove il malintenzionato Mallory ha pubblicato un messaggio. Il messaggio preparato da Mallory contiene, ad esempio, una tag html IMG che fa riferimento ad uno script residente sul server della banca di Bob.
Visitando la pagina “dannosa”, Bob potrebbe quindi inconsapevolmente dare il via ad un’operazione che lui non ha richiesto.
Ecco perché è sempre consigliabile effettuare il logout da qualsiasi servizio online si stia utilizzando.
Un esempio su tutti? La vulnerabilità CSRF scoperta dal ricercatore Petko D. Petkov a fine 2007 all’interno del servizio Google GMail.
In alcune schermate dimostrative pubblicate sul sito Gnucitizen.org, Petkov illustrò una possibile forma di attacco: “nell’esempio, l’aggressore prepara un filtro aggiuntivo che permette di estrarre le e-mail con allegato e le inoltra ad un altro indirizzo e-mail di sua scelta”, dichiarò il ricercatore. Un attacco potrebbe innescarsi nel momento in cui l’utente visiti un sito web maligno, opportunamente sviluppato per far leva sulla lacuna di sicurezza, rimanendo loggato al servizio GMail. Il sito maligno avvierà poi quello che Petkov definisce “multipart/form-date POST“, un comando che può essere impiegato per caricare file, inviandolo all’application programming interface di GMail. L’aggressore avrà la possibilità di “iniettare” un filtro personalizzato a quelli usati da GMail.
La vittima dell’attacco sarà costantemente “sotto scacco” (la sua posta elettronica, nell’esempio, continuerà ad essere inoltrata a terzi, a sua insaputa e senza la sua autorizzazione) finché il filtro “maligno” sarà presente nella scheda Impostazioni, Filtri del servizio GMail. Google, da parte sua, comunicò poi di aver risolto il problema.

9° Using Components with Known Vulnerabilities (non in classifica nel 2010)
L’utilizzo di applicazioni e componenti che presentano vulnerabilità di sicurezza è sempre da evitare. Un aggressore può infatti sfruttarle per acquisire privilegi più elevati o per eseguire codice in modalità remota.

10° Unvalidated Redirects and Forwards (al decimo posto anche nel 2010)
Le applicazioni web reindirizzano frequentemente il browser verso altre pagine od altri siti web. Talvolta il dato relativo alla destinazione non viene sottoposto ad un’adeguata attività di validazione. In questo modo, può capitare che gli aggressori siano in grado di reindirizzare le vittime verso siti contenenti malware o pagine utilizzate per attacchi phishing.

Fonte: http://searchsecurity.techtarget.it/01NET/HP/0,1254,18_ART_154409,00.html

Line Break Removal Tool

Rimuovere i ritorni a capo, i carriage return,

You can remove line breaks from blocks of text but preserve paragraph breaks with this tool.

If you’ve ever received text that was formatted in a skinny column with line breaks at the end of each line, like text from an email, an XML file or copy and pasted text from a PDF column then this tool is pretty darn handy.

You also have the option of just removing all line breaks from your XML, PDF or whatever text without preserving paragraph breaks.

Use this tool because spending hours manually removing line breaks sucks. Manually removing line breaks really really sucks.

http://www.textfixer.com/tools/remove-line-breaks.php

Creating Different CSS3 Box Shadows Effects

In this tutorial we are going to be creating box shadow effects with just CSS. Below is an image created in photoshop of different box shadows effects. These used to be the only way of creating this effect but thanks to CSS3 we can now do all this with just CSS.

View Demo page to see what we are going to create
CSS Box Shadow Effects Demo

Web Shadows Package

CSS Box Shadow

We are going to be using the CSS box shadow property which is one my favourite CSS properties which you will see in this tutorial how easy you can use it.

The box-shadow property allows you to easily create multiple drop shadows on box elements by specifying values for colour, size, blur and offset.

The box-shadow property accepts 2-4 options, the required options are horizontal offset and vertical offset, the two optional options are spread distance and colour.

box-shadow: horizontal vertical spread colour;

Examples

box-shadow: 10px 10px;
box-shadow: 10px 10px 5px #888;
box-shadow: inset 2px 2px 2px 2px black;
box-shadow: 10px 10px #888, -10px -10px #f4f4f4, 0px 0px 5px 5px #cc6600;

Browser Support

All of the major newest browsers support box-shadow property.

  • Internet Explorer 9.0 and higher
  • Firefox 3.5 and higher
  • Chrome 1 and higher
  • Safari 3 and higher
  • Opera 10.5 and higher

With many new CSS3 properties you need to prefix the property with browser specific tags.

For firefox you need to use -moz-, for chrome/safari you need to use -webkit.

The box-shadow property is no different.

For Firefox 3.5 you need to prefix with -moz-boz-shadow, but for Firefox 4.0 and higher you don’t need to use the prefix anymore.

For Chrome/safari you still need to use the -webkit-box-shadow.

For opera you don’t need to prefix the property and can just use box-shadow.

CSS Box Shadow Effect 1

CSS Box Shadow Effects1

This will create a standard box shadow effect with the shadow moved into the element to create a raised box look.

The HTML

<div>
<h3>Effect 1</h3>
</div>

The CSS

.box h3{
	text-align:center;
	position:relative;
	top:80px;
}
.box {
	width:70%;
	height:200px;
	background:#FFF;
	margin:40px auto;
}
/*==================================================
 * Effect 1
 * ===============================================*/
.effect1{
	-webkit-box-shadow: 0 10px 6px -6px #777;
	   -moz-box-shadow: 0 10px 6px -6px #777;
	        box-shadow: 0 10px 6px -6px #777;
}

CSS Box Shadow Effect 2

CSS Box Shadow Effects2

This effect will add shadows to the bottom corners of the boxes to create a lifted corner look on the boxes. This effect uses both the :before and :after properties to create new elements used for the corners.

The HTML

<div>
<h3>Effect 2</h3>
</div>

The CSS

.box h3{
	text-align:center;
	position:relative;
	top:80px;
}
.box {
	width:70%;
	height:200px;
	background:#FFF;
	margin:40px auto;
}
/*==================================================
 * Effect 2
 * ===============================================*/
.effect2
{
  position: relative;
}
.effect2:before, .effect2:after
{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 15px;
  left: 10px;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777;
  -webkit-box-shadow: 0 15px 10px #777;
  -moz-box-shadow: 0 15px 10px #777;
  box-shadow: 0 15px 10px #777;
  -webkit-transform: rotate(-3deg);
  -moz-transform: rotate(-3deg);
  -o-transform: rotate(-3deg);
  -ms-transform: rotate(-3deg);
  transform: rotate(-3deg);
}
.effect2:after
{
  -webkit-transform: rotate(3deg);
  -moz-transform: rotate(3deg);
  -o-transform: rotate(3deg);
  -ms-transform: rotate(3deg);
  transform: rotate(3deg);
  right: 10px;
  left: auto;
}

CSS Box Shadow Effect 3

CSS Box Shadow Effects3

This uses half of the effect approve and will add a lifted corner to the bottom left of the box.

The HTML

<div>
<h3>Effect 3</h3>
</div>

The CSS

.box h3{
	text-align:center;
	position:relative;
	top:80px;
}
.box {
	width:70%;
	height:200px;
	background:#FFF;
	margin:40px auto;
}
/*==================================================
 * Effect 3
 * ===============================================*/
.effect3
{
  position: relative;
}
.effect3:before
{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 15px;
  left: 10px;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777;
  -webkit-box-shadow: 0 15px 10px #777;
  -moz-box-shadow: 0 15px 10px #777;
  box-shadow: 0 15px 10px #777;
  -webkit-transform: rotate(-3deg);
  -moz-transform: rotate(-3deg);
  -o-transform: rotate(-3deg);
  -ms-transform: rotate(-3deg);
  transform: rotate(-3deg);
}

CSS Box Shadow Effect 4

CSS Box Shadow Effects4

Effect 4 will lift the corner on the bottom right of the box.

The HTML

<div>
<h3>Effect 4</h3>
</div>

The CSS

.box h3{
	text-align:center;
	position:relative;
	top:80px;
}
.box {
	width:70%;
	height:200px;
	background:#FFF;
	margin:40px auto;
}
/*==================================================
 * Effect 4
 * ===============================================*/
.effect4
{
  position: relative;
}
.effect4:after
{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 15px;
  right: 10px;
  left: auto;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777;
  -webkit-box-shadow: 0 15px 10px #777;
  -moz-box-shadow: 0 15px 10px #777;
  box-shadow: 0 15px 10px #777;
  -webkit-transform: rotate(3deg);
  -moz-transform: rotate(3deg);
  -o-transform: rotate(3deg);
  -ms-transform: rotate(3deg);
  transform: rotate(3deg);
}

CSS Box Shadow Effect 5

CSS Box Shadow Effects5

This is expands on the effect 2 and will increase the angle of the shadows.

The HTML

<div>
<h3>Effect 5</h3>
</div>

The CSS

.box h3{
	text-align:center;
	position:relative;
	top:80px;
}
.box {
	width:70%;
	height:200px;
	background:#FFF;
	margin:40px auto;
}
/*==================================================
 * Effect 5
 * ===============================================*/
.effect5
{
  position: relative;
}
.effect5:before, .effect5:after
{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 25px;
  left: 10px;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777;
  -webkit-box-shadow: 0 35px 20px #777;
  -moz-box-shadow: 0 35px 20px #777;
  box-shadow: 0 35px 20px #777;
  -webkit-transform: rotate(-8deg);
  -moz-transform: rotate(-8deg);
  -o-transform: rotate(-8deg);
  -ms-transform: rotate(-8deg);
  transform: rotate(-8deg);
}
.effect5:after
{
  -webkit-transform: rotate(8deg);
  -moz-transform: rotate(8deg);
  -o-transform: rotate(8deg);
  -ms-transform: rotate(8deg);
  transform: rotate(8deg);
  right: 10px;
  left: auto;
}

CSS Box Shadow Effect 6

CSS Box Shadow Effects6

This effect will create a curved shadow at the bottom of the box.

The HTML

<div>
<h3>Effect 6</h3>
</div>

The CSS

.box h3{
	text-align:center;
	position:relative;
	top:80px;
}
.box {
	width:70%;
	height:200px;
	background:#FFF;
	margin:40px auto;
}
/*==================================================
 * Effect 6
 * ===============================================*/
.effect6
{
  	position:relative;
    -webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
       -moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
            box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
}
.effect6:before, .effect6:after
{
	content:"";
    position:absolute;
    z-index:-1;
    -webkit-box-shadow:0 0 20px rgba(0,0,0,0.8);
    -moz-box-shadow:0 0 20px rgba(0,0,0,0.8);
    box-shadow:0 0 20px rgba(0,0,0,0.8);
    top:50%;
    bottom:0;
    left:10px;
    right:10px;
    -moz-border-radius:100px / 10px;
    border-radius:100px / 10px;
}

CSS Box Shadow Effect 7

CSS Box Shadow Effects7

This effect uses the previous effect and adds another shadow to the top of the box.

The HTML

<div>
<h3>Effect 7</h3>
</div>

The CSS

.box h3{
	text-align:center;
	position:relative;
	top:80px;
}
.box {
	width:70%;
	height:200px;
	background:#FFF;
	margin:40px auto;
}
/*==================================================
 * Effect 7
 * ===============================================*/
.effect7
{
  	position:relative;
    -webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
       -moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
            box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
}
.effect7:before, .effect7:after
{
	content:"";
    position:absolute;
    z-index:-1;
    -webkit-box-shadow:0 0 20px rgba(0,0,0,0.8);
    -moz-box-shadow:0 0 20px rgba(0,0,0,0.8);
    box-shadow:0 0 20px rgba(0,0,0,0.8);
    top:0;
    bottom:0;
    left:10px;
    right:10px;
    -moz-border-radius:100px / 10px;
    border-radius:100px / 10px;
}
.effect7:after
{
	right:10px;
    left:auto;
    -webkit-transform:skew(8deg) rotate(3deg);
       -moz-transform:skew(8deg) rotate(3deg);
        -ms-transform:skew(8deg) rotate(3deg);
         -o-transform:skew(8deg) rotate(3deg);
            transform:skew(8deg) rotate(3deg);
}

CSS Box Shadow Effect 8

CSS Box Shadow Effects8

The final effect will add rounded shadows to either side of the box.

The HTML

<div>
<h3>Effect 8</h3>
</div>

The CSS

.box h3{
	text-align:center;
	position:relative;
	top:80px;
}
.box {
	width:70%;
	height:200px;
	background:#FFF;
	margin:40px auto;
}
/*==================================================
 * Effect 8
 * ===============================================*/
.effect8
{
  	position:relative;
    -webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
       -moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
            box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
}
.effect8:before, .effect8:after
{
	content:"";
    position:absolute;
    z-index:-1;
    -webkit-box-shadow:0 0 20px rgba(0,0,0,0.8);
    -moz-box-shadow:0 0 20px rgba(0,0,0,0.8);
    box-shadow:0 0 20px rgba(0,0,0,0.8);
    top:10px;
    bottom:10px;
    left:0;
    right:0;
    -moz-border-radius:100px / 10px;
    border-radius:100px / 10px;
}
.effect8:after
{
	right:10px;
    left:auto;
    -webkit-transform:skew(8deg) rotate(3deg);
       -moz-transform:skew(8deg) rotate(3deg);
        -ms-transform:skew(8deg) rotate(3deg);
         -o-transform:skew(8deg) rotate(3deg);
            transform:skew(8deg) rotate(3deg);
}

Demo Page

View the demo page to see all these effects.

Fonte: paulund.co.uk

Apache Virtual Hosts in Ubuntu in 7 easy steps

In this tutorial I’ll walk you through setting up 3 Apache virtual hosts running on a single Ubuntu server. An Apache virtual host, as explained by Apache, refers to the practice of running more than one web site (such as www.company1.com and www.company2.com) on a single machine. Virtual hosts can be “IP-based” or “name-based”. By default, Ubuntu already has this capability enabled, so things are much easier to configure these days. Enough with the intro, this is how you do it:

LAST UPDATE:
 It's May 2014 and Ubuntu 14.04 has been out for a little while.
Navigate to /etc/apache2/sites-available and see what's there. 
In the past the default website file has just been named "default" while later it was "default.conf" yet now it is "000-default.conf."
 "sudo a2dissite 000-default.conf" disables the default web site, allowing you to promote another one in its place.

We are going to create 3 sites, site1.com, site2.com and site3.com

1. Create the folders that will host your new sites. By default, Apache in Ubuntu serves from /var/www. So create these:

mkdir /var/www/site1
mkdir /var/www/site2
mkdir /var/www/site3

2. Copy the current default setting found in /etc/apache2/sites-available/default and name it the same as your new site.

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/site1
cp /etc/apache2/sites-available/default /etc/apache2/sites-available/site2
cp /etc/apache2/sites-available/default /etc/apache2/sites-available/site3

3. Edit the new config files for each site using your preferred text editor. Add the line ServerName server1 right below the ServerAdmin line and change both DocumentRoot and Directory to point to your new sites.
This is what it should look like (you’ll do exactly the same for each of your 3 new sites, repeat this step for as many new sites as you’ll be creating):

/etc/apache2/sites-available/site1

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName YOURDOMAIN.YOU
  DocumentRoot /var/www/YOURDOMAINFOLDER (without slash trail)
 <Directory />
  Options FollowSymLinks
  AllowOverride None
 </Directory>
 <Directory /var/www/YOURDOMAINFOLDER/> (WITH slash trail)
  Options Indexes MultiViews
  AllowOverride None
  Order allow,deny
  allow from all
 </Directory>
</VirtualHost>

4. After you have edited the config files for each of the 3 or how many virtual hosts you are creating, just tell Apache to start serving the new domains and stop serving the default:

sudo a2ensite site1
sudo a2ensite site2
sudo a2ensite site3
sudo a2dissite default
note: (a2ensite, a2dissite - enable or disable an apache2 site / virtual host)

5. Now reload apache and you should be able to get to each of your new domains:

sudo /etc/init.d/apache2 reload

6. At this point the virtual host setup is done, all that is left is to tell the server that our-test-site.local should be resloved to 127.0.0.1.
We do that by typing

sudo gedit /etc/hosts

and adding 127.0.0.1 our-test-site.local after the localhost (line 1).

The entire hosts file should look like

127.0.0.1   localhost
127.0.0.1   YOURDOMAIN.YOU
127.0.1.1   ubuntu-vm

7. Save it, close the editor and finally type

sudo /etc/init.d/apache2 restart

Pay attention… to the user’s permissions !!!

Cercare e sostituire ricorsivamente una parola in più file

 

Il sistema operativo Linux offre molteplici strumenti per la gestione o la modifica dei file; in questo articolo mostrerò come utilizzare alcuni comandi per sostituire una o più parole all’interno di un file di testo.

Un comando piuttosto utile quando si deve sostituire una o più parole in alcuni file è questo:

sed -i ‘s/parola1/parola2/g’ *.txt

in questo modo la parola1 verrà sostituita dalla parola2 in tutti i file di testo presenti nella directory corrente.

Se però dovessimo eseguire questa sostituzione anche nei file presenti in alcune sotto cartelle allora il comando diventa:

find ./ -type f -exec sed -i ‘s/parola1/parola2/g’ {} \;

in questo caso ho fatto a meno del filtro per i file di tipo .txt e quindi verranno presi in considerazione tutti i file presenti nella directory corrente e nelle sue sottodirectory.

Con il comando find che è stata usata l’opzione “-exec”  che permette di eseguire un comando ogni volta che viene trovato un file che rispetta le regole impostate per la ricerca.

Nel caso precedente la ricerca comprende tutti gli elementi di tipo “file” ed esclude le directory.

Tutto quello che segue la direttiva “-exec” costituisce il comando da eseguire e i suoi parametri, fino al carattere “\;” che indica la fine della stringa di comando.

Un altro elemento fondamentale è il simbolo “{}” che indica il nome attuale del file trovato e che, in questo modo, essere usato come parametro dal comando che si vuole eseguire.

Nel comando precedente le parentesi graffe “{}” sono stati quotate e il carattere di fine comando è stato preceduto con uno slash “” per proteggere questi simboli dall’espansione della shell.

Il comando viene eseguito nella directory di partenza, quindi se il comando inserito prevede un output occorre tenerne conto.

Consiglio di cercare prima la parola, giusto per verificare cosa verrà trovato e sostituito:

find ./ -type f -exec grep -r “parola1” {} \;

Oppure si può usare il comando:

find ./ -type f -print0 | xargs -0 grep “parola1”

in questo modo verranno visualizzate tutte le righe che contengono la stringa indicata.

In particolare è stato usata la direttiva “-print0” che permette di avere come output il nome completo terminato da un carattere nullo. In questo modo la stringa prodotta può essere interpretata correttamente dal programma seguente.

Infatti l’output del comando find è connesso con un pipe al comando xargs il cui parametro “-0” indica che i nomi dei file ricevuti come input finiscono con un carattere nullo.

Il comando “xargs” si occupa di ricevere i nomi dei file ed eseguire il comando “grep”che a sua volta usa i parametri passati da xargs.

Se invece si vuole solo veder visualizzato il nome del file che la contiene, il comando è:

find ./ -type f -print0 | xargs -0 grep -l “parola1”

Il parametro “-l” indica che come output avremo la lista dei nomi dei file, ma non le linee, nelle sono state trovate le corrispondenze.

Faccio notare che in tutti i comandi elencati è stato ipotizzato che la ricerca avvenisse nella directory attuale e in tutte le sue sub-directory, ma se volessimo cercare in una cartella qualsiasi dovremo inserire il percorso ( relativo o assoluto):

find /home/user/ -type f | xargs grep -l “parola1”

Infine, se non fosse necessario usare dei parametri complessi per la ricerca dei file e si volesse solo ricercare ricorsivamente una parola o una frase all’interno dei file in più subdirectory, basta usare molto più semplicemente il comando grep con l’opzione “-r”:

grep “this text” *.php -r

In questo modo verrà cercata la stringa “this text” in tutti i file “.php” presenti nella directory attuale e in tutte le sue sotto directory.

Come valutare correttamente la sicurezza delle vostre reti

I suggerimenti dell’esperto

Come valutare correttamente la sicurezza delle vostre reti

Una periodica verifica delle vulnerabilità del perimetro è fondamentale per qualsiasi azienda interessata a mantenere una buona sicurezza delle proprie reti. Ecco alcuni degli esercizi da compiere.

06 Maggio 2013

Una periodica verifica delle vulnerabilità del perimetro della rete aziendale è fondamentale per qualsiasi organizzazione interessata a mantenere un buon livello di protezione delle proprie reti.

Mentre alcuni attacchi sono lanciati da addetti ai lavori che operano all’interno dell’azienda, molti hanno origine al di fuori delle organizzazioni. Questo significa che le aziende devono essere in grado di verificare i dispositivi del perimetro e assicurare che i sistemi siano correttamente aggiornati e patchati.

I test perimetrali in genere comportano la scansione della rete, l’esame dei sistemi di rilevamento delle intrusioni (IDS) e di quelli di prevenzione delle intrusioni (IPS), i test condotti sui firewall, il deployment e il test degli honeypot.

Come proteggere la rete
La scansione della rete è una delle prime attività che si dovrebbero condurre durante un test di penetrazione. Dopo tutto, bisognerebbe cercare di vedere la rete allo stesso modo in cui la vedrebbe un utente malintenzionato.
La visualizzazione della rete è, in questi casi, dall’interno verso l’esterno, ma questo non è quello che vedrebbe un attacker.
Eseguire una scansione del perimetro potrebbe aiutarvi a comprendere qual è il sistema operativo in dotazione sui dispositivi edge e qual è la loro situazione a livello di patch, vi permetterebbe di avere una miglior visibilità dei dispositivi accessibili dall’esterno della rete e anche di comprendere meglio quali sono le vulnerabilità dei certificati SSL (Secure Sockets Layer) e TLS (Transport Layer Security). Inoltre, la scansione della rete aiuta a determinare se i dispositivi accessibili dall’esterno sono adeguatamente protetti contro le vulnerabilità scoperte dal momento in cui è avvenuto il deployment del device in poi.

Soluzioni quali NMAP, uno scanner di sicurezza open source gratuito, potranno essere utilizzate per monitorare la rete: lo strumento supporta una vasta gamma di switch ed è utile per identificare le porte aperte, i servizi e i sistemi operativi vulnerabili.

Il deployment di IDS e IPS corrisponde a un altro metodo diffuso per rilevare attività sospette. La maggior parte delle aziende utilizza gli IDS o gli IPS sul perimetro della propria rete, ma si discute ancora parecchio sul fatto che questi dispositivi rappresentino dei veri e propri deterrenti ai probabili attacchi.

Ci sono diversi modi per testare le soluzioni IDS e IPS:

• Attacchi “insertion”. Si verificano quando un utente malintenzionato invia pacchetti a un sistema finale che vengono, da quest’ultimo, respinti anche se il sistema IDS ritiene siano validi. Questa situazione permette al malintenzionato di inserire dati nell’IDS, visto che nessun altro sistema si cura di controllarne la liceità e la provenienza.

• Attacchi “evasion”. Questa tecnica permette a un attaccante di ottenere che gli IDS rifiutino un pacchetto che il sistema finale, invece, accetta.

• Attacchi denial-of-service. Si verificano quando un utente malintenzionato invia così tanti dati all’IDS che il software non è più in grado di elaborarli tutti. Questo “allagamento” può favorire il traffico di file dannosi in azienda.

• Generazione di falsi positivi. Ricordate il ragazzo che gridava “al lupo, al lupo”? Questo tipo di attacco è progettato per inviare una grande quantità di dati di alert. Questi falsi positivi possono rendere più difficile l’identificazione di un vero e proprio attacco.

• Offuscamento. Un IDS deve rilevare tutte le firme maligne, indipendentemente dal loro formato. Per confondere gli IDS, gli aggressori potrebbero codificare il traffico, cifrarlo o frammentarlo in diverse parti, nel tentativo di oscurarne la presenza.

• Disaccoppiamento. Tecniche come la pre-sincronizzazione o la post-connessione possono essere utilizzate anche per nascondere il traffico dannoso.

Le aziende devono essere in grado di verificare i dispositivi che stanno sul perimetro della rete e garantire che i sistemi siano sempre aggiornati e correttamente patchati.

firewall sono un altro dispositivo perimetrale comunemente utilizzato per controllare il traffico in ingresso e in uscita.
I firewall possono essere sia stateful (se tengono traccia di alcune relazioni esistenti tra i pacchetti che lo attraversano) che stateless (se il pacchetto viene analizzato unicamente sulla base di regole preconfigurate). Entrambi possono essere testati in diversi modi.

Alcune comuni tecniche di test sono le seguenti:

• Identificazione del firewall. Le porte aperte possono contribuire a identificare quali specifiche tecnologie firewall vengono utilizzate.

• Determinare se il firewall è stateful o stateless. Tecniche semplici come la scansione ACK potrebbero aiutare a individuare il tipo di firewall in uso. La scansione ACK è una tipologia di scansione delle porte il cui scopo è scoprire quali porte sono aperte e quali filtrate su un firewall che si interpone tra la sorgente della scansione e il target. Il risultato di questa scansione non è “porta aperta” o “porta chiusa” bensì “porta filtrata” o “porta non filtrata”.

• Banner-grabbing dal firewall. Anche se non sempre efficace, alcuni firewall più vetusti possono effettivamente offrire informazioni sulla versione nel banner in uso.

Infine, ci sono gli honeypot. Questi dispositivi possono essere utilizzati per stanare e intrappolare gli aggressori o per saperne potenzialmente di più sulle loro attività. Gli honeypot si dividono in due categorie: a bassa e ad alta interazione. Gli honeypot possono essere rilevati osservando la loro funzionalità. Un buon esempio di honeypot a bassa interazione può essere visto con Netcat, un programma di utilità di rete che legge e scrive dati attraverso le connessioni di rete.

Mentre tutti quelli elencati sono i modi in cui è possibile mappare il perimetro della rete per come lo potrebbe vedere un attaccante, occorre tenere presente che molti attaccanti bypassano i dispositivi e i comandi edge agendo dall’interno verso l’esterno.

Se l’attaccante è in grado di ottenere che un utente finale arrivi a installare qualcosa dentro la rete, cliccare su un link o visitare un sito dannoso, l’utente malintenzionato potrà, quindi, instradare il traffico dall’interno verso l’esterno, cosa che è intrinsecamente più facile che non attaccare procedendo dall’esterno verso l’interno.

Fonte: http://searchsecurity.techtarget.it/

How to Select a Battery Backup for Your Computer

2013-04-22_095615

A cheap power strip might protect equipment from power surges, but it does nothing to help when the power goes out and your system comes to a halting crash. Read on as we show you how to buy the right battery backup device for your needs.

Why Do I Want to Do This?

Sudden loss of power and power surges are  two of the principle causes of damage to computers and other sensitive electronics. Even cheap power strips will do a decent enough job protecting against the power surges, but they offer no protection against drops in line voltage, brownouts, blackouts and other power supply issues.

In order to protect your computer against power supply interruptions you need a battery backup, appropriately named an Uninterruptable Power Supply (UPS). UPS units provide a buffer against power supply interruptions ranging from a few minutes to an hour or more depending on the size of the unit.

A simple way to think about the utility of a UPS unit is to think about working on a notebook computer. You’re at home, your laptop is plugged into an appropriate surge protection strip, and you’re busily finishing up some reports for work. A summer storm knocks the power out. Although the lights go out, your work on the notebook computer is uninterrupted because the notebook switched over to battery power seamlessly when the flow of electricity from the power cord vanished. You now have plenty of time to save your work and gracefully shut down your machine.

If you had been working on a desktop without a UPS unit (the desktop computer equivalent of the notebook computer’s battery) the system would come to an immediate halt. Not only would you lose your work but the process imposes unnecessary stress on your machine. In all our years of working with computers the vast majority of hardware failures can be directly attributed to the stress hardware components experience during the shut down and startup process (especially if power surges or blackouts are involved).

A UPS unit would, at minimum even with a very small unit, provide a window of time where your computer could be gracefully shut down or sent into hibernation mode and brought back online once the power outage or other power situation was resolved. If the situation is resolved while the UPS unit still has enough battery life remaining, then you can work right through the storm without interruption. Even if you’re not in direct attendance of the computer (say the computer in question is your backup server in the basement) you’re still protected as the UPS will communicate with the computer via tether and shut the machine down properly in your absence.

In both situations, a graceful shutdown or the ability to work through short interruptions in power, are vastly superior to your system being brought to a system shocking hard stop when the power goes out.

Read on as we guide you through identifying your UPS needs, calculating your UPS power requirements, and understanding the features and design types of various UPS units.

Where Do I Need UPS Units?

The UPS market is a very diverse one; you can find UPS units that range from tiny desktop units that supply enough power to keep a lightweight desktop computer running for 10 minutes without wall-supplied power to a walk-in-freezer sized units deployed in data centers to keep an entire bank of servers running through a storm.

As such it’s possible to spend anywhere from a hundred bucks on a low-end UPS unit to more than you spent on the computer itself for the UPS unit. The most important step in your UPS selection and shopping process is to sit down and chart out your power needs before spending your hard earned cash on gear that is overkill (or worse, underpowered) for your situation.

First, think about all the systems in your home or office that need the extended power protection supplied by a UPS unit, to stay online in the event of power outages, or both. Every reader will have a different setup, for the sake of example we’re going to use our home as a template to help you think about all the varied power needs found in a typical residential setting.

The most obvious system would be your desktop computer. In our case we have two desktop computers in our home–one in a home office and one in a child’s playroom.

Less obvious, but still important, are any secondary computer systems such as a home media server or network attached storage device used for local backup. In our case we have a media server/backup server in the basement.

In addition to the primary computers and auxiliary computers are there other electronic devices that you want to protect from power outages and keep online? In our case in addition to the aforementioned computers we also have a cable modem, router, and Wi-Fi node that we would like to protect from power loss. There isn’t a “graceful shutdown” equivalent for the cable modem, for example, but our particular cable modem is finicky and requires a manual reset after a power outage. Attaching it to a nearby UPS unit would add very little overhead to our UPS needs but would make sure those little micro power outages that occur during high winds and summer storms won’t send up scurrying to the data closet to reset the darn thing.

How Big of a UPS Unit Do I Need?

At the bare minimum you need enough juice in your UPS unit to give your computer system adequate time to shut down properly. That’s the absolute acceptable minimum. If your UPS unit doesn’t have enough juice to provide for the system from the moment the power cuts out until the moment it has successfully shut down, you’re risking damage to the machine and data loss.

How do we calculate the power needs of the system? The first step is examining the core system and peripherals you wish to keep on in the event of power loss.  In the case of our home server, we don’t need to calculate the peripheral load because there are no peripherals (it’s a headless server with no power needs beyond that of the hardware directly in the tower). On the other hand, our two computers (in the home office and the playroom) do have peripherals like monitors, external hard drives, etc. In the case of a power outage where you’re working at the computer, it’s worthwhile to have the battery also supply the monitor so you can interact with the machine. Don’t neglect to include the power load of peripherals when calculating your needs.

Let’s start off by determining the power needs of our home server as it is the most simple of our setups. If you want to be extremely precise with your calculations, you can use a power meter to measure the actual consumption patterns of your devices. We outline how to do so in The How-To Geek Guide to Measuring Your Energy Use.

Alternatively, you can look at the power supply rating for your computer as a measure of the maximum power the computer will pull. It’s important to note, however, that a 400w power supply is not pulling a constant load of 400w. Our home server has a 400w power supply but when measured with a Kill-a-Watt measuring tool it has a peak startup load of a little over 300w and a consistent operating load of only around 250w.

If you’re looking to be very conservative in your power estimation needs, go with the maximum rating of the PSU and peripherals (this way you’ll end up with extra battery life instead of too little battery life). Alternatively, you can increase the precision of your calculations by using a measuring device and allocate more of your budget towards UPS unit features you want and less towards buying a bigger battery.

Regardless of whether you use the less precise or more precise method, you now have a wattage value. For our calculation examples we’re going to use 400w as our value.

A simple rule-of-thumb calculation you can use to determine how much UPS is as follows:

1.6 * Wattage Load = Minimum Volt-Amperes (VA)

Volt-Amperes are the standard measurement used to describe the capacity of UPS units. Using the equation above we see that the minimum VA rating we’d want for our 400w needs would be a 640 VA rated system.

Now that we have a minimum rating, the next question on everyone’s mind is most likely: How long will that minimum system run the setup? After all you’re getting a battery backup system for your computer to keep everything running when the power is out.

Unfortunately there isn’t a super quick rule-of-thumb calculation for determining the runtime like there is for determining the necessary minimum VA. We’ll show you how to do the calculation so that you can double check manufacturer estimates if you wish, but it’s not a particular speedy or fun calculation to run through.

In order to calculate the estimate runtime of a UPS system you need to know four things: the VA rating of the UPS unit, the number of battery cells in the UPS unit, the DV voltage rating of those batteries, the capacity (or Ampere-Hours) of the batteries. Unfortunately not all of this information is easily cribbed off of a simple web site listing for the product you’re interested in running the calculation on so you’ll likely need to dig through a PDF of the manual, supplemental documents, and so on to get it all. In other words, it’s a huge pain.

Once you have all the requisite information, however, you can plug it into the following equation:

( Battery Voltage * AH Rating * Efficiency) / VA Rating =  X
X * 60 = Estimated Run Time in Minutes

So let’s pretend we’re looking at a theoretical UPS unit that has the following specs:

VA Rating: 700
Battery Voltage: 12
AH: 9
Efficiency: 0.9 (90%)

When we plug those numbers into the equation we get the following:

( 12 * 9 * 0.9 ) / 700 = 0.139
0.139 * 60 = 8.3 minutes

So this particular UPS unit could sustain the system under full load for a little over 8 minutes (longer if the system is under partial load).

We shared this exercise with you so that you can do the calculations if you wish but it’s not something we particularly recommend. It’s such an enormous hassle to dig up all the information (especially the efficiency rating); it’s much more expedient to use manufacturer estimate tables (which we’ve found to be on the conservative side anyways). You can check out the calculation/selection tools of the more popular UPS unit manufacturers here:

Practically speaking, once you’ve established the minimum VA requirement for your setup then you can go and begin comparing the run times for UPS units that meet that minimum VA requirement with higher rated systems to determine how much more you’re willing to spend to get extra run time.

Understanding the Differences Between UPS Types

So far we’ve identified where we need UPS units and how to calculate how big of a UPS unit we need. In addition to those two factors, it’s important to understand how the major UPS technologies on the market differ from each other and why two 1000 VA rated units might have a price difference of $100 or more (and what you get for that extra $$$).

There are three principle UPS design types available. The least expensive design is known as Offline/Standby UPS. If the UPS unit you’re looking at makes no mention of what type of unit it is, then it’s most likely a Standby UPS the most basic design.

Standby UPS unit charges its battery and then waits for the mains power to drop off. When that happens, the Standby UPS mechanically switches to the battery backup. This switch over takes about 20-100 milliseconds which is generally well with in the tolerance threshold of most electronics.

Line-Interactive UPS unit has a similar design to a Standby UPS unit but includes a special transformer. This special transformer makes Line-Interactive UPS units better at handling brown outs and power sags. If you live in area that has frequent brownouts or line-voltage issues (e.g. the lights frequently dim but you don’t actually lose power) it’s definitely worth the small increase in cost to purchase a Line-Interactive UPS.

An Online UPS unit is the most expensive type of UPS unit as it requires significant extra circuitry. The Online UPS unit completely isolates the devices attached to it from the wall power. Instead of jumping into action at the first sign of power out or voltage regulation issues like the Standby and Line-Interactive units, the Online UPS unit continuously filters the wall power through the battery system. Because the attached electronics run completely off the battery bank (which is being perpetually topped off by the external power supply) there is never a single millisecond of power interruption when there is power loss or voltage regulation issues. The Online UPS unit then, is effectively an electronic firewall between your devices and the outside world, scrubbing and stabilizing all the electricity your devices are ever exposed to. Expect to pay a 200-400% premium for an Online UPS unit over a similarly spec’ed Line-Interactive Unit.

Comparing Secondary Features

Even though a UPS unit is effectively just a sophisticated battery, there are tons of little features that can greatly enhance your UPS experience. Now that we know how to size and compare the basic elements of the UPS let’s take a look at additional features you’ll want to consider when picking out a UPS unit.

Supplementary software/OS compatibility: UPS units aren’t just power strips with big old batteries attached. Any UPS unit worth the $$$ you paid for it will include some method for interfacing the unit with the computer it is attached to. For most units this is a simple USB cable run between the UPS and the computer so that when the unit switches over to battery power it can alert the attached computer and, when the battery reserve grows too low, initiate the shut down process.

When shopping for your UPS unit, make sure that the unit you’re looking at can 1) communicate with attached devices and 2) communicate specifically with your chosen operating system. If you’re on Windows this won’t be much concern but if you’re using OSX or Linux you don’t want to find out post-purchase that all the cool software bells and whistles you saw in the ad copy for the UPS unit aren’t available on your OS.

For an example of how the UPS software interacts with the operating system, check out our tutorial on setting up APC’s PowerChute software.

Number of outlets: UPS units generally have a mix of on-battery and off-battery (but still surge protected) outlets. Make sure that there are adequate outlets for your needs. Some brands include additional outlet-related features such as peripheral outlets that automatically put peripherals to sleep to save energy.

Cable filters: If you know the unit will be used for your cable modem and router, for example, you’ll want to double check the specs to ensure that the UPS unit includes surge protected/filtered ports for your Ethernet and Coax cables.

Displays: Not all UPS units have displays (and you may not care if yours does) but they can be quite useful. Older units and newer low-end units do not include displays. As such you’re limited in receiving feedback from the unit either via communication over the USB/serial cable or (more annoyingly) as beeps from the unit. A compact display screen that can tell you additional information like remaining run time, battery health, and other tidbits is very handy.

Noise/Fans: Small UPS units generally do not have fans. Larger units often do and it’s worth reading reviews and digging around online to see if the fans are as quiet as the manufacturer claims. While fan noise isn’t an issue if you’re adding a UPS unit to a home server kept in the basement, it’s a real big deal if you’re adding a UPS unit to your home theater setup.

User-replaceable batteries: Does the unit have user-replaceable batteries and how much do they cost? UPS batteries don’t last forever (3-5 years is a pretty typical lifecycle for a UPS battery). When the battery finally fails, and it will, you’ll either need to buy new batteries (if you can swap them yourself) or buy a whole new unit. Except for very low-end UPS units where the replacement battery is often times almost as much as a brand new UPS unit, you should always look for units with user-replicable batteries. There’s no reason at all to scrap a $100+ unit for inability to swap out the simple 12V batteries inside.


Armed with the above information you’re now ready to shop for a UPS unit perfectly suited for your needs, big or small.

Have a tip, trick, or bit of related knowledge to share about UPS units? Join in the conversation below to help your fellow readers.

Fonte: http://www.howtogeek.com

Edit binary files in Linux

In this post I’ll mention how to edit binary files using vi and the utility xxd that is a part of vi.

vi in hex mode

Use the xxd command by typing

:%!xxd

Edit hex data. Quit hex mode with

:%!xxd -r

Using xxd command

You can use the xxd command outside vi. If you have an existing binary file, you can convert it to hex

xxd -g 1 file.bin > file.hex

You can then edit the hex and convert it back to binary

xxd -r file.hex > file.bin

One nice little thing that xxd does is to produce a C static array definition, very convenient for embedding resource files

xxd -i file.bin

Hacked auxiliary port for a car stereo

We’re not sure if [Apachem25] is just lucky, or if installing Auxiliary ports on most car stereos is this easy. The dealership wanted $95 to put one in, but he managed to add a 3.5″ audio-in port to his car stereo for just a couple of bucks.

http://imgur.com/a/qyRSX/layout/blog

The connector on the back of his head unit is a 2×4 set of pins recessed in a protective plastic ring. It turns out that the audio connector cable for a PC CD-ROM drive has a 1×4 socket that is perfect for this. [Apachem25] simply clipped one of those cables in half and used both ends to interface with the Aux port. He found the pin-out for his particular model on the Internet. He needed a specific resistance value between two of the pins to get the deck to let him use the input. All that he needed was a quick bit of soldering. The left, right, and ground are brought around the side and soldered to an audio jack he added in the face plate of the unit.

If you’re still rockin’ the cassette deck our favorite automotive Bluetooth solution is still this one for a classic Beatle.

fonte: hackaday.com

SoShare: condividi fino a 1 TB, gratis

I creatori di BitTorrent, il protocollo di file sharing più diffuso al mondo, lanciano SoShare, servizio gratuito che permette di condividere file fino a 1 TB.

Lo storage e il trasferimento di file via cloud inizia finalmente a prendere piede, anche da noi. Ma restano dei limiti: intanto ci sono i limiti di banda in upload, tipici delle connessioni ADSL, e in più la capacità di storage gratuito offerta dai vari operatori è, per forza di cose, limitata. Al fine di risolvere questo secondo inconveniente, BitTorrent presenta SoShare, un servizio gratuito di sharing di file di grandi dimensioni (fino a 1 TB), finalizzato a permettere alle piccole e medie aziende il trasferimento di contenuti del tutto gratuito.

Come funziona il servizio? Non sono trapelati molti dettagli in merito, ma parrebbe che i file da condividere, una volta caricati nel cloud, impieghino il protocollo BitTorrent per lo sharing con i destinatari, che non devono essere iscritti al servizio per usufruirne (ricevono semplicemente un’email con le istruzioni per il download): trattandosi di un servizio rivolto principalmente alle aziende, si suppone che la banda in upload non sia un problema. Non resta che provarlo: l’indirizzo di registrazione (e scaricamento del plug-in relativo) è https://soshareit.com/signup

Fonte: dday.it

Save MySQL query results into a text or CSV file | a Tech-Recipes Tutorial

MySQL provides an easy mechanism for writing the results of a select statement into a text file on the server. Using extended options of the INTO OUTFILE nomenclature, it is possible to create a comma separated value (CSV) which can be imported into a spreadsheet application such as OpenOffice or Excel or any other applciation which accepts data in CSV format.


Given a query such as

SELECT order_id,product_name,qty FROM orders

which returns three columns of data, the results can be placed into the file /tmo/orders.txt using the query:

SELECT order_id,product_name,qty FROM orders
INTO OUTFILE '/tmp/orders.txt'

This will create a tab-separated file, each row on its own line. To alter this behavior, it is possible to add modifiers to the query:

SELECT order_id,product_name,qty FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY 'n'

In this example, each field will be enclosed in “double quotes,” the fields will be separated by commas, and each row will be output on a new line separated by a newline (n). Sample output of this command would look like:

"1","Tech-Recipes sock puppet","14.95" "2","Tech-Recipes chef's hat","18.95"
...

Keep in mind that the output file must not already exist and that the user MySQL is running as has write permissions to the directory MySQL is attempting to write the file to.

Fonte: tech-recipes.com

Posted by Quinn McHenry

Ottimizzare MySQL: come rendere più veloci le query SQL

  Un tutorial per ottimizzare le query SQL su MySQL Un tutorial per ottimizzare le query SQL su MySQL

L’obiettivo minimo che gli sviluppatori che utilizzano MySQL per le proprie applicazioni raggiungono con una certa dimestichezza è quello di saper scrivere query SQL per ottenere i risultati desiderati. In molti, però, si fermano a questo livello, rinunciando a sondare gli strani misteri che sono patrimonio di un buon database administrator: capita quindi che, al crescere della dimensione dei dati e della complessità delle interrogazioni da implementare, ci si trovi di fronte a problemi apparentemente irrisolvibili o ad applicazioni con tempi di risposta inaccettabili.
Non sempre la determinazione del collo di bottiglia è cosa immediata: spesso è decisamente più facile pensare all’acquisto di hardware più potente, o alla ricerca del parametro di configurazione che, se ben impostato, potrebbe consentire la risoluzione di ogni problema.
Il più delle volte le soluzioni da mettere in pratica non sono queste, o meglio, non lo sono in prima istanza: quello che va fatto è una analisi dello schema del database e delle query eseguite dal server.
Riscrivere qualche interrogazione, ottimizzandola, e sistemare qualche tabella è spesso – non sempre – il solo intervento necessario, e in pochi minuti si può addirittura sbloccare una situazione che sembrava ormai cronica.
MySQL è notoriamente un DBMS molto performante, ma non ci si può fidare alla cieca di questa (pur vera) certezza: una progettazione errata e, soprattutto, query scritte male (spesso conseguenza di un database non normalizzato), sono in grado di affossare le performance di qualsiasi server, è solo questione di tempo, dati e memoria.
MySQL mette a disposizione uno strumento prezioso di analisi, poco conosciuto dai non addetti ai lavori, la funzione EXPLAIN, che sarà l’argomento di questo articolo: ne analizzeremo il funzionamento e, con qualche esempio, vedremo quale sia la metodologia di analisi per ottimizzare il funzionamento delle query.
Questa conoscenza consentirà di restituire un po’ di cicli macchina al vostro server “impallato” e, molto probabilmente, di scongiurare nell’immediato l’acquisto di nuovo hardware, cosa che il vostro capo o il vostro cliente apprezzerà più di ogni altro aspetto della questione.

Ripassiamo gli indici

Gli indici saranno i principali protagonisti della nostra trattazione.
Un indice associato ad una tabella non è troppo diverso da quello che trovate all’inizio di un libro: senza di esso, rintracciare un paragrafo o un capitolo diventa assai difficile e c’è da scorrere tutte le pagine presenti. Se poi c’è da trovare tutte le occorrenze di una certa parola, la situazione diventa ancora più tragica in assenza di un indice analitico.
MySQL utilizza la stessa tecnica vista per il libro: se una tabella non ha indici associati, l’unico modo per ritrovare i record di interesse è eseguire l’operazione che prende il nome di “full table scan”, una lettura riga per riga di tutte le informazioni presenti.
Pensate cosa significhi in termine di I/O effettuare una lettura completa di svariati gigabyte solo per trovare qualche riga che soddisfi una ricerca.
Gli indici sono strutture che “puntano” alle informazioni presenti nella tabella, come una sorta di segnalibri: sono composti da una sequenza di nodi contenenti i riferimenti ai record e vengono utilizzati per velocizzare le ricerche all’interno della tabella stessa, laddove questo sia possibile; sono costruiti sui valori di una o più colonne, e creano corrispondenze tra certi valori delle colonne e le righe dove tali valori si trovano.
Nella metafora vista in precedenza, un nodo dell’indice conterrà il titolo di un capitolo o del paragrafo, e verrà tenuto il riferimento del numero di pagina ove tale informazione si trova.
In MySQL è possibile creare diversi tipi di indice:

  • PRIMARY KEY: è l’indice associato alla chiave primaria, non può contenere valori NULL né valori duplicati. Usato spesso in associazione con la direttiva auto_increment in caso di valori numerici unici.
  • UNIQUE: non ci possono essere valori duplicati, sono consentiti i valori NULL.
  • INDEX: ci possono essere valori duplicati e valori NULL.
  • FULLTEXT: indice specializzato per la ricerca di parole nei testi.

Oltre ad essere strutture generalmente molto più piccole rispetto alla tabella cui fanno riferimento, gli indici hanno un trattamento di riguardo da parte di MySQL: i nodi, comprensivi di valore e puntatore, vengono conservati in un buffer di memoria denominato key_buffer (qua e nel seguito si fa riferimento all’engine MyISAM), che contiene i nodi utilizzati più di recente e, compatibilmente con la memoria disponibile, può anche contenere tutti gli indici del database.
La sua dimensione è data dalla variabile key_buffer_size, impostabile a piacere nella sezione [mysqld] del file my.cnf, il file di configurazione di MySQL che si trova in /etc (o in /etc/mysql a seconda della distribuzione).
Il key_buffer è preferibile che abbia il valore più elevato possibile, più è grande maggiore è la probabilità che il nodo dell’indice richiesto sia già in memoria, compatibilmente però con la RAM a disposizione, cercando di evitare il pericolo di swap del sistema operativo che farebbe degradare le performance.
Le query SQL con condizioni di ricerca espresse su campi indicizzati possono trarre grandi vantaggi in termini di tempo di esecuzione: ci sarebbe ancora da dire molto sulla gestione degli indici da parte del database, ma per i nostri scopi può bastare.
Identificare le query da ottimizzare
Prima di usare EXPLAIN dobbiamo selezionare le query che devono essere oggetto della nostra analisi ma, fortunatamente, non tutte avranno bisogno di essere ottimizzate e potranno tranquillamente essere considerate trascurabili.
Per questo scopo ci serve il contenuto dello slow-log, un file di testo nel quale MySQL scrive tutte le query che vengono eseguite in un tempo superiore al valore impostato nel parametro long_query_time (che di default vale 10 secondi).
Associate ad ogni query vengono inoltre riportate informazioni di fondamentale importanza: data e ora, tempo di esecuzione espresso in secondi, numero di righe, tempo di lock, utente richiedente.
Non essendo lo slow-log attivo per default, dobbiamo abilitarlo inserendo il parametro log-slow-queries[=file_name] nella sezione [mysqld] del file my.cnf: in assenza della parte file_name, che ne può specificare un path e un nome alternativo, il file verrà creato nella directory dei dati e si chiamerà host_name-slow.log. Se non sappiamo quale sia la directory dei dati possiamo scoprirlo con il comando:


mysql> SHOW VARIABLES LIKE 'datadir';

Impostati i parametri in my.cnf sarà necessario il riavvio del server. Il database dovrà lavorare per un po’ di tempo affinché il file di log venga popolato. Per disporre di un contenuto significativo che dia una visione realistica del funzionamento del server occorre che lo slow-log copra diverse ore o, meglio ancora, diversi giorni: per una corretta selezione delle query candidate all’ottimizzazione è bene valutare il funzionamento del database su un arco temporale che copra tutte le variazioni possibili di carico e annoveri il funzionamento di tutte le applicazioni che ne fanno uso, in quanto uno slow-log parziale può portare ad analisi non complete e fuorvianti.
Dall’analisi delle query presente possiamo costruire una lista di interrogazioni da analizzare partendo dalle più lente e più frequenti, facendo molta attenzione però agli eventuali falsi positivi, le query cioè che sono presenti nel log pur non essendo scritte male o lente per loro natura.
Attenzione anche a tutti gli elementi esterni al database possono influenzare le perfomance e che possono rendere “lente” query che, in situazioni normali, non lo sarebbero state: un caso tipico è quello di un applicativo esterno che ha fatto un uso anomalo delle risorse di sistema (tempo macchina o disco) sottraendole agli altri processi, tra cui anche MySQL.
Altro caso assai frequente riguarda le query eseguite durante il backup del database: nel tempo necessario ad eseguire la copia dei dati è probabile che si generino delle slow query conseguente all’intenso I/O.
Altre query da escludere sono quelle poco frequenti, quelle eseguite per errore e quelle eseguite da un amministratore per onerose operazioni di modifica alle tabelle o complesse ricerche. E’ comunque necessario fare uso di un po’ di buon senso: se è vero che in termini generali tali query possono essere trascurate, è altrettanto vero che se una certa query eseguita una volta ogni giorno impiega un’ora non può essere tralasciata, soprattutto se in tale lasso di tempo tiene bloccate risorse (tabelle) per i thread concorrenti.
Se sul server è attiva l’opzione log_queries_not_using_indexes lo slow-log conterrà anche tutte le query che non hanno fatto uso di alcun indice, indipendentemente dalla velocità di esecuzione: questo può essere utile per individuare molte query eseguite in un tempo relativamente basso ma che comunque sarebbero migliorabili.
Se lo slow-log è di piccole dimensioni può essere controllato manualmente, ma nella maggior parte dei casi è sicuramente più comodo l’utilizzo di un programma presente in tutte le installazioni di MySQL, mysqldumpslow, che esegue l’analisi dello slow-log, producendo in output un documento di sintesi in cui le query simili sono raggruppate in base al tempo medio di esecuzione e la frequenza, ordinate a partire dalla più lenta. I parametri numerici e testuali presenti nelle query sono rispettivamente sostituiti con i simboli generici N ed S.
I file di log non sono consultabili da tutti gli utenti e, a seconda delle distribuzioni e della tipologia di installazione, è probabile che ad essi abbia accesso solo l’utente di root oppure l’utente con cui MySQL è in esecuzione (e il gruppo relativo), e questo comporta l’impossibilità dell’analisi in diverse situazioni: il caso più tipico è chi utilizza un database su una piattaforma in hosting, senza avere accesso fisicamente alla shell e alle impostazioni del server.
In tali circostanze o si riesce a replicare localmente l’intera installazione effettuando una analisi in ambiente di pre-produzione (che dovrebbe essere sempre presente, non solo per i test prestazionali), o si è costretti ad eseguire sull’applicazione la misura delle performance, magari scrivendo il tempo impiegato in un file di log che può essere consultato offline.

La funzione EXPLAIN

EXPLAIN viene utilizzata per consultare il “query optimizer”, la sezione del server che effettua le valutazioni su come rendere più veloce l’interrogazione che viene richiesta al database: è questa sezione che decide se un indice dovrà essere utilizzato, l’ordine di verifica delle condizioni ecc.
In pratica, interrogando il query optimizer si chiede a MySQL come intende sviluppare la query.
Le informazioni che fornisce EXPLAIN sono utili per molti aspetti:

  • forniscono indizi circa l’opportunità di aggiunta di alcuni indici alle tabelle;
  • se una tabella ha già degli indici utilizzati, l’output del comando aiuta a capire come vengono utilizzati dal motore;
  • se gli indici esistono ma non vengono utilizzati dal query optimizer, aiuta a scrivere meglio il codice SQL affinché la query venga eseguita beneficiando della presenza dell’indice.

L’uso di EXPLAIN è di estrema importanza per studiare i join che, se male utilizzati, hanno lo svantaggio di poter incrementare a dismisura il carico di lavoro richiesto al server: infatti, se una query che interroga una tabella di 1000 righe è scritta male, nel caso peggiore il server dovrà leggere al massimo 1000 righe; se invece viene effettuato un join di due tabelle di 1000 righe ciascuna, il caso peggiore comporta l’esame di tutte le possibili combinazioni del prodotto cartesiano tra le due tabelle, ossia 1.000.000 di righe!
EXPLAIN può aiutare a riscrivere meglio le query o modificare le tabelle in modo tale che il server risolva il join nel modo meno oneroso possibile, riducendo il numero di combinazioni da esaminare.
EXPLAIN produce una riga di output per ogni tabella referenziata dalla query. L’ordine di visualizzazione delle righe è importante: indica la sequenza che MySQL utilizzerà per considerare le tabelle nella risoluzione dei vincoli di join, indipendentemente da come sono scritte nella parte FROM.
EXPLAIN consente di analizzare qualsiasi query SELECT, ma può essere utilizzato indirettamente anche per UPDATE e DELETE scrivendo una generica SELECT * con le stesse condizioni di FROM e WHERE: solitamente le condizioni usate nelle query di modifica dei dati sono meno complesse di quelle usate in quelle di selezione, il che rende questa operazione non molto frequente.
Primo esempio: utilizzo corretto degli indici
Per il nostro primo esempio utilizziamo il database Sakila di una ipotetica videoteca, liberamente scaricabile da
http://downloads.mysql.com/docs/sakila-db.tar.gz
Delle 22 tabelle presenti ne useremo per i nostri esempi solo 3.

  • film: elenco dei film a catalogo comprensivi di titolo, genere, durata a altre informazioni
  • actor: elenco di attori (nomi di fantasia)
  • film_actor: tabella che di collegamento tra gli attori e i film in cui hanno recitato

Le tabelle sono già ottimizzate a dovere, ma per capire il funzionamento è necessario crearne di nuove non ottimizzate, senza indici:


mysql> CREATE TABLE lista_attori SELECT * FROM actor;
mysql> CREATE TABLE lista_film SELECT * FROM film;
mysql> CREATE TABLE lista_film_attori
SELECT * FROM film_actor;

L’esecuzione di CREATE TABLE … SELECT … consente infatti di copiare tutti i dati di una tabella in una nuova ricreando gli stessi campi ma senza indici.
Eseguiamo una query per trovare i nomi degli attori e i titoli dei film in cui hanno recitato la cui durata è maggiore di tre ore.


mysql> SELECT first_name, last_name, title
-> FROM lista_film, lista_attori, lista_film_attori
-> WHERE lista_film.film_id=lista_film_attori.film_id
-> AND lista_attori.actor_id=lista_film_attori.actor_id
-> AND length > 180;

La stessa query si può scrivere con la sintassi JOIN estesa, in maniera del tutto equivalente anche in termini di performance:


SELECT first_name, last_name, title
FROM
lista_film
INNER JOIN lista_film_attori ON
lista_film.film_id=lista_film_attori.film_id
INNER JOIN lista_attori ON
lista_attori.actor_id=lista_film_attori.actor_id
WHERE
length > 180;

Osserviamo il risultato che restituisce:


| first_name | last_name | title |
| PENELOPE | GUINESS | KING EVOLUTION |
| ED | CHASE | YOUNG LANGUAGE |
...
| MATTHEW | CARREY | WORST BANGER |
200 rows in set (29.02 sec)

lc59_ottimizzazione1

Notate come il tempo di esecuzione sia particolarmente alto. La velocità di esecuzione dipende anche dalla potenza di calcolo del computer, quindi potreste ottenere un risultato un po’ diverso, ma probabilmente dello stesso ordine di grandezza. Vediamo allora come migliorare la situazione.
Proviamo a fare un EXPLAIN della query appena eseguita, il cui output è presente in figura 2 nel primo passaggio:


mysql> EXPLAIN SELECT first_name, last_name, title
-> FROM lista_film, lista_attori, lista_film_attori
-> WERE lista_film.film_id=lista_film_attori.film_id
-> AND lista_attori.actor_id=lista_film_attori.actor_id
-> AND length > 180;

Notiamo anzitutto che i campi type hanno il valore ALL per tutte le tabelle. Ciò significa che per ognuna viene fatto un full scan per ogni combinazione di righe dalle tabelle precedenti. Per conoscere il numero di combinazioni totali è sufficiente moltiplicare tra loro i valori riportati in rows.


mysql> select 200*1000*5462 as prodotto_cartesiano;
| prodotto_cartesiano |
| 1092400000 |

MySQL deve costruirsi oltre 1 miliardo di possibili combinazioni, controllarle una per una per individuare alla fine le 200 righe del risultato che cerchiamo: ecco spiegata la ragione della estrema lentezza della query.
Effettuiamo una prima ottimizzazione creando due indici per consentire di risolvere più facilmente la prima condizioni di join presente nella query (notate come la forma estesa semplifichi la lettura alla ricerca delle necessità di ottimizzazione):


mysql> ALTER TABLE lista_film ADD INDEX(film_id);
Query OK, 1000 rows affected (0.07 sec)
Records: 1000 Duplicates: 0 Warnings: 0


mysql> ALTER TABLE lista_film_attori ADD INDEX(film_id);
Query OK, 5462 rows affected (0.01 sec)
Records: 5462 Duplicates: 0 Warnings: 0

Eseguiamo nuovamente EXPLAIN, il cui output è presente sempre in figura 2 ma nel secondo passaggio.
Notiamo che la situazione è considerevolmente migliorata per la tabella lista_film_attori per la quale è possibile utilizzare l’indice costruito su film_id come ci dice il campo key. Per ogni combinazione di righe dalle tabelle precedenti la tabella in questione mette in gioco 5 righe (rows) e risolve il join con lista_film usando la colonna film_id (ref).


mysql> select 200*1000*5 as prodotto_cartesiano;
| prodotto_cartesiano |
| 1000000 |

Abbiamo ridotto il numero delle combinazioni di tre ordini di grandezza, da oltre un miliardo a un milione. La query eseguita dopo questa prima ottimizzazione impiega oltre un decimo del tempo. Proseguiamo con l’ottimizzazione creando gli indici per agevolare l’altra condizione di join.


mysql> ALTER TABLE lista_attori ADD INDEX(actor_id);
Query OK, 200 rows affected (0.00 sec)
Records: 200 Duplicates: 0 Warnings: 0


mysql> ALTER TABLE lista_film_attori ADD INDEX(actor_id);
Query OK, 5462 rows affected (0.02 sec)
Records: 5462 Duplicates: 0 Warnings: 0

Nel terzo passaggio vediamo come è ulteriormente variato l’output di EXPLAIN.
Siamo ora in una situazione già accettabile: le combinazioni sono scese a 5000 (1000*5*1) con due tabelle su tre in grado di sfruttare un indice.
Notiamo anche che l’ordine delle tabelle è variato e quanto mostrato da EXPLAIN è l’esatta sequenza con cui “query optimizer” aprirà le tabelle e risolverà i join. L’ordine scritto nel FROM non ha alcuna rilevanza: la scelta della sequenza più opportuna è operata in base a quella che è in grado di fornire il risultato migliore.
In questo caso vi è la necessità di effettuare il full scan di lista_film, e viene eseguito come prima operazione per evitare di doverlo ripetere più volte se fosse posticipato nella esecuzione della query, ragion per cui lista_film è la prima tabella considerata.
La necessità di effettuare il full scan è data dalla presenza della condizione sul campo length (length > 180) che non è un campo indicizzato. Proviamo allora a definire un indice anche per esso e vediamo cosa succede.


mysql> ALTER TABLE lista_film ADD INDEX(length);
Query OK, 1000 rows affected (0.02 sec)
Records: 1000 Duplicates: 0 Warnings: 0

L’output della nuova EXPLAIN è indicato come quarto passaggio. Ora anche la prima tabella può sfruttare l’indice e il valore range del campo ref indica che solo un certo intervallo dell’indice viene letto, non tutto.
Calcoliamo la complessità finale della query:


mysql> select 46*5*1 as prodotto_cartesiano;
| prodotto_cartesiano |
| 230 |

Ora eseguiamola nuovamente dopo le ottimizzazioni:


mysql> SELECT first_name, last_name, title
-> FROM lista_film, lista_attori, lista_film_attori
-> WHERE lista_film.film_id=lista_film_attori.film_id
-> AND lista_attori.actor_id=lista_film_attori.actor_id
-> AND length > 180;
| first_name | last_name | title |
| PENELOPE | GUINESS | KING EVOLUTION |
| ED | CHASE | YOUNG LANGUAGE |
...
| MATTHEW | CARREY | WORST BANGER |
200 rows in set (00.01 sec)

Il tempo di esecuzione si è decisamente ridotto!

Un nuovo esempio: riscrivere una query

Supponiamo che siano state inserite delle durate errate nel campo length della tabella film, e il valore corretto sarebbe il 10% in più rispetto ai valori presenti nel database.
Prima di modificare il campo, però, cerchiamo quali sarebbero i film la cui durata sarà superiore alle 3 ore (180 minuti).
Creiamo un indice sul campo length e analizziamo una semplice query:


mysql> ALTER TABLE film ADD INDEX(length);
Query OK, 1000 rows affected (0.14 sec)
Records: 1000 Duplicates: 0 Warnings: 0


mysql> EXPLAIN SELECT title FROM film
WHERE 1.1*length > 180G
********************* 1. row *********************
id: 1
select_type: SIMPLE
table: film
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 927
Extra: Using where

C’è da chiedersi perché non venga utilizzato l’indice definito sulla colonna length. La spiegazione è oltremodo semplice: quando una condizione è espressa in termini di una funzione o di una operazione algebrica applicata ad un campo indicizzato, MySQL non può sfruttare l’indice in quanto non conosce a priori il valore assunto dall’espressione o dalla funzione. Il valore deve quindi essere calcolato riga per riga, obbligando un full scan della tabella, come EXPLAIN correttamente indica.


mysql> EXPLAIN SELECT title FROM film
WHERE length > 180/1.1G
********************* 1. row *********************
id: 1
select_type: SIMPLE
table: film
type: range
possible_keys: length,length_2
key: length
key_len: 3
ref: NULL
rows: 155
Extra: Using where

Provando a scrivere la query con una condizione espressa in un modo diverso ma equivalente, si verifica come l’indice venga correttamente utilizzato.
Forzare l’ordine delle tabelle
Nella maggior parte dei casi le scelte effettuare dal query optimizer per quanto riguarda l’ordine di lettura delle tabelle sono quelle ottimali, ma può però capitare che non lo siano e si voglia costringere MySQL ad operare una scelta diversa: è quindi sufficiente aggiungere alla prima SELECT il modificatore STRAIGHT_JOIN, che farà in modo che l’ordine considerato sarà quello specificato in FROM.
Fortunatamente non capiterà spesso di andare contro le scelte di MySQL, ma come esercizio si può provare a forzare l’ordine delle tabelle per verificare come cambino le performance di una query.

Aggiornare le statistiche

Abbiamo citato il fatto che il valore di rows sia una stima calcolata in base alle statistiche sulla distribuzione degli indici e non il numero reale delle righe selezionate. Non è scopo di questo articolo spiegare gli internal di questa valutazione, ma ciò chi ci preme sottolineare è che i valori utilizzati per le ottimizzazioni devono essere il più aggiornati possibile: è quindi consigliabile eseguire di tanto in tanto il comando


mysql> ANALYZE TABLE nome_tabella;

che ha il compito specifico di effettuare un refresh delle informazioni necessarie.
Non esiste una regola per decidere la frequenza dell’esecuzione, molto dipende dalla quantità di modifiche dei campi indicizzati. Per sicurezza è utile eseguirlo su tutte le tabelle con cadenza giornaliera o settimanale a seconda dei casi (basta affidarsi a cron) e comunque eseguirlo sistematicamente tutte le volte che si fanno modifiche di massa di valori associati ad indice, o dopo aver cancellato grosse parti di una tabella. Anche il comando che segue può servire allo scopo:


mysql> OPTIMIZE TABLE nome_tabella;

Anche OPTIMIZE TABLE aggiorna le statistiche di distribuzione degli indici, ma in più esegue altre operazioni (ad esempio compattare le tabelle per recuperare lo spazio vuoto) e potrebbe risultare più lento.

Conclusioni

Vi abbiamo mostrato come identificare le query più lente sfruttando lo slow-log: in seguito l’uso di EXPLAIN ha mostrato come si possano analizzare tali query al fine di creare gli indici necessari per ridurre il numero di combinazioni di righe e, nel caso in cui tali indici non venissero utilizzati, modificare la struttura della query per permettere a MySQL una migliore ottimizzazione della interrogazione.
Tutto ciò a vantaggio dei tempi di risposta e del fatto che avrete un DBMS in grado di poter assolvere a nuovi compiti.
A volte purtroppo capita anche il caso in cui, nonostante tutte le possibili ottimizzazioni, il sistema risulti ancora troppo lento. Solo in tal caso non resta altro da fare che potenziare l’hardware o pensare a soluzioni basate sulla replicazione o MySQL Cluster a seconda dei casi, ma qua il discorso diventa sicuramente più complesso e sarà oggetto di ulteriori articoli nei prossimi numeri.

Riquadro 1: I campi di una EXPLAIN SELECT

id: valore numerico progressivo che indica la SELECT a cui si fa riferimento; se non sono presenti query annidate o UNION varrà sempre 1.
select_type: categorizza il tipo di SELECT; se non si hanno query annidate o UNION varrà sempre SIMPLE.
table: è il nome della tabella cui le informazioni della riga fanno riferimento.
type: indica il tipo di join. Il suo valore è una misura dell’efficienza con cui MySQL risolve una condizione di join (vedi riquadro 2 per tutti i possibili valori).
possible_keys: indica quali sono gli indici della tabella che MySQL può considerare per identificare la righe che soddisfano la query. Può essere una lista di uno o più valori, o può valere NULL se non ci sono indici o se nessuno degli indici può essere usato.
key: indica il nome dell’indice che “query optimizer” ha deciso di utilizzare. Se il valore è NULL vuol dire che nessun indice è stato usato; questo capita ovviamente se non vi sono indici oppure se optimizer ritiene che uno scan della tabella sia più veloce (tipico di quando il numero delle righe selezionate è relativamente grande rispetto al numero totale di righe della tabella)
key_len: indica quanti byte dell’indice sono usati. E’ un’informazione utile solo nei casi in cui vi sia un indice multiplo, costruito cioè con l’unione di più colonne. Per gli scopi dell’articolo non ci interessa approfondirlo ulteriormente.
ref: indica quali colonne della tabella precedente sono usate per risolvere la condizione di join con la tabella attuale. Vale NULL nel caso della prima tabella.
rows: è un valore numerico che rappresenta il numero di righe messe in gioco dalla tabella. Attenzione però, si tratta solo di una stima calcolata da optimizer in base alle statistiche interne sugli indici, non è il numero delle righe realmente selezionate. Per fortuna ciò che conta non è il valore puntuale ma l’ordine di grandezza di tale numero, che nella quasi totalità dei casi è attendibile. Il valore “vero” lo si può ottenere solo eseguendo la query, cosa che EXPLAIN non fa.
Extra: fornisce informazioni addizionali sul join (vedi riquadro 3 per tutti i possibili valori).

Riquadro 2: I valori del campo Type presente nella EXPLAIN

system: la tabella ha esattamente una riga.
const: la tabella ha una sola riga che soddisfa alle condizioni di join. E’ simile a system ma con la differenza che la tabella può avere molte altre righe.
eq_ref: è letta una sola riga dalla tabella corrente per ogni combinazione di righe dalle tabelle precedenti. Tipico dei join in cui MySQL può utilizzare una primary key per identificare le righe di una tabella.
ref: sono lette diverse righe per ogni combinazione di righe dalle tabelle precedenti. Simile a eq_ref, ma può capitare quando viene usato un indice multiplo o quando non viene utilizzato un indice per intero (solo la parte sinistra).
ref_or_null: simile a ref, ma in più MySQL deve cercare righe contenenti NULL.
range: l’indice è usato per selezionare le righe che cadono in un certo intervallo di valori. Tipico di quando vengono usate condizioni di disuguaglianza, ad esempio id<10.
index: MySQL esegue un full scan dell’indice. Non è un caso piacevole ma sempre meglio di un full scan della tabella. Un indice è più veloce da leggere dei dati reali in quanto è ordinato, solitamente più piccolo dei dati e spesso si trova per buona parte in memoria.
ALL: MySQL esegue un full scan della tabella da disco. E’ la situazione peggiore, soprattutto se si riferisce ad una tabella che non sia la prima: deve essere eseguito il full scan per ogni combinazione di righe dalle tabelle precedenti e le performance peggiorano esponenzialmente. Assolutamente da evitare, specialmente quando la dimensione delle tabelle non è trascurabile.

Riquadro 3: I valori del campo Extra presente nella EXPLAIN

Ecco i valori possibili del campo Extra: quelli con un + identificano valori “buoni”, quelli con – valori “cattivi”.

  • +Using index: MySQL può ottimizzare la query leggendo i valori dall’indice senza dover leggere i corrispondenti dati dalla tabella fisica. Questa ottimizzazione è possibile quando ad esempio vengono selezionate solo colonne che sono indicizzate.
  • +Where used: MySQL usa le condizioni espresse in WHERE per identificare le righe che soddisfano la query. Senza tali condizioni si sarebbero ottenute tutte le righe della tabella.
  • +Distinct: MySQL legge una singola riga dalla tabella per ogni combinazione di righe dalle tabelle precedenti.
  • +Not exists: MySQL riesce ad ottimizzare una condizione di LEFT JOIN non considerando alcune righe.
  • -Using filesort: Le righe che soddisfano la query devono essere ordinate. E’ un passo ulteriore di computazione.
  • -Using temporary: Deve essere creata una tabella temporanea per poter processare la query.
  • -Range checked for each record: MySQL non può determinare in anticipo quale indice utilizzare. Per ogni combinazione di righe dalle tabelle precedenti controlla gli indici della tabella corrente per cercare il migliore da utilizzare. Non è una buona situazione, ma meglio che non usare gli indici del tutto.

Di Corrado Pandiani, pubblicato su Linux&C. n° 59.

Wireless 4 Innovation – eMart

“Sunny Sale” di eMart: successo per l’iniziativa che offre sconti speciali tramite QRCode solo all’ora di pranzogiugno 2012Inquadrando un QR-code con la fotocamera integrata del proprio smartphone è possibile ordinare della merce a casa con sconti speciali, ma c’è una particolarità: i codici disseminati per la città di Seul in Corea del Sud sono utilizzabili solo ad orario di pranzo. È solo tra le 12 e le 13, infatti, che grazie al sole le ombre degli elementi tridimensionali posti su un pannello compongono il codice, rendendolo utilizzabile. Questa l’originale campagna di marketing lanciata a gennaio da eMart – importante catena di supermercati in Corea del Sud che conta 141 punti vendita sul territorio nazionale – per promuovere gli acquisti in una fascia oraria in cui normalmente le vendite subiscono una drastica flessione. Le installazioni sono oggi presenti in 36 diverse località dell’area metropolitana di Seul e hanno da subito ottenuto grande successo. Gli utenti si sono mostrati entusiasti e i risultati non hanno tardato ad arrivare: ad un mese dal lancio del progetto sono infatti 12.000 i coupon utilizzati dagli utenti, le iscrizioni al programma di fidelizzazione della catena sono aumentate del 58% e le vendite nella fascia oraria 12-13 hanno registrato un +25%. A questi risultati si aggiunge la non meno importante pubblicità derivante dalla risonanza ottenuta dall’insolita iniziativa pubblicitaria sui principali mezzi di informazione nazionali e internazionali.

viaWireless 4 Innovation – eMart.

I social network dei professionisti, fra cautela e curiosità

Le reti sociali sono potenzialmente un nuovo strumento di comunicazione e contatto con colleghi e clienti, ma tutti concordano di non poter affidare al caso la partecipazione. Le opinioni di avvocati, commercialisti, notai e architetti.

Esperienze

Curiosità, interesse. Ma anche cautela. È con un misto di sentimenti che molti professionisti stanno guardando ai social network, in questo periodo.

O, almeno, questo è vero per i più attenti alle novità che vengono dai nuovi media, a quanto risulta da una ricognizione compiuta su cinque di loro (due avvocati, un commercialista, un notaio e un architetto).

Sono professionisti noti per avere una certa familiarità con le nuove tecnologie. Si rendono conto che i social network sono potenzialmente un nuovo strumento di comunicazione e contatto con colleghi, studenti . E anche un modo per farsi conoscere professionalmente.

Tuttavia, qualunque sia il loro livello di utilizzo dei social network, tutti concordano di non poter affidare al caso la propria partecipazione. C’è una bella differenza, insomma, tra l’uso personale e quello professionale.

Se si aderisce a un network, a scopi professionali, bisogna per prima cosa seguirlo con attenzione, partecipare con costanza e contribuire con contenuti rilevanti (non scritti di getto). Infine- concordano-, bisogna avere cautela su quello che si scrive: il rischio di diffondere informazioni riservate è sempre in agguato.
Le esperienze
La selezione è importante, non solo dei contenuti ma anche dei posti da presenziare. «Quando sono sbarcato sui social non c’erano molti colleghi e mi sono messo ad osservare: volevo capire come un avvocato potesse utilizzare questo nuovo strumento per fini professionali. Li ho provati tutti, ma ho conservato i profili solo su alcuni, quelli più utili per un avvocato (Linkedin, Twitter, Facebook e Google+)», dice Ernesto Belisario, avvocato pioniere di questi temi.

«Dopo tanta osservazione ho iniziato a condividere: notizie, approfondimenti, eventi. È grazie ai social che mi informo, che dialogo con amici e clienti. Ma senza l’ossessione del numero di follower: dopotutto, non sono “Lady Gaga”», aggiunge. A conferma che per un professionista sui social vale più la selezione (la “qualità”), che la quantità. In generale quindi contano criteri diversi rispetto a quelli di una partecipazione personale.

Concorda Guido Scorza, avvocato specializzato in nuove tecnologie: «sui social ho condiviso e continuo a condividere informazioni e questioni delle quali mi occupo professionalmente. O di cui ci si occupa nel mio studio. È un modo per fare informazione giuridica e confrontarsi con colleghi e società».

Molto intensa è l’attività social professionale di Arrigo Panato, commercialista: «il mio studio è presente su tutti i principali social network con una propria pagina alimentata automaticamente dagli aggiornamenti dei nostri blog o riportando gli articoli apparsi su riviste professionali», dice. È un approccio cattedratico, perché «il dialogo con la rete preferisco gestirlo in prima persona con il mio account personale».

«Una pagina Facebook deve essere molto focalizzata. noi gestiamo sia una pagina di studio sia una pagina di supporto al manuale sulle perizie di stima. Questa ci sta dando molte soddisfazioni e ha superato i 300 fan. Per essere un argomento così specifico anche per i commercialisti non è poco», continua.

«Alcuni studenti hanno usato il libro e la pagina Facebook per preparare la tesi, scambiarsi consigli e chiedermi suggerimenti. in poco tempo si è creata quasi una comunità di pratica».

Diversa è l’esperienza di Fabio Fornasari, architetto: «ogni mio progetto si misura a diversi gradi in generale con la rete. Per esempio http://laboratoriomuseodiffuso.wordpress.com. In ambiente fisico raccolgo i commenti giacché la gente è restia a parlarne. Ma su alcune pagine Facebook si trovano scambi che fanno riferimento al progetto». «Non uso troppo Twitter, per mancanza di tempo. Facebook  sì perché qui i contributi giocano non sul secondo ma sulle ore: riesco meglio. Ma potessi avere qualcuno che lavora per me lo userei di più. LinkedIn lo aggiorno non troppo spesso, ma penso sia utile», aggiunge.

Il notaio Giampaolo Doria invece sta ancora valutando il da farsi. «Il nostro studio non si è ancora dotato di una pagina su nessun social network, pur essendo presente su internet con un proprio sito», spiega. Tuttavia, «stiamo lavorando ad un sito di nuova generazione che ci consenta di pubblicare immediatamente anche su Facebook alcune notizie mano a mano che le pubblichiamo sul nostro sito».

Perché questa scelta? «Fino ad oggi siamo stati molto prudenti con questo tipo di apertura perché per il tipo di attività professionale svolta abbiamo sempre ritenuto preferibile mantenere un atteggiamento piuttosto sobrio».
«Nondimeno, i recenti sviluppi normativi, in materia di deregolamentazione delle libere professioni,  stanno spingendo sempre di più i liberi professionisti a dover essere maggiormente incisivi nel mercato e, quindi, a dover impiegare sempre di più ogni tecnica per farsi conoscere da un pubblico più o meno ampio».
L’utilità dei social
Prima di vedere come usare i social con efficacia, chiediamoci a che cosa possano servirci. Belisario ritiene che ci siano tanti motivi per cui un professionista dovrebbe utilizzare i social media.

«Il primo: nella società dell’informazione, non è più possibile aspettare di ricevere la rivista cartacea per approfondire e studiare. Nel 2012, la tempestività nell’accesso alla conoscenza diventa un importante fattore competitivo e può essere assicurata solo attraverso i social; il primo passo per un professionista dovrà essere quello di selezionare attentamente i contatti tra le fonti più autorevoli nelle materie di attività».

Il secondo motivo: «grazie ai social possiamo conoscere in modo puntuale i trend del mercato, in modo da poter intercettare al meglio le esigenze dei clienti (acquisiti e potenziali)».

«Infine, certo c’è un’utilità promozionale e di marketing; ma attenzione a non enfatizzare: i clienti non arriveranno solo perché siamo sui social, ma se dimostreremo di essere seri e competenti».

Sulla stessa linea Scorza: «la presenza di uno studio sui social ha un duplice valore: è un’importante vetrina per presentarsi ad un pubblico ormai amplissimo di potenziali clienti in modo, peraltro, colloquiale e non “aggressivo” e, soprattutto, consente di intercettare esigenze e problemi della società, dei cittadini e delle imprese con straordinaria rapidità. Si può rispondere così a un’esigenza di costante aggiornamento. Fondamentale per uno studio professionale moderno».

Panato insiste sull’aspetto di arricchimento e conoscenza: «è incredibile la ricchezza di suggerimenti e proposte che possono arrivare dalla rete per ridisegnare lo studio professionale, per ridefinire la nostra strategia, per restare aggiornati ed approfondire argomenti specifici anche professionali».
I consigli
Ma come usare i social network?  C’è una regola d’oro, concordano i professionisti: bisogna partecipare attivamente ai social dove si è presenti. «Se si sceglie di esserci, occorre investirci tempo e risorse. Frequentare la pagina, coltivarne gli utenti e tenerla aggiornata, verificando, costantemente, i feedback che si ricevano», spiega Scorza. «Niente di peggio di invitare qualcuno a casa propria per un confronto, dichiararsi disponibili al dialogo e poi non dedicargli tempo e attenzioni».

«Ma bisogna evitare di essere autoreferenziali», precisa Belisario. «Le persone non hanno tempo da perdere e non sono interessate a chi si imbroda, bisogna accettare le dinamiche del Web 2.0.

Bisogna anche mettersi dalla parte dell’utente: cercando di capire qual è il valore aggiunto che un utente ha se ci segue. E quindi lavorare sui contenuti di qualità», aggiunge.

Concorda Panato: «Il rischio su Facebook è confondere il lato personale con quello professionale e perdere di costanza e profondità negli aggiornamenti. Per essere credibili bisogna essere costanti e pubblicare approfondimenti attendibili nonostante lo strumento spesso porti a privilegiare l’immediatezza ed una certa superficialità».

Infine, una cautela: «attenzione alla riservatezza: non divulgare informazioni che devono rimanere segrete», dice Belisario. «Non bisogna mai dimenticare i poteri e doveri di sorveglianza dei rispettivi organi o ordini di appartenenza, i quali continuano a vigilare sui contenuti social. Con risvolti certamente ancora da scoprire», dice Doria.

di Alessandro Longo

fonte: ict4executive.it

PHP – Retrieving XML With Curl and SimpleXML – PHP Tutorials

Retrieving XML With Curl and SimpleXMLIntroductionPHP 5 introduces SimpleXML and its a perfect name as parsing XML data is truly simple. In this tutorial we&apos;ll be using curl to retrieve the XML data from a remote web server. We&apos;re going to create a class to connect to the remote web server and pass POST data to the server and based on the POST data the remote server will return valid XML. The class will parse the XML response and return an array containing the data. For the sake of simplicity in this tutorial we&apos;re not going into detail on the workings of the remote server generating the XML responses.

The first thing we&apos;re going to cover is the simple script used to call the class.

<?
$URL = ‘http://www.example.com/XML’;
$request = ‘getInventory’;
$parameters = array(“param1” => “value1”, “param2” => “value2″);

$XMLClass = new getXML;
$response = $XMLClass->pullXML($URL,$request,$parameters);
?>

This simple script is all that is needed to use the class. We need to set the URL, request, and attributes being passed for the request. The $XMLClass = new getXML initializes the getXML class discussed later on in the tutorial. The response data of the request is stored in $response. For this example we’re going to use the following XML.

<?
<xml>
<data>
<row attribA=”valueA” attribB=”valueB”/>
<row attribA=”valueC” attribB=”valueD”/>
</data>
</xml>
?>

var_dump($response)  would be
array2 { [0]=> array2 { [“attribA”]=> string6 “valueA” [“attribB”]=> string6 “valueB” } [1]=> array2 { [“attribA”]=> string6 “valueC” [“attribB”]=> string6 “valueD” } }