mercoledì 24 gennaio 2018

MacOS: remapping 'home' and 'end' keys for moving to beginning and end of line

It is possible to remap the 'Home' and 'End' keyboard buttons to move the cursor to the end/beginning of the current line instead of current document.

Create the file:
~/Library/KeyBindings/DefaultKeyBinding.dict
with the following content:
{
   "\UF729" = moveToBeginningOfLine:; // home 
   "\UF72B" = moveToEndOfLine:; // end 
   "$\UF729" = moveToBeginningOfLineAndModifySelection:; // shift-home 
   "$\UF72B" = moveToEndOfLineAndModifySelection:; // shift-end 
}

and restart the system.

giovedì 26 ottobre 2017

FIFO queue in Swift 4 with GCD

import Foundation


class FIFO {
   typealias DataCallback = (String) -> ()
   private var data = [String]()

   private var waitingDataList = [DataCallback]()
   private var syncQueue = DispatchQueue(label: "FIFO.sync")
   private var callBackQueue = DispatchQueue(label: "FIFO.callback", qos: .background, attributes: .concurrent)
   
   func isFreeable() -> Bool {
      return syncQueue.sync {
         waitingDataList.count == 0 && data.count == 0
      }
   }
   
   func isDataAvailable() -> Bool {
      return syncQueue.sync {
         return data.count > 0
      }
   }
   
   func enqueue(value: String) {
      syncQueue.sync {
         data.append(value)
         
         syncQueue.async {
            while self.waitingDataList.count > 0 {
               if self.data.count > 0 {
                  let callback = self.waitingDataList.remove(at: 0)
                  let val = self.data.remove(at: 0)
                  self.callBackQueue.async {
                     callback(val)
                  }
               }
               else {
                  return
               }
            }
         }
      }
   }
   
   func dequeue(onDataAvailable: @escaping DataCallback) {
      syncQueue.sync {
         if data.count > 0 {
            let val = data.remove(at: 0)
            callBackQueue.async {
               onDataAvailable(val)
            }
         }
         else {
            waitingDataList.append(onDataAvailable)
         }
      }
   }
}

let f = FIFO()
var producerFinished = false
print(" ******** START ******** ")

DispatchQueue.global(qos: .background).async {
   for i in 1...100 {
      let ti = Double(arc4random_uniform(1000)) / Double(1000)
      Thread.sleep(forTimeInterval: ti)
      print("Producing: \(i)")
      f.enqueue(value: "product \(i)")
   }
   producerFinished = true
}

DispatchQueue.global(qos: .background).async {
   while !producerFinished || f.isDataAvailable() {
      let ti = Double(arc4random_uniform(1000)) / Double(1000)
      Thread.sleep(forTimeInterval: ti)
      f.dequeue {
         print("Consuming \($0)")
      }
   }
}

repeat {
   Thread.sleep(forTimeInterval: 3.0)
} while !(f.isFreeable() && producerFinished)

print(" ******** END ******** ")

venerdì 27 novembre 2015

Configuring CLANG as default C++ compiler system wide on ubuntu

System wide C++ change on Ubuntu:

sudo apt-get install clang
sudo update-alternatives --config c++

A selector menu will be displayed: now is it possible to switch between clang and gcc.

giovedì 16 aprile 2015

Swift SSL connection

Una classe in Swift per effettuare connessioni client utilizzando un socket SSL

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//
//  SSLConnection.swift
//  MacSSLTest
//
//  Created by Michel on 16/04/15.
//  Copyright (c) 2015 DMD Medtech. All rights reserved.
//

import Foundation

protocol SSLConnectionDelegate {
    func received(msg: String)
}

class SSLConnection : NSObject, NSStreamDelegate
{
    private var hostName: CFString
    private var port: UInt32
    
    private var readStream: NSInputStream!
    private var writeStream: NSOutputStream!
    
    var delegate: SSLConnectionDelegate?
    
    private var bufferedMsg = ""
    
    init(host: CFString, port p: UInt32) {
        hostName = host
        port = p
    }
    
