Disabilitare il Write Caching su Mac OS X: Safe Remove USB Device

remove-USB-safely

Posso staccare la penna USB senza forzare la rimozione?

Quante volte ho sentito questa domanda, la maggior parte della gente toglie la propria penna USB dal pc senza “smontarla” secondo la procedura, sicuri che non si danneggi nulla. Ma e’ davvero “sicuro” farlo??

Bhe se avete un pc con Windows 7 e versioni successive, e’ abbastanza sicuro. Windows disabilita il write caching sulle periferiche che riconosce come removable , consapevoli del fatto che la maggior parte dei sui utilizzatori non smonta mai il proprio device USB.

A questo punto, se sei arrivato a leggere fino a qui e non sei uno esperto/smanettone ti sarai chiesto: Ma cosa e’ il write-caching?

E’ la policy che utilizza la maggior parte dei Sistemi Operativi quando si deve scrivere un dato in una memoria dati esterna, magari collegata tramite USB. Tramite tale tecnica, non vengono copiati immediatamente i dati dal vostro pc sulla memoria (soprattutto se sono dati di piccoli dimensioni), ma vengono messe in una cache in attesa che ci siano altri dati da scrivere in modo da aumentare le performance. Infatti, la scrittura sui device esterni avviene molto piu’ velocemente per file di dimensioni grandi e non con file piccoli.

Per tale motivo, molti Sistemi Operativi la adottano; per aumentare le performance… costringendoci a “smontare” la chiavetta e “forzare” la scrittura dei dati che sono ancora in cache.

Mac OS X adotta la stessa politica di Windows?

Bhe se avete un Mac, vi tocca smontarla. Infatti il Sistema Operativo di casa Cupertino, non disabilita il write-caching come Windows.

Ma è possibile forzare in qualche modo tale policy e dire a Mac OS X di non usare il write-caching. Come farlo?

Il miglior modo per farlo è con il comando mount tramite la shell dei comandi:

[sourcecode language=”bash”]
mount -o noasync /dev/diskls1
[/sourcecode]

Dove diskls1 è il nome del device che vogliamo montare.

Il comando vale anche per molte distribuzioni Linux.

Ora potete rimuovere la vostra penna USB senza doverla smontare 😀

Reference:

http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man8/mount.8.html

Facebook Hacker Cup 2 Round: my Card Game Solution

FacebookHackerCup 2 Round

This is my solution to the problem of Card Game, work fine for small input… but when the value of k grows (k>500 ) my code spent a lot of time.

The bottleneck it’s about the iteration to find the max in the array…

So i hope you can optimize it 😀

[sourcecode language=”python”]

import sys
import math
from collections import Counter
import re
import itertools

in_file = open(sys.argv[1],"r")
exp = in_file.read()
in_file.close()

inputFile= exp.split("\n")

index=[]
values=[]

def findsubsets(S,m):
return set(itertools.combinations(S, m))
a=[]
flavio=1
for i in range(1, len(inputFile)-1) :
values=[]
allsub=[]
if(i%2) :
# index.append(inputFile[i])
n,k=map(int,inputFile[i].split())
else :

values= map(int,inputFile[i].split())

# Optimization , not call a function
allsub=itertools.combinations(values,k)

my_sum=0

for f in allsub:

my_max=max(f)
my_sum += (my_max)

if(my_sum>=1000000007):
my_sum = my_sum -1000000007

print "Case #"+str(flavio)+": "+str(my_sum)

flavio +=1

[/sourcecode]

GitHub

https://github.com/flaviopace/FacebookHackerCup2_CardGameSolution

Facebook Hacker Cup Qualification 2013: le mie soluzioni in Python

Hacker Cup Facebook

Quest’anno sono riuscito a partecipare (me ne sono ricordato :P) all’Hacker Cup che Facebook organizza ogni anno. I problemi per le qualificazioni erano 3 e di seguito vi posto le mie soluzioni scritte in python.

