sondaggio, ping, PubSub, pubsubhub, pubsubhubbub
Nel caso siate scettici, c'è un metodo nella follia sopra, nel titolo del post. Nei circoli tecnologia è improbabile che non avete sentito parlare di pubsubhubbub. In veloci pochi mesi, è stato uno dei primi tre parlato di cose. Altri due essendo la crittografia omomorfica e Google onda [ 1. ]. Tornando al post corrente - termini del titolo indicano come si ottiene il contenuto da altre persone. Seguenti dettagli diventano più chiare, se si immagina cose che accadono per quanto riguarda i blog, anche se non sono concettualmente limitato a blog.
Polling si riferisce allo scenario dove i clienti continuano a chiedere al server se qualcosa di nuovo è venuto in su. Quante volte a chiedere la disponibilità di aggiornamenti sarà sempre un problema con polling troppo frequenti o troppo poco frequenti, ma come un lettore ha sottolineato qui che una grande cosa con polling è che il server non ha bisogno di mantenere lo stato.
Ping si riferisce al caso in cui in cui pubblicare un articolo, è (o il vostro software) aggiorna anche alcuni popolari (centrale), servizi di aggiornamento. Alcuni retroscena qui .
Poi c'è PubSub che sta per publish / subscribe, uno dei primi passo per esso è stata fatta qui da Evan Henshaw-Plath e Kellan Elliott-McCrea (72 slides, ma la pena di andare attraverso). Esempio convincente hanno dato contro era questa - in una data particolare, Friendfeed strisciato Flickr 2,9 milioni di volte per ottenere le ultime foto di 45,754 utenti, di cui 6721 aveva visitato Flickr in quelle 24 ore e potrebbe essere 'potenzialmente' ha caricato una foto. Si noti che ciò che hanno proposto non era una nuova tecnologia, come fanno notare 'nuova e rivoluzionaria tecnologia vecchia 20 anni'. Se lo fate per i blog poi uno dei problemi principali con xmpp - la presenza in testa i dati, che può raggiungere il 60-70% può essere ridotto di molto.
pubsubhub sta per pubblicare hub subscribe pubsubhubbub ed è un protocollo, cui centro è un'idea di pubsubhub. Editori in cui (dicono i blogger) di aggiornare il mozzo che (può essere più di un hub, che parlano tra di loro) risiede 'da qualche parte nella nuvola', secondo il protocollo può essere spingere o tirare come da protocollo, ma il link successivo nel catena, hub al cliente (ad esempio lettori) è sempre spingere modello. Questa pagina è una buona base di partenza per pubsubhubbub, diapositive Panoramica sono buone. Sempre eloquente Anil Dash lo descrive qui come pulsante web.
Due letture collegate siano altri webhooks che sono fondamentalmente callback http. Github utilizza esso, fa paypal per le notifiche asincrone di pagamento in IPN . Lo stesso vale per molti altri. Concetto correlato è rsscloud che è di nuovo hub PubSub. Segui questo link per i dettagli.
Ci si potrebbe chiedere qual è il punto di scrivere tutte queste cose qui, ci sono due 1. Queste cose sono la pena di conoscere, almeno in minima parte e 2. Questo blog è abilitato pubsubhubbub ora tramite hub appspot utilizzando questa wordpress plug-in e dei mangimi è troppo pubsubhubbub abilitato tramite FeedBurner, link qui
-
[ 1 ]. - Buona lettura introduttiva per la crittografia completa omomorfica è questo articolo di Bruce Schneier e questo discorso è più o meno unica fonte per Google Wave.
-UPDATE - Questo messaggio spiega come l'esigenza di server pubblico per la richiamata può essere lavorato in giro per i client desktop utilizzando il gateway XMPP (per pubsubhubbub).
Un po 'di assemblaggio
Dopo aver letto questo articolo su buffer Lock Free e vedere l'uso del CAS (confrontare e scambiare), mi sentivo come la pubblicazione del codice assembly a fare lo stesso. Utilizzare caso su quello che c'era da scrivere un metodo nativo e chiamare da Java (back in 1.5, quando concomitanti strutture dati in Java erano più o meno inesistente). Senza ulteriori indugi, farò scatenare il codice su di te
. Il primo è per il CAS e la seconda è per il calcolo MCD utilizzando l'algoritmo di Euclide (questo può essere trovato in molti luoghi e tutorial e).
Compilare ed eseguire le istruzioni gcc file_name.c ; ./a.out
Confronta e Swap
# Include# Include / / Exchange - newvalue, comperand è vecchio / valore atteso / * * Funzione realmente fa la seguente cosa - se il valore a * dest è pari a OldValue poi sostituirlo con altro newvalue lasciarlo invariato: non tutti questi atomicamente * * Ci sono due opzioni per il valore di ritorno * Valore iniziale di 1.is * dest e lasciare l'onere della FXN chiama a confronto con oldval * 2. farlo qui e restituire 0 o 1, questo dovrebbe essere più efficiente ** / / * Successivamente modificare in macro * / cas int (int * dest, int OldValue, int newvalue) { printf ("(% d,% d,% d)", * dest, OldValue, newvalue); / * Int cas (int dest, int OldValue, int newvalue) {* / / * Int cas (int dest, int newvalue, int OldValue) {* / int risultato = 1 ;/ * 1 mostra che cas succeduti e 0 mostra di non aver * / / * Btw necessario impostare cc per la bandiera sovrascrivere! * / __asm__ __ volatile__ ( "Movl% 2,%% eax \ n \ t" "Movl% 3,%% ebx \ n \ t" "Movl% 0,%% ecx \ n \ t" "LOCK \ n \ t" "Cmpxchg% ebx%, (%% ecx) \ n \ t" / * deve bloccare essere sulla stessa linea * / "Jz FATTO \ n \ t" "Movl $ 0,% 1 \ n \ t" "DONE: \ n \ t" : "= M" (dest), "= g" (risultato) : "G" (OldValue), "g" (newvalue), "m" (dest) : "% Eax", "% ebx", "ECX", "cc" ); printf ("(% d,% d,% d)", * dest, OldValue, newvalue); return risultato; } / * TODO * Scrivere un altro FXN asm che mette al di sopra FXN in un ciclo while e continuare a provare meno che non riesca * / int main () { int a = 5, b = 6; int * c = (int *) malloc (sizeof (int)); * C = 6; / * Int c = 6; * / printf ("% d \ n", cas (c, b, b)); printf ("% d \ n", cas (c, b, a)); printf ("% d \ n", cas (c, a, a)); printf ("% d \ n", cas (c, b, b)); * C = 6; / * C = 5; * / printf ("valore di cambio di c * a% d \ n", * c); printf ("% d \ n", cas (c, b, b)); printf ("% d \ n", cas (c, b, a)); printf ("% d \ n", cas (c, a, a)); printf ("% d \ n", cas (c, a, b)); printf ("% d \ n", cas (c, b, a)); return 0; }
Note Formattazione - sembra evidenziatore wp sintassi è l'aggiunta di alla fine, ignorarlo.
GCD
# Includeint gcd (int a, int b) { int risultato; / * Calcola Massimo Comun utilizzando l'algoritmo di Euclide * / __asm__ volatile__ __ ("movl% 1,%% eax;" "Movl% 2,%% ebx;" "Contd: cMpl $ 0,%% ebx;" "Je FATTO;" "Xorl%% edx,%% edx;" "Idivl%% ebx;" "Movl% ebx%,%% eax;" "Movl%% edx,% ebx%;" "Jmp cont;" "DONE: movl%% eax,% 0;": "= g" (risultato): "g" (a), "g" (b) ); return risultato; } int main () { int primo, secondo; printf ("Inserire due interi:"); scanf ("% d% d", & primo, & secondo); printf ("MCD di d &%% d è% d \ n", primo, secondo, gcd (primo, secondo)); return 0; }
Cricket mondiale attende un Nuovo Ordine Mondiale
Dopo una serie che copre cinque prove e circa due mesi, frassini Inghilterra bonificate.
Parliamo della squadra vincitrice prima - il loro ordine centrale è 'medio' se non si vuole critico. Contributo Greame Swann con la mazza conterà non meno di contributo con la palla. Stuart Broad - best all rounder di avviamento non era per il test 5. Andrew Strauss era l'unico battitore coerente e Jimmy Anderson è stato l'unico bowler coerente.
Qui non si tratta di rimproverare i risultati della squadra vincente, ma di mettere in prospettiva il fatto che, nonostante tutti questi, l'Australia ha perso. dovrete pensare per pochi secondi, se richiesto di nominare loro meglio bowler. Giusto, era BW Hilfenhaus. Hauritz everbody superato le aspettative, ma non era comunque sufficiente per essere selezionati per due delle cinque prove. Sud Africa non è mai diventato un battitore mondo senza un filatore di classe mondiale, l'Australia non può sperare di rimanere senza uno uno uno abbastanza buono almeno. Magician ha lasciato il palco e non sembra più come l'arte, dimenticare la magia. Ponting si erge tra i mortali e Michael Clarke si alza molto spesso, ma che li rende una squadra con alcuni giocatori molto buona e non una squadra molto buona.
Ashes 2009 sarà ricordato per Ashes ultimi Andrew Flintoff, l'arrivo Stuart Broad come per tutte le stagioni (se si aggiunge ancora un po 'folklore Ashes to il suo inizio promettente), e uno del secolo debutto più significativo di tutti i tempi Trott, ma sarà anche ricordato come il punto in cui se e senza ma circa la supremazia in Australia sono stati infine messi a riposo, è finita. Non fraintendetemi possono ancora scoprire Mike Hussey o Stuart Clark, ma si sente il contributo di tutti i grandi del tempo quando vanno a mancare. A volte vengono a ricordare a se stessi in IPL, ma ancora non può essere sostituito. Facciamo sento benedetto per aver visto Warne, McGrath e Gilchrist giocare insieme e di essere supportato da Waughs, Ponting, Hyden, e Martin Langer.
Andando avanti, il Sud Africa rimarrà sempre una squadra molto buona, ma hanno bisogno di vincere semifinali ed essere più coerente in tutto il mondo, il Pakistan rimane enigmaticamente brillante, indiani pistole giovani probabilmente è difficile riempire le scarpe di straordinari predecessori. Sri Lanka dovrebbe continuare a mostrare scorci d'arte in mestiere. Ma, potremmo dover attendere per qualche tempo prima di avere un team tutto fuori dominante o prima di un capitano si lamenta della mancanza di concorrenza, come Steve Waugh faceva una volta.
In una nota correlata - diamo il benvenuto al ritorno di Asif, ha un sacco inferno del potenziale, speriamo di vedere un po 'di questo e anche il benvenuto Flower Andy nel awatar nuovo, proprio non si riesce a mantenere gli uomini buoni verso il basso per molto tempo.
ruby uno rivestimenti per creare hash
Ieri, mentre sta attraversando uno dei miei vecchi programmi, ho trovato questo scritto da me qualche tempo fa:
#begin magic
hash=Hash[*CGI.unescape(raw_text).split('&').map{|x| b=x.split("=");b.push(nil) if b.size==1;b}.flatten]
#end magic
Per uccidere un po 'di suspense lasciatemi rivelare che raw_text assomiglia
, A destra è stata tagliata dal riconoscimento di pagamento paypal.
Sopra la linea in caso di rottura in più parti si legge:
unescaped_array = CGI.unescape (raw_text). split ('&') unescaped_array unescaped_array.collect = {| x | b = x.split ("="); b.push (zero) se b.size == 1; b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
Facciamo singole fasi IRB:
irb (main):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&') => ["SUCCESS", "mc_gross = 10,00" "protection_eligibility = non ammissibile",, "payer_id U7PPJJ4TSJ47E =" "tassa = 0.00",, "payment_date = 09:45:30 10 Luglio 2009 PDT", "In attesa di payment_status = "] irb (main): 013:0> unescaped_array unescaped_array.map = {| x | b = x.split ("="); b.push (zero) se b.size == 1; b} => [["SUCCESSO", nil], ["mc_gross", "10.00"], ["protection_eligibility", "non ammissibile"], ["payer_id", "U7PPJJ4TSJ47E"], ["tassa", "0.00"] , ["payment_date", "09:45:30 10 luglio 2009 PDT"], ["payment_status", "In attesa"]] irb (main): 014:0> flattened_array = unescaped_array.flatten => ["SUCCESSO", nil, "mc_gross", "10.00", "protection_eligibility", "non ammissibili", "payer_id", "U7PPJJ4TSJ47E", "fiscale", "0.00", "payment_date", "09:45: 30 10 luglio 2009 PDT "," payment_status "," In attesa "] irb (main): 015:0> hash = Hash [* flattened_array] => {"Fiscale" => "0.00", "payment_status" => "attesa", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "SUCCESSO" => nil, "payment_date" = > "09:45:30 10 Lug 2009 PDT", "protection_eligibility" => "non ammissibili"}
BTW, * viene chiamato operatore splat in Ruby
Un altro modo per creare hash da 'array di coppie' è quello di utilizzare iniettare:
hash = [[1,2], [3,4]] iniettare ({}). {| risultato, elemento | result [element.first] = result [element.last]; risultato} C'è un modo più
Scrivere un ciclo, che lascio come esercizio ai lettori!
Ecco un caso po utilizzo indipendente di creare hash di array:
irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Minore, maggiore ::} => {: Minore => [1, 2, 3, 4],: maggiore => [7, 9]}
È possibile fare più cose, fondamentalmente frutto del blocco viene utilizzato come chiave per tale elemento nel hash risultante.
gmail, mutt e msmtp fix
Se si utilizza mutt e smtp per accedere a Gmail. Ecco una (brutta) notizia. Raffreddare i ragazzi di Google cambia nuovamente certificato. Oh, hai chiesto - come lo conosci? Mutt Simple iniziarono a lamentarsi certificato non valido quando si tenta di utilizzare msmpt, infame 'msmtp: verifica dei certificati TLS fallito:. Il certificato non ha una nota emittente' mi salutò sullo schermo.
Per attraversare confermare -
Basta eseguire a seguito di
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
Al posto della vecchia Server Thwate ora si ottiene in seguito nel segmento dell'emittente
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Fortunatamente soluzione è semplice, ecco cosa dovete fare su debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Dopo questo basta cambiare la seguente riga in voi ~~~V /. Msmtprc
tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem
tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem
a
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Git e Survey Impressionante
Qui ci sono due link per il rilievo di git (sistema di controllo di versione) e straordinaria (window manager) della comunità. Se si utilizza uno di questi, si prega di prendere qualche tempo per compilare il questionario. Pensate a come il modo più semplice per contribuire al software in uso.
Ecco i link:
Git - http://www.survs.com/survey?id=2PIMZGU0&channel=Q0EKJ3NF54
Impressionante - http://www.survs.com/survey?id=8BVEV3FO&channel=BH07CQ040D
Nota - (come trovato in quelle pagine, ma in fondo
) -
"Se hai attivato i cookie, potete sempre inviare sondaggio parzialmente riempita, e tornare alle vostre risposte in un momento successivo, completando in seguito."
Unione di hash in conf YAML
YAML è abbastanza comoda per la scrittura di file di configurazione. Vantaggio principale è che, si legge come file di testo. Questo funziona molto bene se il vostro file di configurazione è flat (senza gerarchia) e non ha ripetizioni.
Se il file di configurazione ha ripetizioni allora ha senso per separare gli elementi e riutilizzarli. Quello che voglio dire è questo - diciamo che il file di configurazione simile a questa:
sviluppo: input_location: common_input output_location: dev_location mail: smtp_server: Your_Server Login: login_personale password: top_secret produzione: input_location: common_input output_location: dev_location mail: smtp_server: Your_Server Login: login_personale password: top_secret
Supponendo sopra il codice in / tmp / test.yml: ecco come si può leggere in Python e Ruby
$cat readyml.py
#! / Usr / bin / env python dal pprint import pprint come pp # In debian è necessario installare python-YAML da YAML carico importazione, load_all, discarica hash = carico (open ('/ tmp / test.yml')) pp (hash ['sviluppo'])
$ cat readyml.rb
#! / Usr / bin / env ruby require 'pp' hash = YAML :: load (File.open ('/ tmp / test.yml'). leggere) pp hash ['sviluppo']
ecco un pratico uno di linea per la versione ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' o si può provare lo stesso in irb o console python.
Si noti che nel frammento di codice di cui sopra, tutto è diverso percorso di output è lo stesso in fase di sviluppo e parte della produzione. Questo è dove identificatore di nodo yml viene in soccorso. Idea è semplice avere un insieme di valori predefiniti e li modifichi in luogo diverso.
Si può scomporre come segue:
default: default e input_location: common_input output_location: dev_location mail: SENDER_NAME: mittente smtp_server: Your_Server Login: login_personale password: top_secret sviluppo: <<: * Le impostazioni predefinite produzione: <<: * Le impostazioni predefinite output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Grande, funziona (tm)!.
Probabilmente abbiamo scambiato po 'di chiarezza per un po' di magia. Ecco una piccola spiegazione: &, * e <<: e che è tag di ancoraggio può essere inteso come identificatore di nodo, * è il nodo di riferimento e <<: sta per unione hash.
Per maggiori dettagli vedere sia le specifiche YAML o wikipedia
Fin qui tutto bene ma c'è un fermo qui, queste si fonde hash non sono ricorsivi. Che cosa significa è questo: diciamo che si desidera avere altro nome del mittente per la posta in due ambienti, si può essere tentati di fare quanto segue:
default: default e input_location: common_input output_location: dev_location mail: SENDER_NAME: mittente smtp_server: Your_Server Login: login_personale password: top_secret sviluppo: <<: * Le impostazioni predefinite mail: SENDER_NAME: sender_dev produzione: <<: * Le impostazioni predefinite output_location: prod_location mail: SENDER_NAME: sender_prod
Consente di controllare
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Oops, qualcosa è andato storto, il problema di come si è detto è che l'unione hash non è ricorsiva e, mentre la fusione ha sostituito posta elettronica di default per posta di produzione che ha una sola chiave. Soluzione / lavoro intorno è quello di svolgere un livello di più:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: mittente smtp_server: Your_Server Login: login_personale password: top_secret default: default e <<: * Le common_settings mail: <<: * Le mail_defaults sviluppo: <<: * Le impostazioni predefinite produzione: <<: * Le impostazioni predefinite mail: <<: * Le mail_defaults SENDER_NAME: sender_prod
Consente di controllare di nuovo
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Hai detto di avere un altro livello di nidificazione, e si può sicuramente svolgere un livello di più, ma poi diventa un casino. Quindi, se non si tenta di scrivere la soluzione alle torri di Hanoi in un file di configurazione, è meglio restucture file di configurazione che scavare in yaml o qualcos'altro. Ma questa è la chiamata comunque.
Grandi programmatori trovare soluzioni semplici a problemi complessi
Dopo molto tempo sono riuscito a trovare la fonte per le seguenti quote-
Programmatori junior creare soluzioni semplici a problemi semplici. Programmatori senior creare soluzioni complesse a problemi complessi. Grandi programmatori trovare soluzioni semplici a problemi complessi.
E 'da un saggio chiamato Software Bella da Charles Connell.
Un altro dei miei preferiti è The Zen of Python -
Bella è meglio di brutto.
Explicit è meglio di implicito.
Semplice è meglio che complesso.
Complex è meglio di complicato.
Flat è meglio che nidificate.
Sparse è meglio di denso.
Leggibilità conta.
Casi particolari non sono abbastanza speciale per rompere le regole.
Anche se la praticità batte purezza.
Errori non dovrebbe mai passare sotto silenzio.
A meno esplicitamente a tacere.
A fronte di ambiguità, rifiutare la tentazione di indovinare.
Ci dovrebbe essere una sola e, preferibilmente, solo un evidente modo per farlo.
Anche se in questo modo può non essere ovvio in un primo momento a meno che non sei olandese.
Ora è meglio che mai.
Anche se non è spesso meglio che * proprio * ora.
Se l'applicazione è difficile da spiegare, è una cattiva idea.
Se l'applicazione è facile da spiegare, può essere una buona idea.
I namespace sono uno clacson grande idea - facciamo di più di quelli!
-------------------------
e poi c'è classico Tao della Programmazione
-
crediti come il collegato sito di
Tradotto da Geoffrey James
Trascritto da Duke Hillard
Trasmesso da Anupam Trivedi, Sajitha Tampi e Meghshyam Jagannath
Re-html-ized e curato da Kragen Sittler
-
Book 1 - The Void silenzioso
Così parlò il programmatore master:
"Quando hai imparato a strappare il codice di errore dal telaio trappola,
sarà il momento per voi di lasciare. "1,1
Qualcosa di misterioso è formata, nato nel vuoto silenzioso. Attesa solo e
immobile, che è al tempo stesso ancora e ancora in costante movimento. È la sorgente
di tutti i programmi. Non so il suo nome, quindi mi chiamano il Tao di
Programmazione.Se il Tao è grande, allora il sistema operativo è grande. Se il sistema operativo
sistema è grande, allora il compilatore è grande. Se il compilatore è grande,
quindi l'applicazione è grande. L'utente è contento e non esiste
armonia nel mondo.Il Tao della programmazione scorre lontano e ritorna al vento del mattino.
1,2
Il Tao ha dato alla luce al linguaggio macchina. Linguaggio macchina ha dato vita al
assembler.L'assembler ha dato alla luce al compilatore. Ora ci sono 10 mila
lingue.Ogni lingua ha il suo scopo, per quanto umile. Ogni lingua esprime la
Yin e Yang del software. Ogni lingua ha il suo posto all'interno del Tao.Ma non programmare in COBOL se si può evitare.
1,3
In principio era il Tao. Il Tao ha dato alla luce Spazio e Tempo.
Pertanto Spazio e tempo sono Yin e Yang di programmazione.I programmatori che non capiscono il Tao sono sempre a corto di tempo
e lo spazio per i loro programmi. I programmatori che comprendere il sempre Tao
avere abbastanza tempo e spazio per raggiungere i loro obiettivi.Come potrebbe essere altrimenti?
1,4
Il programmatore saggio è raccontata Tao e lo segue. La media
programmatore è parlato di Tao e ricerche per esso. Il programmatore folle
è raccontata Tao e ne ride.Se non fosse per ridere, non ci sarebbe Tao.
Le più alte suoni sono più difficili da ascoltare.
Andare avanti è un modo per ritirarsi.
Grande talento si manifesta in età avanzata.
Anche un programma perfetto ha ancora bug.-------------------------
Book 2 - Gli Antichi Maestri
Così parlò il programmatore master:
"Dopo tre giorni senza bisogno di programmazione, la vita diventa priva di significato."
2,1
I programmatori di un tempo erano misterioso e profondo. Non possiamo capire
i loro pensieri, così tutto ciò che facciamo è descrivono il loro aspetto.Aware, come una volpe che attraversa l'acqua. Alert, come un generale sul
campo di battaglia. Kind, come una padrona di casa saluta i suoi ospiti. Semplice, come
blocchi di legno scolpito. Opaco, come pozze nere in grotte buie.Chi può raccontare i segreti dei loro cuori e le menti?
La risposta esiste solo in Tao.
2,2
Grand Master Turing, una volta sognò di essere una macchina. Quando si svegliò
esclamò:"Non so se sto sognando Turing che io sono una macchina, o un
macchina che sto sognando Turing! "2,3
Un programmatore di computer di una società molto grande è andato a un software
conferenza e poi tornò a riferire al suo manager, dicendo: "Che tipo
di programmatori lavorano per altre aziende? Si sono comportati male e sono stati
indifferente con le apparenze. I loro capelli erano lunghi e trasandato e la loro
abiti erano rugosa e vecchia. Si è schiantato la nostra suite ospitalità e
fatto rumori volgari durante la mia presentazione. "Il direttore ha detto: "non avrei mai inviato alla conferenza. Quelli
programmatori vivono al di là del mondo fisico. Essi considerano la vita assurda, uno
coincidenza accidentale. Vanno e vengono senza conoscere limiti.
Senza una cura, vivono solo per i loro programmi. Perché dovrebbero preoccuparsi
con le convenzioni sociali?"Sono vivi all'interno del Tao."
2,4
Un novizio chiese al Maestro: "Ecco un programmatore che non progetta,
documenti o prove i suoi programmi. Ma tutti quelli che lo conoscono lo considerano uno dei
i migliori programmatori del mondo. Perché è questo? "Il Maestro risponde: "che il programmatore ha imparato il Tao. Egli è andato
al di là della necessità per la progettazione, egli non si arrabbia quando il sistema
si blocca, ma accetta l'universo senza preoccupazione. Lui è andato al di là del
necessità di documentazione, egli non è più se ne frega se qualcun altro vede il suo codice.
È andato al di là della necessità di test, ciascuno dei suoi programmi sono perfetti
dentro di sé, serena ed elegante, il loro scopo evidente. In verità,
è entrato nel mistero di Tao. "-------------------------
Book 3 - Design
Così parlò il programmatore master:
"Quando il programma viene testato, è troppo tardi per apportare modifiche al design
modifiche ".3,1
C'era una volta un uomo che è andato a una fiera computer. Ogni giorno, mentre
è entrato, l'uomo ha detto la guardia alla porta:"Sono un ladro grande, rinomato per le mie gesta di taccheggio. Essere
avvertiti, per questa fiera non scamperanno inviolata ".Questo discorso disturbato notevolmente la guardia, perché ci sono milioni di
all'interno di dollari di attrezzature informatiche, per cui l'uomo ha guardato con attenzione. Ma
l'uomo vagava da solo stand per stand, canticchiando tranquillamente a se stesso.Quando l'uomo a sinistra, la guardia lo prese in disparte e cercò i suoi vestiti, ma
non si trovava.Il giorno successivo della fiera, l'uomo tornò e rimproverò la guardia
dicendo: "Sono scappato con un bottino enorme ieri, ma oggi sarà ancora
meglio. "Così la guardia lo guardò sempre più stretto, ma inutilmente.L'ultimo giorno della fiera, la guardia poté frenare la sua curiosità
non più. "Thief Sir," disse, "Sono così perplesso, non posso vivere in
pace. Per favore mi illumini. Che cosa si sta rubando? "L'uomo sorrise. "Sono rubare le idee", ha detto.
3,2
C'era una volta un maestro programmatore che ha scritto programmi non strutturati. A
programmatore alle prime armi, cercando di imitarlo, anche cominciato a scrivere
programmi strutturati. Quando il novizio chiese al maestro di valutare la sua
il progresso, il maestro lo ha criticato per scrivere programmi non strutturati,
dicendo: "Che cosa è appropriato per il master non è appropriato per la
novizio. È necessario comprendere il Tao prima di trascendere la struttura. "3,3
C'era una volta un programmatore che è stato assegnato alla corte del signore della guerra
di Wu. Il signore della guerra ha chiesto al programmatore: "Quale è più facile da progettare: un
contabilità pacchetto o un sistema operativo? ""Un sistema operativo", rispose il programmatore.
Il signore della guerra emise una esclamazione di incredulità. "Sicuramente uno di contabilità
pacchetto è banale accanto alla complessità di un sistema operativo, "ha
ha detto."Non così," ha detto il programmatore, "quando si progetta un pacchetto di contabilità,
il programmatore funziona come un mediatore tra le persone che hanno diversi
idee: come si deve operare, come i suoi rapporti deve apparire, e come si deve
conformi alle leggi fiscali. Al contrario, un sistema operativo non è limitata
dalle apparenze esterne. Nel progettare un sistema operativo, il programmatore
cerca la semplice armonia tra macchina e idee. Questo è perché un
sistema operativo è più facile da progettare. "Il signore della guerra di Wu annuì e sorrise. "Questo è tutto il bene e bene, ma
che è più facile eseguire il debug? "Il programmatore non rispose.
3,4
Un manager è andato al programmatore maestro e gli mostrò i requisiti
documento per una nuova applicazione. Il gestore ha chiesto al maestro: "Quanto tempo
ci vorrà per progettare questo sistema, se posso assegnare cinque programmatori ad esso? ""Ci vorrà un anno", disse il maestro prontamente.
"Ma abbiamo bisogno di questo sistema immediatamente o anche prima! Quanto tempo ci
prendere se mi assegnano dieci programmatori ad esso? "Il programmatore maestro aggrottò la fronte. "In questo caso, ci vorranno due anni".
"E se posso assegnare un centinaio di programmatori ad esso?"
Il programmatore maestro scrollò le spalle. "Allora il progetto non sarà mai
completata ", ha detto.-------------------------
Book 4 - Codifica
Così parlò il programmatore master:
"Un programma ben scritto è il suo cielo proprio; un programma mal scritto è
il suo inferno. "4,1
Un programma deve essere leggera e agile, i suoi sottoprogrammi collegati come un
collana di perle. Lo spirito e gli intenti del programma dovrebbe essere mantenuto
tutto. Ci dovrebbe essere né troppo o troppo poco, né
cicli inutili né variabili inutili, né la mancanza di struttura né
rigidità schiacciante.Un programma dovrebbe seguire la `legge del minimo stupore '. Che cos'è questa legge?
È semplicemente che il programma dovrebbe sempre reagire per l'utente in modo
che lo stupisce meno.Un programma, non importa quanto complessa, dovrebbe agire come una singola unità. Il programma
dovrebbe essere diretta dalla logica all'interno piuttosto che dalle apparenze esteriori.Se il programma non in questi requisiti, sarà in uno stato di
disordine e confusione. L'unico modo per correggere questo è quello di riscrivere la
programma.4,2
Un novizio chiese al maestro: "Ho un programma che gira a volte e
interrompe a volte. Ho seguito le regole di programmazione, eppure sono
totalmente sconcertato. Qual è la ragione per questo? "Il maestro rispose: "Voi siete confusi perché non si capisce Tao.
Solo un pazzo si aspetta un comportamento razionale dai suoi simili. Perché lo fai
aspettiamo che da una macchina che gli esseri umani hanno costruito? Computer simulare
determinismo, solo Tao è perfetto."Le regole della programmazione sono transitori, solo Tao è eterno. Quindi
è necessario contemplare Tao prima di ricevere l'illuminazione. ""Ma come faccio a sapere quando ho ricevuto l'illuminazione?" Ha chiesto alla
novizio."Il vostro programma verrà eseguito correttamente," rispose il maestro.
4,3
Un maestro stava spiegando la natura del Tao di uno dei suoi novizi. "The
Tao si incarna in tutti i programmi - indipendentemente da come insignificante ", ha detto
il maestro."Il Tao in mano calcolatrice?" Chiese il novizio.
"E '," fu la risposta.
"Il Tao in un videogioco?", Ha continuato il novizio.
"E 'anche in un videogioco," disse il maestro.
"Ed è il Tao in DOS per un personal computer?"
Il maestro tossì e spostò la sua posizione leggermente. "La lezione è finita
per oggi, "ha detto.4,4
Programmatore principe Wang è stato di codifica software. Le sue dita danzavano sulla
tastiera. Il programma compilato senza un messaggio di errore, e il programma
correva come un vento leggero."Excellent!" Esclamò il Principe, "La tua tecnica è impeccabile!"
"Tecnica", disse il programmatore svolta dal suo terminale, "Quello che ho
seguire è Tao - al di là di tutte le tecniche! Quando ho iniziato a programmare I
avrebbe visto davanti a me tutto il problema in una massa. Dopo tre anni non ho
più visto questa massa. Invece, ho usato subroutine. Ma ora non vedo niente.
Tutto il mio essere esiste in un vuoto senza forma. I miei sensi sono inattivi. Il mio spirito,
libero di lavorare senza piano, segue il proprio istinto. In breve, il mio programma
scrive stessa. È vero, a volte ci sono problemi difficili. Li vedo
arrivando, rallento, guardo in silenzio. Poi ho modificare una sola riga di codice
e le difficoltà svaniscono come sbuffi di fumo inattivo. Ho quindi compilare il
programma. Mi siedo ancora e lasciare che la gioia del lavoro riempire il mio essere. Chiudo la mia
occhi per un attimo e poi si disconnette. "Il principe Wang ha detto: "Vorrei che tutti i miei programmatori sono stati così saggia!"
-------------------------
Book 5 - Manutenzione
Così parlò il programmatore master:
"Anche se un programma sia, ma tre righe, un giorno che dovrà essere
mantenuto. "5,1
A ben usato porta non ha bisogno di olio sui cardini.
Una rapida scorrevole flusso non cresce stagnante.
Né suono né pensieri possono viaggiare attraverso il vuoto.
Software marcisce se non utilizzato.Questi sono grandi misteri.
5,2
Un manager ha chiesto un programmatore quanto tempo avrebbe impiegato per terminare la
programma sul quale stava lavorando. "Sarà finito domani," la
programmatore rispose prontamente."Credo che si sia irrealistico", ha detto il manager, "In verità, come
tempo ci vorrà? "Il programmatore pensò per un momento. "Ho alcune caratteristiche che vorrei
aggiungere. Questo richiederà almeno due settimane, "disse infine."Anche questo è troppo aspettarsi", ha insistito il manager, "Io sarò
soddisfatto se semplicemente dirmi quando il programma è terminato ".Il programmatore ha accettato di questo.
Diversi anni dopo, il manager in pensione. Sulla strada per il suo ritiro
pranzo, ha scoperto il programmatore addormentato al suo terminale. Era
la programmazione per tutta la notte.5,3
Un programmatore alle prime armi era una volta assegnato a codificare un semplice pacchetto finanziario.
Il novizio ha lavorato furiosamente per molti giorni, ma quando il suo padrone recensione
il suo programma, ha scoperto che conteneva un editor a schermo, una serie di
generalizzata routine grafica, un'interfaccia intelligenza artificiale, ma
Non il minimo accenno di qualcosa finanziaria.Quando il maestro ha chiesto su questo, il novizio si indignò. "Non essere
così impazienti ", ha detto:" Io metterò la roba finanziaria alla fine. "5,4
Esiste un buon agricoltore trascurare una coltura che ha piantato?
Esiste un buon insegnante si affacciano anche lo studente più umile?
Esiste un buon padre consentire a un solo bambino a morire di fame?
Esiste un buon programmatore si rifiutano di mantenere il suo codice?-------------------------
Book 6 - Gestione
Così parlò il programmatore master:
"Lasciate che i programmatori essere molti e pochi i manager - poi tutto sarà
produttivo ".6,1
When managers hold endless meetings, the programmers write games. Quando
accountants talk of quarterly profits, the development budget is about to
be cut. When senior scientists talk blue sky, the clouds are about to roll
in.Truly, this is not the Tao of Programming.
When managers make commitments, game programs are ignored. Quando
accountants make long-range plans, harmony and order are about to be
restored. When senior scientists address the problems at hand, the
problems will soon be solved.Truly, this is the Tao of Programming.
6.2
Why are programmers non-productive?
Because their time is wasted in meetings.Why are programmers rebellious?
Because the management interferes too much.Why are the programmers resigning one by one?
Because they are burnt out.Having worked for poor management, they no longer value their jobs.
6.3
A manager was about to be fired, but a programmer who worked for him
invented a new program that became popular and sold well. As a result, the
manager retained his job.The manager tried to give the programmer a bonus, but the programmer
refused it, saying, “I wrote the program because I thought it was an
interesting concept, and thus I expect no reward.”The manager upon hearing this remarked, “This programmer, though he holds
a position of small esteem, understands well the proper duty of an
employee. Let us promote him to the exalted position of management
consultant!”But when told this, the programmer once more refused, saying, “I exist so
that I can program. If I were promoted, I would do nothing but waste
everyone's time. Can I go now? I have a program that I'm working on.”6.4
A manager went to his programmers and told them: “As regards to your work
hours: you are going to have to come in at nine in the morning and leave
at five in the afternoon.” At this, all of them became angry and several
resigned on the spot.So the manager said: “All right, in that case you may set your own
working hours, as long as you finish your projects on schedule.” The
programmers, now satisfied, began to come in at noon and work to the wee
hours of the morning.————————————————————————–
Book 7 – Corporate Wisdom
Thus spake the master programmer:
“You can demonstrate a program for a corporate executive, but you can't
make him computer literate.”7,1
A novice asked the master: “In the east there is a great tree-structure
that men call `Corporate Headquarters'. It is bloated out of shape with
vice presidents and accountants. It issues a multitude of memos, each
saying `Go, Hence!' or `Go, Hither!' and nobody knows what is meant. Every
year new names are put onto the branches, but all to no avail. How can
such an unnatural entity be?”The master replied: “You perceive this immense structure and are
disturbed that it has no rational purpose. Can you not take amusement from
its endless gyrations? Do you not enjoy the untroubled ease of programming
beneath its sheltering branches? Why are you bothered by its
uselessness?”7.2
In the east there is a shark which is larger than all other fish. Essa
changes into a bird whose wings are like clouds filling the sky. When this
bird moves across the land, it brings a message from Corporate
Headquarters. This message it drops into the midst of the programmers,
like a seagull making its mark upon the beach. Then the bird mounts on the
wind and, with the blue sky at its back, returns home.The novice programmer stares in wonder at the bird, for he understands it
not. The average programmer dreads the coming of the bird, for he fears
its message. The master programmer continues to work at his terminal, for
he does not know that the bird has come and gone.7,3
The Magician of the Ivory Tower brought his latest invention for the
master programmer to examine. The magician wheeled a large black box into
the master's office while the master waited in silence.“This is an integrated, distributed, general-purpose workstation,” began
the magician, “ergonomically designed with a proprietary operating
system, sixth generation languages, and multiple state of the art user
interfaces. It took my assistants several hundred man years to construct.
Is it not amazing?”The master raised his eyebrows slightly. “It is indeed amazing,” he
ha detto.“Corporate Headquarters has commanded,” continued the magician, “that
everyone use this workstation as a platform for new programs. Do you agree
to this?”“Certainly,” replied the master, “I will have it transported to the
data center immediately!” And the magician returned to his tower, well
pleased.Several days later, a novice wandered into the office of the master
programmer and said, “I cannot find the listing for my new program. Fare
you know where it might be?”“Yes,” replied the master, “the listings are stacked on the platform in
the data center.”7.4
The master programmer moves from program to program without fear. No
change in management can harm him. He will not be fired, even if the
project is cancelled. Perché questo? He is filled with Tao.————————————————————————–
Book 8 – Hardware and Software
Thus spake the master programmer:
“Without the wind, the grass does not move. Without software, hardware is
useless.”8.1
A novice asked the master: “I perceive that one computer company is much
larger than all others. It towers above its competition like a giant among
dwarfs. Any one of its divisions could comprise an entire business. Why is
this so?”The master replied, “Why do you ask such foolish questions? That company
is large because it is large. If it only made hardware, nobody would buy
it. If it only made software, nobody would use it. If it only maintained
systems, people would treat it like a servant. But because it combines all
of these things, people think it one of the gods! By not seeking to
strive, it conquers without effort.”8.2
A master programmer passed a novice programmer one day. The master noted
the novice's preoccupation with a hand-held computer game. “Excuse me,”
he said, “may I examine it?”The novice bolted to attention and handed the device to the master. “I
see that the device claims to have three levels of play: Easy, Medium, and
Hard,” said the master. “Yet every such device has another level of
play, where the device seeks not to conquer the human, nor to be conquered
by the human.”“Pray, great master,” implored the novice, “how does one find this
mysterious setting?”The master dropped the device to the ground and crushed it underfoot. E
suddenly the novice was enlightened.8,3
There was once a programmer who worked upon microprocessors. “Look at how
well off I am here,” he said to a mainframe programmer who came to visit,
“I have my own operating system and file storage device. I do not have to
share my resources with anyone. The software is self- consistent and
easy-to-use. Why do you not quit your present job and join me here?”The mainframe programmer then began to describe his system to his friend,
saying “The mainframe sits like an ancient sage meditating in the midst
of the data center. Its disk drives lie end-to-end like a great ocean of
machinery. The software is as multifaceted as a diamond, and as convoluted
as a primeval jungle. The programs, each unique, move through the system
like a swift-flowing river. That is why I am happy where I am.”The microcomputer programmer, upon hearing this, fell silent. But the two
programmers remained friends until the end of their days.8.4
Hardware met Software on the road to Changtse. Software said: “You are
Yin and I am Yang. If we travel together we will become famous and earn
vast sums of money.” And so the set forth together, thinking to conquer
the world.Presently they met Firmware, who was dressed in tattered rags and hobbled
along propped on a thorny stick. Firmware said to them: “The Tao lies
beyond Yin and Yang. It is silent and still as a pool of water. It does
not seek fame, therefore nobody knows its presence. It does not seek
fortune, for it is complete within itself. It exists beyond space and
time.”Software and Hardware, ashamed, returned to their homes.
————————————————————————–
Book 9 – Epilogue
Thus spake the master programmer:
“It is time for you to leave.”
————————————————————————–
If you liked these, you may also like to read worse is better
A bit of shell redirection
Here is how we normally do shell redirection
$ ./pgm.sh args >out.txt 2>err.txt
I wanted to modify it a bit and run as follows
$ ./pgm.sh args
with the requirement that output and error should go to some filename computed inside pgm.sh based on args. One illustrative case could be when date is part of args. So you would like stdout to go to say /your/directory/pgm_out_YYYYMMDD.txt 1
The problem with standard way of redirecting N>file.txt ie, associating file descriptor N to file.txt , is that it works only for the newly forked process and not for the current process.
così
$ echo hi 1>out.txt ; echo hii will send hi to out.txt but will print hii to stdout. 2
This is where exec comes to our rescue. If we add exec 1>somefile.txt then output from rest of the script will go to somefile.txt
$./test.sh will redirect hi as well as hii to out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Similarly to redirect stdout as well as stderr we'll do something like this
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Now coming back to original point of redirecting to some file from inside the shell, let's say program computed the filename in some variable OUTFILE, we could have just done exec 1>$OUTFILE
That solves the current problem. But you may like to go through following example which achieves 'random access' of file in shell script. Example is from here
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
With comments, this code is self explanatory.
-
1 It can also be done by $ ./pgm.sh args >pgm_out`date +%Y%m%d` but idea is to generate this file name based on some logic in program itself.
2 1 in 1>out.txt is redundant but it clarifies here that we are redirecting fd 1
Sony VAIO review
A month back I bought a vaio NS25G and have been planning to write this post since then. This post is primarily notes to self and review of the same. Let's get off the mark quickly -
Post has two parts -
I. Review of hardware
II. Installing debian and things to setup
Since I am not a VAIO marketing guy, I'll start other way round -
Why you may not like to buy this laptop :
- No bluetooth : believe me, in 2009 sony sells laptop without bluetooth. Sure you can use usb stuff but …
- Screen size is 15.4 inches : if you travel a lot then this laptop may not be very handy and also 2.9kg laptop is not exactly the lightest around.
- No HDMI output.
- No separate graphics card and the likes.(and no dedicated video memory
Now , why you may like to buy it :
- This laptop is a damn good desktop. What I mean is this if your requirement is like me – mostly writing programs and trying to use it 25 out of 24 hrs, then with a big screen , extremely comfortable keyboard layout with spacious palm rest and good compute power , it makes a very good combination.
- It L2 cache is 2MB and processor/memory system bus are 800MHz. I don't play games so can't say about that but for anything else but a core 2 duo processor with 2GHz freq is good, this is more than enough.
- From my usage, I see processor mostly clocks at 1.2GHz, and memory usage ~500MB. That just reinforces previous point.
- Battery backup is good, ~2 hrs is what I get.
Just one more thing here – being Sony, it will cost you a bit than other laptops with similar configuration, but that is a call u have to make.
II. Configuring linux (to run out of box ! ) :
It came pre installed with Vista( I think home premium or some fancy name like that). Dungara booted once and created another partition of 150 GB. Debian testing is what I always install and then up(down?)grade to 'unstable' sid.
Things which worked without any problem:
- X - unsurprisingly X server had not problem with starting or resolution. After one of the upgrades X refused to start though, but 'X -configure' generated a conf file which worked pretty well.
- Audio - Audio output and external mic work fine. kernel version 2.6.29-1-686 #1 SMP and alsa version 1.0.17. This is what you get from
$ lspci -v |grep Audio 00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Con1.0.17troller (rev 03) - Video cam – just works
- Hibernate to disk and back – no problem
- Wireless - in short – just works.
$ lspci |grep -i wireless
03:13:55 04:00.0 Network controller: Atheros Communications Inc. AR928X Wireless Network Adapter (PCI-Express) (rev 01) .
I think kernel 2.6..27 onwards it works with the stock kernel source. You dont have to install ndiswrapper or things like t
hat. As a note, please say good buy gnome-network-manager and welcome wicd, it is just a gui layer but behind the scene they have fixed lot of config stuff like wpasupplient and more.
What doesn't work -
- Somehow internal mic refuses to work
External mic works fine though. Latest alsa sources did not compile cleanly on debian, so for the time being I bought external Internal mic, will try to dig into it sometime in future though.
Few more misc hints for deiban:
- Package for devnagri font- ttf-indic-fonts
- Package for flash player – flashplugin-nonfree
- Entry in sources.list for mplayer and likes – deb http://www.debian-multimedia.org sid main
- Entry in sources.list for e17 – deb http://debian.alphagemini.org/ unstable main
- Entry in sources.list for skype – http://download.skype.com/linux/repos/debian/ stable non-free
oneliner for increasing and decreasing the brightness -
[root]prashant@vaio09:12 PM$ cat bin/incbrightness.sh
#!/usr/bin/env bash
echo $[1+`cat /sys/class/backlight/acpi_video0/brightness `] >/sys/class/backlight/acpi_video0/brightness
you'll have to put this in sudo though.
and to decrease change + to – and … you get the idea, right !
A bit more, if you use enlightenment(e17) here are few more hints -
[enlightenment key bindidings]
You can use following key code and mapping
mute :
KEY="Keycode-160" ACTION="exec" PARAMS="/usr/bin/amixer -q set Master toggle"
hibernate :
KEY="Keycode-165" ACTION="exec" PARAMS="sudo /usr/sbin/hibernate-disk"
volume decrease :
KEY="Keycode-174" ACTION="exec" PARAMS="/usr/bin/amixer -q set Master 2-"
volume increase:
KEY="Keycode-176" ACTION="exec" PARAMS="/usr/bin/amixer -q set Master 2+"
increase brightness :
KEY="Keycode-212" ACTION="exec" PARAMS="sudo /root/bin/incbrightness.sh"
decrease brightness
KEY="Keycode-101" ACTION="exec" PARAMS="sudo /root/bin/decbrightness.sh"



