    func stream(stream: NSStream, handleEvent eventCode: NSStreamEvent) {
        switch (eventCode) {
        case NSStreamEvent.OpenCompleted:
            NSLog("Stream opened")
            break
        case NSStreamEvent.HasBytesAvailable:
            NSLog("HasBytesAvailable")
            var buffer = [UInt8](count: 4096, repeatedValue: 0)
            if stream == readStream {
                while readStream.hasBytesAvailable {
                    var len = readStream.read(&buffer, maxLength: buffer.count)
                    if len > 0 {
                        for i in 0...len {
                            let c = UnicodeScalar(buffer[i])
                            if c.value == 10 || c.value == 13 {
                                if count(bufferedMsg) > 0 {
                                    delegate?.received(bufferedMsg)
                                    self.bufferedMsg = ""
                                }
                            }
                            else {
                                self.bufferedMsg.append(c)
                            }
                        }
                        var output = NSString(bytes: &buffer, length: len, encoding: NSUTF8StringEncoding)
                        if output != "" {
                            NSLog("server said: %@", output!)
                        }
                    }
                }
            }
            break
        case NSStreamEvent.ErrorOccurred:
            NSLog("ErrorOccurred")
            break
        case NSStreamEvent.EndEncountered:
            NSLog("EndEncountered")
            break
        default:
            NSLog("unknown.")
        }
    }
    
    func writeString(msg: String) -> Bool {
        let messageWithFlush = msg + "\n"
        let data: NSData = messageWithFlush.dataUsingEncoding(NSUTF8StringEncoding)!
        let buf = UnsafePointer<UInt8>(data.bytes)
        println("Scrivo \(data.length) bytes...")
        let result = writeStream?.write(buf, maxLength: data.length)
        if let r = result {
            println("Result of write: \(r)")
            return r != 0
        }
        return false
    }
    
    func connect() -> Bool {
        var rs: Unmanaged<CFReadStream>?
        var ws: Unmanaged<CFWriteStream>?
        
        CFStreamCreatePairWithSocketToHost(nil, hostName as CFString, port, &rs, &ws)
        let conf = ["kCFStreamSSLAllowsExpiredCertificates" : NSNumber(bool: true),
            "kCFStreamSSLAllowsExpiredRoots" : NSNumber(bool: true),
            "kCFStreamSSLAllowsAnyRoot" : NSNumber(bool: true),
            "kCFStreamSSLValidatesCertificateChain" : NSNumber(bool: false)
        ]
        
        let retainedWs = ws?.takeRetainedValue()
        let retainedRs = rs?.takeRetainedValue()
        
        let resWP = CFWriteStreamSetProperty(retainedWs, kCFStreamPropertySSLSettings, conf as CFTypeRef)
        let resRP = CFReadStreamSetProperty(retainedRs, kCFStreamPropertySSLSettings, conf as CFTypeRef)
        
        self.readStream = retainedRs
        self.writeStream = retainedWs
        
        self.readStream.delegate = self
        self.writeStream.delegate = self
        
        self.readStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
        self.writeStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
        
        self.readStream.open()
        self.writeStream.open()
        
        return true
    }
}

venerdì 11 luglio 2014

venerdì 14 febbraio 2014

Controllare lo stato (S.M.A.R.T.) dei dischi sotto Windows

S.M.A.R.T. è l'acronimo di "Self Monitoring, Analysis and Reporting Technology", un sistema di monitoraggio per hard disk in grado di rilevare informazioni relative all'usura dei dispositivi e possibilmente prevederne il fallimento.
http://it.wikipedia.org/wiki/Self-Monitoring,_Analysis_and_Reporting_Technology

E' possibile verificare lo stato dei dischi installati su un sistema windows utilizzando delle utility di terze parti, ma per una veloce verifica è sufficiente aprire una console e digitare:
wmic
diskdrive get status
Se il sistema riporta "OK" (vi è una linea per ogni disco), significa che SMART non ha rilevato problemi sui dispositivi.

martedì 8 ottobre 2013

Postgres su ZFS

Recentemente Oracle/SUN ha presentato una nuova generazione di storage appliance ZFS, la famiglia ZS3. Questi sistemi vengono proposti come piattaforma ideale per il dispiegamento di database (Oracle, ovviamente) grazie alle caratteristiche di ZFS, quali snapshot a caldo in tempo costante, clonazione degli spazi di storage, e gestione ultra sicura dei dati.
Effettivamente ZFS ha delle caratteristiche straordinarie, ed un paper dell'università dello Utah sottolinea come gli "scenari di disastro" che si propongono più comunemente nella gestione dei database, o le esigenze di testing e sviluppo siano gestite in modo particolarmente efficiente da ZFS.
Ispirato da queste considerazioni, ho creato una virtual machine con Oracle Solaris 11.1, su cui ho creato delle zones, ed installato Postgres. Ho fatto qualche piccola prova di management e replicazione di database, disaster recovery e clonazione e devo dire che la semplicità di gestione del tutto è straordinaria.
Morale? Credo che ZFS offra delle caratteristiche così interessanti, che nessun server possa ormai farne a meno. Inoltre esistono diverse distribuzioni di unix, tra cui i vari flavor di solaris (OmniOS, Illumos, Open Indiana, ecc...) e FreeBSD che offrono sia ZFS che zones o analoghi sistemi di light virtualization, che li rendono piattaforme ideali come NAS, database server, web server o application server, sia come sistemi di sviluppo, che testing che produzione.