Il terzo problema (Find the min) non e’ difficile, sono riuscito a risolverlo ma il tempo che ci impiega il mio algoritmo e’ molto al di sopra di quello che mette a disposizione Facebook. In realta’ bastava guardare un po output della lista che utilizzavo per memorizzare i valori per capire che da un certo punto in poi si ripeteva ( per cui non serviva tutta la potenza di calcolo che avevo immaginato 😛 ). In poche parole per gli indici della liste pari a 2k+1, i valori si ripetevano… me ne sono accorto troppo tardi ed ho finito solo i primi due step 😀

1 – Beautiful strings  (20 points)

beautiful_stringstxt.txt

outputFile.txt

[sourcecode language=”python”]import sys
import math
from collections import Counter

in_file = open(sys.argv[1],"r")
exp = in_file.read()
in_file.close()

a= exp.split("\n")

b=[]
c=[]

values=[]

d={}
u={}

for i in range(1, len(a)-1) :

b.append(a[i].lower()[::-1])

flavio=1
for i in b:
d={}

values=[]
num=26
find=1
numSum=0
for k in range(0,len(i)):

#d[str(i[k])] = i.count(i[k])
if(str(i[k]).isalpha()):# or str(i[k])==’!’):
d[str(i[k])] = i.count(i[k])

for k in range(0,len(i)):
if (str(i[k]) in d):
# print i[k] + " num "+ str(num) + " # " + str(d[i[k]])
numSum += num*d[i[k]]
values.append(d[i[k]])
del d[i[k]]
num -=1

values_sorted= sorted(values, reverse=True)

num=26
numSum =0
for item in range(len(values_sorted)):

numSum += num * values_sorted[item]
num -=1
print "Case #" + str(flavio)+ ": " +str(numSum)
flavio +=1
[/sourcecode]

2 – Balanced Smileys  (35 points)

balanced_smileystxt.txt

outputBalanced.txt

[sourcecode language=”python”]import sys
import math
from collections import Counter
import re

in_file = open(sys.argv[1],"r")
exp = in_file.read()
in_file.close()

b=[]
c=[]

values=[]

d={}
u={}

for i in range(1, len(a)-1) :

b.append(a[i].lower())

replacements = {":(",":)"}

for i in range(0,len(b)) :
#b[i]= b[i].replace(

b[i]= re.sub(r’\([^)]*\)’, "", b[i])

b[i]= b[i].replace(‘:(‘,”)
b[i]= b[i].replace(‘:)’,”)

def isBalanced(strInput):
"""Validate if an input string is having balanced bracket pairs
this includes bracket ordering. i.e a round bracket must be closed
by a round bracket. Emtpy strings are treated as balanced."""
#if strInput:
# list of all bracket kinds, in paired tuples
brackets = [ (‘(‘,’)’), (‘[‘,’]’), (‘{‘,’}’)]
# define fake constants – python does not support the concept of constants
kStart = 0
kEnd = 1
# internal stack used to push and pop brakets in the input string
stack = []

for char in strInput:
for bracketPair in brackets:
if char == bracketPair[kStart]:
stack.append(char)
elif char == bracketPair[kEnd] and len(stack) > 0 and stack.pop() != bracketPair[kStart]:
return False

if len(stack) == 0:
return True

#return False

flavio=1
for i in range(0,len(b)) :
if(isBalanced(b[i])):
print "Case #" + str(flavio) + ": YES"
else:
print "Case #" + str(flavio) + ": NO"

flavio +=1

[/sourcecode]

3 – Find the Min  (45 points)

find_the_mintxt.txt

outputFindTheMin.txt

[sourcecode language=”python”]import os, sys

f = open(sys.argv[1], ‘r’)

T = int(f.readline())

def next(ary, start):
j = start
l = len(ary)
ret = start – 1
while j < l and ary[j]:
ret = j
j += 1
return ret

for t in range(T):
n, k = map(int, f.readline().strip().split(‘ ‘))
a, b, c, r = map(int, f.readline().strip().split(‘ ‘))

m = [0] * (4 * k)
s = [0] * (k+1)
m[0] = a
if m[0] <= k:
s[m[0]] = 1
for i in xrange(1, k):
m[i] = (b * m[i-1] + c) % r
if m[i] < k+1:
s[m[i]] += 1

p = next(s, 0)
m[k] = p + 1
p = next(s, p+2)

for i in xrange(k+1, n):
if m[i-k-1] > p or s[m[i-k-1]] > 1:
m[i] = p + 1
if m[i-k-1] <= k:
s[m[i-k-1]] -= 1
s[m[i]] += 1
p = next(s, p+2)
else:
m[i] = m[i-k-1]
if p == k:
break

if p != k:
print ‘Case #%d: %d’ % (t+1, m[n-1])
else:
print ‘Case #%d: %d’ % (t+1, m[i-k + (n-i+k+k) % (k+1)])
[/sourcecode]

Riferimenti:

https://www.facebook.com/hackercup/problems.php?round=185564241586420

Correct Solution Find The Min

http://facebook.stackoverflow.com/questions/14536384/python-too-slow-of-large-inputs

 

GitHub

https://github.com/flaviopace/FacebookHackerCupQualification2013

 

Processori ARM: Gestione delle interruzione FIQ vs IRQ

Arm Processor

Devo ammettere che l’argomento di tesi che mi tocchera’ svolgere mi appassiona sempre piu’. Questo piccolo articolo ne e’ la dimostrazione ( spero di poterlo ri-utilizzare almeno in un paragrafo 😛 ).

La tesi sara’ una di quelle Top-Secret, rivoluzionarie e che cambieranno la concezione del mondo… vabbe’ lasciatemi delirare un po’ 😀

Lo scopo avra’ come obiettivo quello di rimpiazzare il firmware (un ciclo while backend/frontend) di gestione di una  memoria con un RTOS capace di gestire in maniera piu’ rigorosa ed attenta il multi-threading e gli eventi asincroni.

La scelta, per quando riguarda RTOS, credo che ricadra’ su ThreadX. Dalla lettura delle sue specifiche e guardando le sue features, sono giunto alla conclusione che sia la scelta migliore e per tale motivo ho focalizzato la mia analisi su due punti:

  • Gestione delle interruzioni ottimizzata per i processori ARM
  • Scheduler Preemption-Threshold

La maggior parte dei processori ARM supporta sia IRQ che FIQ come input interrups. FIQ viene definito come “fast” interrupt, mentre IRQ come “normal” interrupt. Entrambe le modalita’ di esecuzione hanno dei livelli di priorita’, e la modalita’ FIQ ha un livello piu’ alto rispetto a IRQ, per tale motivo se stiamo gestendo una interruzione con FIQ, essa non potra’ essere sospesa da un’altra interruzione arrivata sul canale IRQ.

Ma non e’ la sola differenza, ne esistono altre e sono molto piu’ sostanziali, rispetto alla precedente, sia a livello di architettura che a quello di gestione.

La prima sostanziale differenza e’ che la modalita’ FIQ ha dei registri in piu (7 registri in piu’ da R8-R14) mentre IRQ ne gestisce solo due ( vedi immagine successiva ), grazie ai quali si riduce l’overhead necessario alla copia dei valori di backup del processo precedente all’arrivo dell’interruzione. Per tale motivo, meno valori vengono spostati sullo stack e meno valori dovranno essere ripristinati nei registri alla fine delle gestione dell’interruzione. Il registro R14 viene usato come indirizzo di ritorno del PC(+4).

Arm Registers

Il secondo motivo per cui FIQ e’ piu’ veloce rispetto a IRQ e’ dovuto alla posizione della gestione degli interrupts all’interno del vettore delle interruzioni, il codice di gestione degli interrups FIQ e’ situato alla fine di tale vettore (0x1C). Questo fa in modo che le istruzioni possono essere eseguite direttamente da tale locazione (dato che lo stack cresce per l’alto), senza effettuare ulteriori jump ad indirizzi di memoria (cosa non vera per le interruzioni IRQ).

Vector Interrups Handler

Ad oggi, non molti RTOS e non supportano tale gestione delle interrups per un motivo semplice. La gestione delle interruzioni con FIQ puo’ essere effettuato solo scrivendo a “manella” il codice assembly.

Scrivere in C tale gestione non e’ sempre possibile, in quanto il compilatore utilizza i registri R0-R3 e non fornisce la corretta gestione del CSPR alla fine della funzione

 

Reference

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203j/Cacbhjjj.html

http://www.csie.nctu.edu.tw/~wjtsai/EmbeddedSystemDesign/Ch3-1.pdf