lunedì 4 febbraio 2013

TotalTerminal per OS X

TotalTerminal è un plugin per l'applicazione Terminal.app che consente di utilizzare una hotkey system wide per richiamare il terminale. La particolarità è che il terminale viene richiamato in stile "Quake", come in Yakuake et similia.
Plugin gratuito e altamente consigliato!

sabato 19 gennaio 2013

Appunti di C#

Per rispondere in modo stringato ad eventi:
btnSubmit.Click += (sender, e) => MessageBox.Show("You clicked save!");

Per ogni elemento di un tipo enumerabile:
List elems = new List { "a", "b" };
elems.ForEach(el => Console.WriteLine(el));
elems.ForEach(el, Console.WriteLine);


Modifica elementi GUI cross thread:
private void SetupMainStepCount(int c)
{
   if (InvokeRequired)
      BeginInvoke(new Action(SetupMainStepCount), c);
   else
      totalProgress_.Maximum = c;
}

domenica 15 luglio 2012

OS X 10.8 Mountain Lion

Il nuovo sistema operativo Apple non porta quella grande quantità di novità che si appresta invece ad introdurre Ms con la prossima release di Windows, la 8. Ma il nuovo sistema operativo è più fluido (Lion è senza dubbio più lento di Snow Leopard) e ora OS X riconquista la gradevolezza d'uso e la reattività che aveva con la 10.6; la nuova release di Safari è un bel miglioramento, finalmente si avvicina alle features delle versioni più recenti di Firefox e Chrome.
Il pannello delle notifiche, insieme ai promemoria e al nuovo 'Messaggi' (che devo ancora provare come si deve) è una piccola chicca che avvicina ancora OS X ad iOS, nel senso che chi dispone di un device iOS ed un computer OS X si ritrova sempre più integrazione tra le applicazioni.
Ancora un passo avanti per Apple.

giovedì 21 giugno 2012

SmartOS

http://smartos.org/

E' l'implementazione di Illumos da tenere sott'occhio: OpenIndiana sembra ricevere pochi (e poco significativi) aggiornamenti, e SmartOS potrebbe essere il progetto che capitalizza seriamente l'eredità di OpenSolaris.

mercoledì 15 febbraio 2012

Tribler

http://en.wikipedia.org/wiki/Tribler
http://dl.tribler.org/download.html

Da Wikipedia:

Tribler is an open source peer-to-peer client with various features for watching videos online. The user interface of Tribler is very basic and focused on ease of use, instead of including features.[2] Tribler is based on the BitTorrent protocol and uses an overlay network for content searching.[3] Due to this overlay network Tribler does not require an external website or indexing service to discover content.[4]Tribler features include: video-only searching, experimental video streaming, and an integrated video player. Tribler is available for Linux, Windows and OS X.[5]
The name Tribler stems from the word Tribe, referring to the usage of social networks in this P2P client. The first version of Tribler was a small enhancement on the ABC (Yet Another BitTorrent Client)

domenica 5 febbraio 2012

Corruzione silenziosa dei dati

Una ricerca del CERN (vecchiotta, risale al 2007) effettuata per valutare l'affidabilità dello storage dellla elevatissima mole di dati che gli esperimenti di LHC avrebbero generato ha evidenziato come le probabilità inizialmente piccole di corruzione dei dati implichino invece un significativo numero di errori data l'enorme quantità di dati che stiviamo sugli HD al giorno d'oggi (1Tb di dati significa avere qualcosa come 3 files corrotti).
Robin Harris, in questo articolo, sottilinea come le tecnologie utilizzate oggi sui sistemi mainstream (in particolare i file system) siano assolutamente inadeguati, al contrario invece dei sistemi di classe enterprise (come ad esempio ZFS).
Naturalmente i sistemi in grado di preservare la consistenza dei dati hanno un costo (elevato), pertanto la loro applicazione deve essere valutata in funzione del valore dei dati che si vogliono archiviare.

Penso che nel prossimo futuro farò un utilizzo sempre più consistente ed esteso di ZFS:

Per quanto riguarda Oracle:

mercoledì 1 febbraio 2012

FreeNAS rsync backup per windows

FreeNAS è una incarnazione appliance di FreeBSD specifica per la realizzazione di NAS. Utilizzando ZFS consente l'implementazione di uno storage economico ma estremamente affidabile.
Utilizzando un PC di fascia economica (io utilizzerei un processore a 64bit AMD, 8 o 16Gb di RAM in funzione del carico di lavoro previsto, e 4 dischi da 2Tb SATA) è possibile realizzare un efficace sistema di backup per windows per uffici o studi professionali.
Per questo esempio ho utilizzato i seguenti software:

  1. FreeNAS 8.0.3: sistema operativo appliance sulla macchina dedicata NAS
  2. DeltaCopy: una implementazione di rsync per windows