http://www.riveywood.com/fiqvsirq.html

Formattare Disco FAT32 con Mac OS X

Per gli amanti della Command Shell, eccovi il comando per poter formattare un qualsiasi disco utilizzando il File System FAT32 , ma allo stesso modo si potrebbe usare il FAT16 o addirittura il FAT12 ( basta specificare il giusto flag )

[sourcecode language=”bash”]
# newfs_msdos -F 32 /dev/disk2
[/sourcecode]

Python: UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u20ac’

Chiunque abbia fatto un minimo di parsing HTML tramite Python, ha incontrato almeno una volta questo fatidico errore (almeno lo spero, altrimenti sono l’unico pseudo smanettone ad averlo avuto 😛 ), soprattutto se il parsing e’ stato effettuato su pagine web in cui la valuta e’ l’Euro, dato che \u20ac rappresenta il simbolo “” (dannato Euro, anche nel mondo dell’informatica ci da’ problemi).

Il problema deriva avviene quando Python cerca di codificare il simbolo  € con un carattere ASCII.

Codifica?? Uhm?? se sei confuso come me… continua a leggere 😀

Prima di continuare facciamo un piccolo ricapitolazione di “Fondamento di Informatica”…la cosa piu’ importante da sapere e’ che: l’oggetto str in Python memorizza il suo valore come bytes, cioe’ con una sequenza di 8-bit, a.k.a string. Per questo motivo ogni carattere ASCII viene codificato in 8-bit, questo vuol dire che abbiamo a disposizione 0-255 rappresentazioni diverse… ma questo non e’ sufficiente per rappresentare i caratteri Russi, Arabi, Giapponessi… ed il nostro famoso simbolo dell’euro.

Per superare questa limitazione, Python usa unicode che memorizza il carattere con 16-bit o 32-bit dandoci la possibilita’ di rappresentare qualsiasi simbolo in qualsiasi linguaggio.

Voi direste.. Evviva! basta usare l’unicode e risolvo il problema, giusto? NO, non puoi…. ci mancherebbe che il mondo dell’informatica sia cosi’ logico e “clean” 😀

In particolare, non si puo scrivere su un file usando l’unicode, perche’ il file vuole una stringa che sia rappresentata da 8-bit. Dato che Python e’ molto “smart” cerchera’ in automatico di codificare/uniformare il carattere in unicode per la scrittura su file (o qualsiasi altro stream, come la shell), ma ahime’ c’e’ un problema… vediamo meglio con un esempio.

[sourcecode language=”python”]
>>> price_info = u’the price is \u20ac 5′
>>> type(price_info)
<type ‘unicode’>
>>> f = open(‘priceinfo.txt’,’wb’)
>>> f.write(price_info)
Traceback (most recent call last):
File "", line 1, in ?
UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u20ac’ in position 9: ordinal not in range(128)
>>>
[/sourcecode]

What happened?? Quando Python cerca di scrivere nel file “the price is € 5”, egli cerca di trasformare il valore unicode ‘\u20ac‘ in un carattere ASCII ad 8-bit… ma prima abbiamo detto che ASCII non contiene il carattere in questione… per cui… mi stai seguendo?? 😀

La soluzione e’ semplice (dopo che ho passato almeno una nottata su stackoverflow 😛 ):

[sourcecode language=”python”]
>>> price_info_enc = price_info.encode(‘utf-8’) # >> price_info_enc
‘it costs \xe2\x82\xac 5’
>>> type(price_info_enc)
<type ‘str’>
>>> f.write(price_info_enc)
>>> f.close()
[/sourcecode]

Semplice!! abbiamo codificato l’unicode tramite ‘utf-8’, il quale usa una sequenza di 3 caratteri ‘\xe2\x82\xac‘ per rappresentare il simbolo dell’Euro , in questo modo possiamo passare facilmente da ‘utf-8′ ad ASCII.

Ovviamente nel caso volessimo leggere il simbolo al contrario ( cioe’ vedere sullo schermo il simbolo dell’euro) dovremmo procedere con la decodifica dei tre caratteri in ‘utf-8′ e poi effettuare il print 😉

Ma c’e’ davvero gente che legge i miei post??? Mmmm ne dubito… ma come sempre, questo post mi servira’ da qui ad una settimana, visto che la mia memoria e’ scarsa e mi capitera’ di nuovo di imbattermi in questo problema… spero almeno di ricordarmi di aver scritto qualcosa sull’argomento 😛

Xcode 4.5 and iOS6 – linker command failed with exit code 1

Dopo l’aggiornamento a Xcode 4.5 e relativo iOS6 ho riscontrato il seguente problema quando andavo a provare la mia applicazione sul mio device (iPhone 3GS).

[sourcecode language=”bash”]

Ld /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Intermediates/DingUnisannio.build/Debug-iphoneos/DingUnisannio.build/Objects-normal/armv7/Unisannio normal armv7
cd /Users/unicondor/Documents/iosingunisannio-code/DingUnisannio
setenv IPHONEOS_DEPLOYMENT_TARGET 5.0
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk -L/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos -L/Users/unicondor/Documents/iosingunisannio-code/DingUnisannio -F/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos -filelist /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Intermediates/DingUnisannio.build/Debug-iphoneos/DingUnisannio.build/Objects-normal/armv7/Unisannio.LinkFileList -dead_strip -ObjC -fobjc-arc -fobjc-link-runtime -miphoneos-version-min=5.0 /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libTapkuLibrary.a /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libfmdb.a /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libMGSplitViewController.a /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libMWFeedParser.a -framework QuartzCore -framework Foundation -framework UIKit -framework CoreGraphics -framework MapKit -framework MessageUI -framework MediaPlayer -framework AVFoundation -framework SystemConfiguration -framework AddressBook -framework CoreLocation -framework AddressBookUI -lxml2 -lsqlite3.0 -framework CFNetwork -framework Security -framework AudioToolbox -o /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Intermediates/DingUnisannio.build/Debug-iphoneos/DingUnisannio.build/Objects-normal/armv7/Unisannio

Error:

clang: error: no such file or directory: ‘/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libTapkuLibrary.a’
clang: error: no such file or directory: ‘/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libfmdb.a’
clang: error: no such file or directory: ‘/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libMGSplitViewController.a’
clang: error: no such file or directory: ‘/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libMWFeedParser.a’

[/sourcecode]

Il problema e’ dovuto al fatto che le librerie esterne che ho usato nella mia App erano compilate solo per l’architettura armv7 e armv6. Con l’avvento dell’iPhone5 e del suo nuovo processore (armv7s) bisogna ricompilarle anche per la nuova architettura, per questo bisogna modificare il “Targets” associato ad ognuno di essere ed aggiungere l’architecture armv7s

Come viene mostrato nello screenshot in alto, bisogna solamente aggiungere questo nuovo tipo di processore armv7s in “Architettures” e “Valid Architettures” e ricompilare tutto il progetto da capo (cosi’ per tutte le librerie esterne usate dalla nostra app).

Un’ altra soluzione potrebbe essere quella di eliminare armv7s dalla “Valid Architecture” del nostro progetto, ma cosi’ facendo precludiamo la possibilita’ di poter utilizzare la nostra App sui nuovi iphone5 rilasciati da Cupertino.

Finally… iOS Developer Program Member

Rompo il letargo in cui mi ero immerso (un po’ per pigrizia un po’ per il poco tempo a disposizione) per scrivere un post che avrei dovuto scrivere da molto tempo. Finalmente mi sono iscritto all’ iOS Developer Program ( sviluppo applicazioni per iPhone/iPod/iPad).

Erano anni ( il primo libro sullo sviluppo di App iPhone lo comprai nel 2010) che volevo iniziare a sviluppare applicazione per dispositivi mobili, ma qualcosa me lo ha sempre impedito. In una cartella ho ancora la mia prima applicazione di prova: KamaTest, una semplice applicazione che in base all’immagine raffigurate una posizione del Kamasutra bisognava indovinare il numero ad essa associata 😛

Vabbe’ dubito sarebbe mai stata accettata dalla Apple, anche se le immagini che avevo scelto erano molto ‘pudiche’ grazie all’utilizzo di palloncini…