Di seguito gli step di un esempio monoutente e senza controllo di permission:

Step 1: creazione di un modulo rsync sulla macchina FreeNAS:


Step 2: abilitazione del servizio rsync:


La configurazione server side è completata.
Installando DeltaCopy, ho saltato la configurazione del modulo server, ed ho creato esclusivamente un'operazione pianificata di DeltaCopy client per il backup automatico della cartella Documenti:


Ecco come ho configurato la tipologia di backup (in particolare, il trasferimento dati viene compresso, ed ho escluso la cancellazione automatica dei files sull'archivio di backup che sono stati eliminati sull'archivio sorgente):


E' possibile configurare con grande flessibilità l'intervallo di scheduling del backup. Per quanto riguarda invece l'eventuale recupero dei dati, ho condiviso tramite CIFS share (Samba) la cartella sulla macchina NAS nella quale vengono archiviati i files dei backup, consentendo quindi il ripristino "manuale" dei files cancellati.

Naturalmente questa soluzione può essere raffinata creando utenze e politiche di permission sul NAS, consentendo quindi il backup sicuro da parte di una moltitudine di utenti. Il filesystem ZFS abilitato su FreeNAS consente inoltre snapshot del file system, consentendo quindi di mantenere con semplicità uno storico degli archivi degli utenti.

giovedì 8 dicembre 2011

Alfred app

http://www.alfredapp.com/

Quello che dovrebbe diventare spotlight! Se poi ricevesse anche i comandi vocali sotto dettatura, sarebbe veramente la rivoluzione dell'interfaccia uomo-macchina.

venerdì 25 novembre 2011

Macbook Air 11"


Piccolo, completamente silenzioso. Tastiera impeccabile, reattivo e veloce.
Gli altoparlanti integrati però fanno schifo.
Per il resto, leggerissimo, schermo dalla qualità impeccabile, touchpad con gesture multitouch spettacolare!
2 Core, 4 Thread, velocissimo per le operazioni che si possono svolgere in mobilità.

martedì 1 novembre 2011

2d barcode



Made with QREncoder

giovedì 13 ottobre 2011

venerdì 7 ottobre 2011

Stallman e il post su Steve Jobs

Nessun grande dell'informatica ha potuto esimersi dal commentare la prematura dipartita di Steve Jobs. Sono state tutte parole di grande stima, di grande ammirazione per ciò che Steve Jobs è stato ed ha dato. Ma il commento di Stallman, cazzo...
Stallman ha sempre predicato la libertà di scelta; ho sempre condiviso questa visione, sono per la possibilità di scegliere che software usare, come usarlo. Ho scelto di avere - tra le mila macchine FreeBSD, Linux, Windows che invadono la casa - anche un Mac. Due Mac. E un iPhone. E due iPod. Sono prodotti straordinari, come straordinaria è la mente di chi li ha concepiti; e non sono colorate prigioni informatiche. Sono grandi strumenti di creatività, comunicazione e intrattenimento.
Un aneddoto: ho una stampante in grado di stampare sui CD. E' attaccata ad un PC con Linux. Ho provato a stampare con GIMP, ma la stampa è sempre o un pelino a destra, o un pelino a sinistra. Certo, come utente di un software open source, ho la possibilità di scaricare i sorgenti, moddarli, risolvere il problema, e condividere la soluzione con la community. Meraviglioso. Amo questa possibilità. Ma sono un incompetente. Non ne sono capace. O non ne ho tempo, nè voglia. Allora scelgo di spendere qualche soldo, acquistare un sistema operativo commerciale, su cui c'è un driver non open per la stampante, ma che funziona. Posso stampare i miei CD.
Ho SCELTO di pagare per avere un prodotto di qualità. Ho contribuito a pagare il lavoro di qualcuno che, con il suo lavoro ha contribuito a migliorare un pochettino la qualità della mia vita, e forse di quella di altri. Questo non è un male, è una scelta. 
Jobs ha fatto qualcosa di grande per il "people's computing", ha dato - come gli altri grandi - qualcosa all'umanità.
Cazzo, ho pianto quando ho saputo di Steve... sono proprio #iSad. Caro Richard, ma tu "stay hungry, stay foolish". Sei un grande, devi continuare a contribuire a 'Free Software, Free Society'. 
Ma quoto Adrian Kingley-Hughes, quando dice: "...but this sort of outburst is uncalled for... Reading that has left me shaking my head is disbelief."

giovedì 6 ottobre 2011