era pur sempre un ottimo inizio per iniziare a masticare un po’ di Objective-C, UIKit, Cocoa ecc… ma soprattutto per imparare qualche posizione nuova nella speranza remota che un giorno mi sarebbe tornato utile lo sforzo di memorizzazione 😀

Devo ammettere che il primo approccio verso un linguaggio di programmazione a messaggi non e’ stato un entangled  dato che ero abituato a linguaggi procedurali come il C o a linguaggi ad oggetti come Java, per cui passare dalla creazione di un oggetto like-Java: Object o = new Object() ad uno Objective-C: Object *o = [[ Object alloc] init] mi sembrava qualcosa di astruso 😛

Superate le prime avversità e grazie al PartTime ed al mio capo ( caro Ingegnere ho una menzione particolare per lei :D) ho iniziato a sviluppare seriamente un paio di App (spero presto siano pronte) sacrificando la maggior parte dell’estate.

Ho creato una Category iOS sul blog, spero di poterla riempire presto con qualche consiglio su come utilizzare certi componenti e sulle metodologie ( Pattern MVC) di programmazione da usare per lo sviluppo su Xcode.

Vi auguro una buona giornata/serata nella speranza di ritornare a scrivere con una cadenza maggiore e con più parsimonia 😀

P.s. sono interessato all’acquisto di un iPhone 3GS, l’emulatore non mi soddisfa più 😛 per cui non esitate a contattarmi nel caso vogliate venderne uno

Quanta banda richiede la visualizzazione di un video su YouTube?

E’ la classica domanda che si pone chi:

1) Ha una tariffazione a KB per navigare con il proprio cellulare

2) Sfigati che come me fanno parte dell’ Anti Digital Divide (ADSL a 640 Kbps), e si chiedono il perche’ non riescono a vedere un video a 360p su YouTube senza aspettare la bufferrizzazione dei pacchetti, che tradotto sarebbe il caricamento del video 😀 .

Partiamo andando a leggere le specifiche che ci mette direttamente a disposizione Google

Risoluzione:

YouTube usa un aspect ratio standard a 16:9, con le principali risoluzione video a:

  • 1080p: 1920×1080
  • 720p: 1280×720
  • 480p: 854×480
  • 360p: 640×360
  • 240p: 426×240
Con un fps ( frame per second) pari a 24/30, dove fps rappresenta il numero di frame (immagini) per secondo
Comparison of YouTube media encoding options
Default container FLV MP4
Video Encoding Sorenson H.263 MPEG-4 AVC (H.264)
Profile Main Baseline High
Resolution progressive 240p 270p 360p 480p 360p 720p 1080p 3072p
Resolution VGA WQVGA HVGA nHD FWVGA nHD WXGA WUXGA HXGA
Max width (pixels) 400 480 640 854 640 1280 1920 4096
Max height (pixels) 240 270 360 480 360 720 1080 3072
Bitrate[2] (Mbit/s) 0.25 0.8 0.5 0.8–1 0.5 2–2.9 3–4.3 3.5–5
Audio Encoding MP3 AAC
Channels 1–2 2 (stereo)
Sampling rate (Hz) 22050 44100
Bitrate[2] (kbit/s) 64 128 96 152 128

Questa tabella presa da Wikipedia riassume le varie risoluzioni e i relativi dettagli per ogni configurazione ( compresa la banda che a noi interessa), vediamo assieme come interpretare i numeri  per la risoluzione a 360p.

Video:

Encoding: MPEG-4 AVC (H.264) è il codec usato per la compressione del video ( vedremo più avanti a cosa serve)

Resolution: 360p è la risoluzione del video

Max width (pixel): 640 sono i pixel in larghezza del video

Max height(pixel): 360 sono i pixel in altezza del video

Bitrate (Mbit/s): 0.5 è il parametro che mi interessava, in poche parole dice che per visualizzare correttamente ( senza bufferrizzare ) il video abbiamo bisogno di almeno di una banda pari a 500 Kbps ( la mia ADSL è di poco superiore)

Audio:

Encoding: AAC è il codec audio usato

Channels: 2(stereo)  abbiamo la registrazione a due canali (stereo)

Sampling rate (Hz): 44100 è il rate usato per il campionamento dell’audio

Bitrate (kbit/s): 128 è la banda utilizzata dalla sola traccia audio.

Calcolo Bitrate (Datarate)

Con il termine Bitrate si intende il numero di kilobits per secondi (kbps) che dobbiamo trasferire/ricevere per vedere un video. Più il valore è alto, più la qualità del video migliora.

La formula per il calcolo del Bitrate è molto semplice:

Total Bitrate (bps) = altezza del frame (pixel)  x  profondità del frame (pixel)  x  frame rate (fps)  x  numero di bit per rappresentare un pixel

Nel nostro caso avremo

Bitrate(360p)= 360 x 640 x 24 x 4 = 22118400 (bps)   che sarebbero all’incirca 22 Mbps

Ma non avevamo detto che il Bitrate per la 360p era di appena 0.5 Mbps ??

Ed ecco che entra in gioco il codec che abbiamo citato prima: MPEG-4 AVC (H.264), il numero che è uscito fuori dalla formula precedente si riferisce al video “un-compressed”.

Tramite il codec MPEG-4 ( tra i migliori in circolazione) abbiamo un Compression Ratio 50:1, significa che il fattore di compressione farà si che il Bitrate uncompressed venga diviso per 50.

Per tale motivo il Bitrate del video compresso sarà uguale a:

BitRate Video Compressed = Bitrate Uncompressed / Compression Ratio MPEG-4   —>  Bitrate Compressed = 22 Mbps / 50 = 0.44 Mbps

Perfetto! ora ci troviamo con il valore in tabella 😉

Spero di aver fatto un pò di chiarezza su come calcolare il Bitrate di una sorgente Video e di come leggere correttamente i dato che ci mettono a disposizione i vari siti di Hosting Video.

Sperando che presto… anche i nostri piccoli comuni vengano raggiunti da una connessione semi-decente 🙁

Riferimenti:

http://en.wikipedia.org/wiki/YouTube

http://adterrasperaspera.com/blog/2010/05/24/approximate-youtube-bitrates

http://blog.jimmyr.com/High_Quality_on_Youtube_11_2008.php

http://neuron2.net/LVG/ratesandsizes.html

http://support.google.com/richmedia/bin/answer.py?hl=en&answer=2462489

http://www.kanecomputing.co.uk/pdfs/compression_ratio_rules_of_thumb.pdf

Tesi “La Desktop Virtualization: studio delle caratteristiche e delle sue concrete potenzialità”

Come neofita di questo blog vi allego la mia tesi appena discussa che ha il compito di illustrare questa nuova, ma non troppo, tecnologia che consente di contenere i costi nel settore IT e di garantire flessibilità nell’utilizzo worldwide (grazie al cloud) del proprio sistema operativo con dati annessi.

Se non volete entrare nel puro mondo della virtualizzazione vi consiglio di passare subito al secondo capitolo.

Pubblico la tesi urbi et orbi nella speranza di attrarre l’interesse di qualcuno (poco ci credo 🙂 ) o aiutare chi già è a conoscenza della tecnologia a comprendere meglio lo stato d’arte della tecnologia.

Ecco il pdf: La Desktop Virtualization: studio delle caratteristiche e delle sue concrete potenzialità

Riporto qui l’indice:

Sommario

Introduzione

1.     CAPITOLO     “Overview sulla Virtualizzazione di Sistemi Operativi”

1.1.       Panoramica generale

2.1.       Il Ruolo dell’Hypervisor

3.1.       Hardware Virtualization

1.3.1.  Vantaggi della Virtualizzazione

1.3.2.  Tipologie

2.     CAPITOLO     “Studio della tecnologia VDI”

2.1.       Analisi della Virtual Desktop Infrastructure

2.2.       Storia e stato dell’arte

2.3.       Vantaggi e svantaggi

3.     CAPITOLO     “Piattaforme a supporto della Desktop Virtualization”

3.1.       VmWare vSphere

3.2.       Citrix XenServer

3.3.       Microsoft Hyper-V

3.4.       Panoramica riepilogativa

4.          Conclusioni

Appendice A     “White paper Georgia State University”

Bibliografia

 

Non mi resta che augurarvi (ottimisticamente) buona lettura!